2013-10-15 19 views
1

即使所有通信都發生在本地計算機上,我仍有兩個基本的控制檯應用程序「通過網絡進行通信」。使用套接字對客戶端進行響應?

客戶端代碼:

public static void Main() 
{ 
    while (true) 
    { 
     try 
     { 
      TcpClient client = new TcpClient(); 

      client.Connect("127.0.0.1", 500); 

      Console.WriteLine("Connected."); 

      byte[] data = ASCIIEncoding.ASCII.GetBytes(new FeederRequest("test", TableType.Event).GetXmlRequest().ToString()); 

      Console.WriteLine("Sending data....."); 

      using (var stream = client.GetStream()) 
      { 
       stream.Write(data, 0, data.Length); 
       stream.Flush(); 

       Console.WriteLine("Data sent."); 
      } 

      client.Close(); 

      Console.ReadLine(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Error: " + e.StackTrace); 

      Console.ReadLine(); 
     } 
    } 
} 

Server代碼:

public static void Main() 
{ 
    try 
    { 
     IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); 

     Console.WriteLine("Starting TCP listener..."); 

     TcpListener listener = new TcpListener(ipAddress, 500); 

     listener.Start(); 

     Console.WriteLine("Server is listening on " + listener.LocalEndpoint); 

     while (true) 
     { 
      Socket client = listener.AcceptSocket(); 

      Console.WriteLine("\nConnection accepted."); 

      var childSocketThread = new Thread(() => 
       { 
        Console.WriteLine("Reading data...\n"); 

        byte[] data = new byte[100]; 
        int size = client.Receive(data); 
        Console.WriteLine("Recieved data: "); 
        for (int i = 0; i < size; i++) 
         Console.Write(Convert.ToChar(data[i])); 

        //respond to client 


        Console.WriteLine("\n"); 

        client.Close(); 

        Console.WriteLine("Waiting for a connection..."); 
       }); 

      childSocketThread.Start(); 
     } 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("Error: " + e.StackTrace); 
     Console.ReadLine(); 
    } 
} 

我怎樣才能改變這兩個應用程序,這樣當服務器接收到的數據,它響應客戶與某種確認?

在此先感謝!

+0

你到目前爲止嘗試過什麼樣的事情? :) –

+0

我其實在下面嘗試了@ user2880486的回答,但在這種情況下它不適用。有什麼建議麼? – Kehlan

+0

您可以使用BinaryReader/Writer來讀取和寫入流。我已經在下面發佈了一個示例。我希望它有助於回答你的問題。 – Mickey

回答

8

這裏很短的例子,我會怎麼做:

服務器:

class Server 
    { 
     static void Main(string[] args) 
     { 
      TcpListener listener = new TcpListener(IPAddress.Any, 1500); 
      listener.Start(); 

      TcpClient client = listener.AcceptTcpClient(); 

      NetworkStream stream = client.GetStream(); 

      // Create BinaryWriter for writing to stream 
      BinaryWriter binaryWriter = new BinaryWriter(stream); 

      // Creating BinaryReader for reading the stream 
      BinaryReader binaryReader = new BinaryReader(stream); 

      while (true) 
      { 
       // Read incoming information 
       byte[] data = new byte[16]; 
       int receivedDataLength = binaryReader.Read(data, 0, data.Length); 
       string stringData = Encoding.ASCII.GetString(data, 0, receivedDataLength); 

       // Write incoming information to console 
       Console.WriteLine("Client: " + stringData); 

       // Respond to client 
       byte[] respondData = Encoding.ASCII.GetBytes("respond"); 
       Array.Resize(ref respondData, 16); // Resizing to 16 byte, because in this example all messages have 16 byte to make it easier to understand. 
       binaryWriter.Write(respondData, 0, 16); 
      } 

     } 
    } 

客戶:

