2017-11-24 1 views
0

으로 서버를 보냅니다. 네트워크 프로그래밍부터 시작합니다. 내가 한 첫 번째 작업은 문자열을 클라이언트에서 서버로 전송하는 것입니다. 이제 서버가 질문을 보내 게하고 싶습니다 (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); 
     } 
    } 
} 

답변

0

이 scenerio를 달성하려는 것이 목표라면,이를위한 프로토콜을 구축 할 수 있습니다.

클라이언트 -> 준비 중
서버 -> 2 + 2 =? > 4
서버 - -> 사실

하지만 서버가 다음 요청을 보낼 때마다 응답 통신 및 클라이언트를 시작하려면 서버가 필요 경우 변경 역할과 다른 연결을 엽니의 가장 좋은 방법 (클라이언트
클라이언트 서버 소켓 열기, 서버는 클라이언트 소켓 열기). 따라서 클라이언트와 서버는 각각 메시지를 보내고 독립적으로 응답을받을 수 있습니다.

당신은 스캔들 아닌 나를 위해이
Use one Socket to send and recieve data

+0

를 확인할 수 있지만, 어디 선가 시작해야합니다. 어쨌든 고마워. – user3399297