으로 서버를 보냅니다. 네트워크 프로그래밍부터 시작합니다. 내가 한 첫 번째 작업은 문자열을 클라이언트에서 서버로 전송하는 것입니다. 이제 서버가 질문을 보내 게하고 싶습니다 (2 + 2 =?) 그리고 클라이언트가 응답합니다. 서버가 읽은 대답이 맞으면 true를 반환하고 그렇지 않으면 false를 반환합니다. 서버가 응답 할 때까지 기다리는 방법을 모르겠습니다.클라이언트 C#
//SERVER
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace ServerConnessione
{
class Program
{
static Socket serverSocket;
static List<Socket> clientList;
const int BUFFER_SIZE = 2048;
static byte[] buffer;
static void Main(string[] args)
{
buffer = new byte[BUFFER_SIZE];
clientList = new List<Socket>(); //client connessi
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //creo il socket server - 1) IP 2)comunica con un peer insieme di byte 3)tipo di protocollo
SetupServer();
}
static void SetupServer()
{
Console.Title = "Server";
Console.WriteLine("Setup server ...");
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 100));//tutti i tipi di ip, porta 100
serverSocket.Listen(1); //metto il socket in stato di attesa
serverSocket.BeginAccept(AcceptCallBack, null);//verifico se qualcuno si collega
Console.ReadLine();
}
static void AcceptCallBack(IAsyncResult ar)
{
Socket socket;
try
{
socket = serverSocket.EndAccept(ar);
}
catch (Exception)
{
return;
}
clientList.Add(socket);//si è collegato un client e lo aggiungo in lista
serverSocket.BeginAccept(AcceptCallBack, null);
byte[] data = new byte[2048];
data = Encoding.ASCII.GetBytes("Quanto fa 2 + 2 ?");
socket.BeginSend(data, 0, BUFFER_SIZE, SocketFlags.None, SendCallBack, socket);
}
private static void SendCallBack(IAsyncResult AR)
{
Socket current = (Socket)AR.AsyncState;
current.EndSend(AR);
}
private static void ReceiveCallback(IAsyncResult AR)
{
Socket current = (Socket)AR.AsyncState;
int received;
try
{
received = current.EndReceive(AR);
}
catch (SocketException)
{
Console.WriteLine("Client scollegato");
current.Close();//chiudo la connessione
clientList.Remove(current);//elimino dalla lista utenti la connessione corrente
return;
}
Console.WriteLine("Domanda mandata al client");
//current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current);//inizio a ricevere i dati
//byte[] recBuf = new byte[received];
//Array.Copy(buffer, recBuf, received);
//string text = Encoding.ASCII.GetString(recBuf);
//int result = int.Parse(text);
//if (result == Sum(2, 2))
// data = Encoding.ASCII.GetBytes("Risposta esatta");
//else
// data = Encoding.ASCII.GetBytes("Somaro!! HAI SBAGLIATO!");
//current.Send(data);
//byte[] recBuf = new byte[received];
//Array.Copy(buffer, recBuf, received); //copio dentro buffer quello che ricevo
//string text = Encoding.ASCII.GetString(recBuf);
//Console.WriteLine("Il client si chiama " + text);
////spedisco il messaggio di benvenuto
//byte[] data = Encoding.ASCII.GetBytes("Benvenuto " + text);
//current.Send(data);
//Console.WriteLine("Messaggio inviato al client");
//current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current);
}
static int Sum(int a, int b)
{
return a + b;
}
}
}
//CLIENT
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.IO;
namespace ClientConnessione
{
class Program
{
private static Socket ClientSocket;
private const int PORT = 100;
static void Main(string[] args)
{
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Console.Title = "Client";
ConnectToServer();
RequestLoop();
}
private static void ConnectToServer()
{
int attempts = 0;
while (!ClientSocket.Connected)
{
try
{
attempts += 1;
Console.WriteLine("Tentativo di connessione " + attempts);
ClientSocket.Connect(IPAddress.Loopback, PORT);
}
catch (SocketException)
{
Console.Clear();
}
}
Console.Clear();
Console.WriteLine("Connesso!");
}
private static void RequestLoop()
{
while(true)
{
ReceiverResponse();
//SendRequest();
}
}
private static void SendRequest()
{
string request = Console.ReadLine();
byte[] buffer = Encoding.ASCII.GetBytes(request);
ClientSocket.Send(buffer, 0, buffer.Length, SocketFlags.None);
}
private static void ReceiverResponse()
{
byte[] buffer = new byte[2048];
int received = ClientSocket.Receive(buffer, SocketFlags.None);
if (received == 0) return;
var data = new byte[received];
Array.Copy(buffer, data, received);
string text = Encoding.ASCII.GetString(data);
// Console.Clear();
Console.WriteLine(text);
}
}
}
를 확인할 수 있지만, 어디 선가 시작해야합니다. 어쨌든 고마워. – user3399297