class Client 
    { 
     private static void Main(string[] args) 
     { 
      Console.WriteLine("Press any key to start Client"); 
      while (! Console.KeyAvailable) 
      { 
      } 


      TcpClient client = new TcpClient(); 
      client.Connect("127.0.0.1", 1500); 

      NetworkStream networkStream = client.GetStream(); 

      // Create BinaryWriter for writing to stream 
      BinaryWriter binaryWriter = new BinaryWriter(networkStream); 

      // Creating BinaryReader for reading the stream 
      BinaryReader binaryReader = new BinaryReader(networkStream); 

      // Writing "test" to stream 
      byte[] writeData = Encoding.ASCII.GetBytes("test"); 
      Array.Resize(ref writeData, 16); // Resizing to 16 byte, because in this example all messages have 16 byte to make it easier to understand. 
      binaryWriter.Write(writeData, 0, 16); 

      // Reading response and writing it to console 
      byte[] responeBytes = new byte[16]; 
      binaryReader.Read(responeBytes, 0, 16); 
      string response = Encoding.ASCII.GetString(responeBytes); 
      Console.WriteLine("Server: " + response); 


      while (true) 
      { 
      } 
     } 
    } 

我希望這有助於! ;)

0

您可以在同一個流上執行讀取和寫入操作。 您在發送所有數據後,只需撥打stream.Read在

 using (var stream = client.GetStream()) 
     { 
      stream.Write(data, 0, data.Length); 
      stream.Flush(); 

      Console.WriteLine("Data sent."); 

      stream.Read(....); //added sync read here     
     } 
上的TcpClient

MSDN文檔有一個例子,以及http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx

如果你想反饋,如報告字節#收到這樣遠,你必須使用異步方法。

0

這裏有你想要做什麼(我覺得)一個例子:

static void Main(string[] args) { 
     var server = new Task(Server); 
     server.Start(); 
     System.Threading.Thread.Sleep(10); // give server thread a chance to setup 
     try { 
      TcpClient client = new TcpClient(); 
      client.Connect("127.0.0.1", 1500); 
      Console.WriteLine("Connected."); 
      var data = new byte[100]; 
      var hello = ASCIIEncoding.ASCII.GetBytes("Hello"); 
      Console.WriteLine("Sending data....."); 
      using (var stream = client.GetStream()) { 
       stream.Write(hello, 0, hello.Length); 
       stream.Flush(); 
       Console.WriteLine("Data sent."); 
       // You could then read data from server here: 
       var returned = stream.Read(data, 0, data.Length); 
       var rec = new String(ASCIIEncoding.ASCII.GetChars(data, 0, data.Length)); 
       rec = rec.TrimEnd('\0'); 
       if (rec == "How are you?") { 
        var fine = ASCIIEncoding.ASCII.GetBytes("fine and you?"); 
        stream.Write(fine, 0, fine.Length); 
        } 
       } 
      client.Close(); 
      Console.ReadLine(); 
      } 
     catch (Exception e) { 
      Console.WriteLine("Error: " + e.StackTrace); 
      Console.ReadLine(); 
      } 
     } 

    public static void Server() { 
     try { 
      IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); 
      Console.WriteLine("*Starting TCP listener..."); 
      TcpListener listener = new TcpListener(ipAddress, 1500); // generally use ports > 1024 
      listener.Start(); 
      Console.WriteLine("*Server is listening on " + listener.LocalEndpoint); 
      Console.WriteLine("*Waiting for a connection..."); 
      while (true) { 
       Socket client = listener.AcceptSocket(); 
       while (client.Connected) { 
        Console.WriteLine("*Connection accepted."); 
        Console.WriteLine("*Reading data..."); 
        byte[] data = new byte[100]; 
        int size = client.Receive(data); 
        Console.WriteLine("*Recieved data: "); 
        var rec = new String(ASCIIEncoding.ASCII.GetChars(data, 0, size)); 
        rec = rec.TrimEnd('\0'); 
        Console.WriteLine(rec); 
        if (client.Connected == false) { 
         client.Close(); 
         break; 
         } 
        // you would write something back to the client here 
        if (rec == "Hello") { 
         client.Send(ASCIIEncoding.ASCII.GetBytes("How are you?")); 
         } 
        if (rec == "fine and you?") { 
         client.Disconnect(false); 
         } 
        } 
       } 
      listener.Stop(); 
      } 
     catch (Exception e) { 
      Console.WriteLine("Error: " + e.StackTrace); 
      Console.ReadLine(); 
      } 
     } 
    } 

請記住,通過套接字發送的數據可以到達支離破碎(在不同的數據包)。這通常不會發生在數據包很小的情況下。