2013-03-11 249 views
4

我刚刚阅读并测试了代码this伟大的文章,以了解TCP客户端和服务器。通过TCP发送文本字符串?

现在我需要做的(我希望)真的很简单的事情我需要发送一些字符串从TCP客户端到TCP服务器。

该字符串是序列化对象,事实上它是一个XML。

什么我不明白我必须在TCP客户端和TCP服务器中包含此代码。

TCP客户端:

static void Main(string[] args) 
    { 

     while (true) 
     { 
      String server = "192.168.2.175"; // args[0]; // Server name or IP address 

      // Convert input String to bytes 
      byte[] byteBuffer = Encoding.ASCII.GetBytes("1024"); // Encoding.ASCII.GetBytes(args[1]); 

      // Use port argument if supplied, otherwise default to 8080 
      int servPort = 1311; // (args.Length == 3) ? Int32.Parse(args[2]) : 8080;//7 ; 

      TcpClient client = null; 
      NetworkStream netStream = null; 

      try 
      { 
       // Create socket that is connected to server on specified port 
       client = new TcpClient(server, servPort); 

       Console.WriteLine("Connected to server... sending echo string"); 

       netStream = client.GetStream(); 

       // Send the encoded string to the server 
       netStream.Write(byteBuffer, 0, byteBuffer.Length); 

       Console.WriteLine("Sent {0} bytes to server...", byteBuffer.Length); 

       int totalBytesRcvd = 0; // Total bytes received so far 
       int bytesRcvd = 0; // Bytes received in last read 

       // Receive the same string back from the server 
       while (totalBytesRcvd < byteBuffer.Length) 
       { 
        if ((bytesRcvd = netStream.Read(byteBuffer, totalBytesRcvd, 
        byteBuffer.Length - totalBytesRcvd)) == 0) 
        { 
         Console.WriteLine("Connection closed prematurely."); 
         break; 
        } 
        totalBytesRcvd += bytesRcvd; 
       } 
       Console.WriteLine("Received {0} bytes from server: {1}", totalBytesRcvd, 
       Encoding.ASCII.GetString(byteBuffer, 0, totalBytesRcvd)); 

      } 
      catch (Exception ex) 
      { 
       // http://stackoverflow.com/questions/2972600/no-connection-could-be-made-because-the-target-machine-actively-refused-it 
       Console.WriteLine(ex.Message); 
      } 
      finally 
      { 
       if (netStream != null) 
        netStream.Close(); 
       if (client != null) 
        client.Close(); 
      } 
      Thread.Sleep(1000); 
     } 

    } 

TCP服务器

class Program 
{ 

    private const int BUFSIZE = 32; // Size of receive buffer 

    static void Main(string[] args) 
    { 


     int servPort = 1311; // (args.Length == 1) ? Int32.Parse(args[0]) : 8080; 

     TcpListener listener = null; 

     try 
     { 
      // Create a TCPListener to accept client connections 
      listener = new TcpListener(IPAddress.Any, servPort); 
      listener.Start(); 
     } 
     catch (SocketException se) 
     { 
      // IPAddress.Any 
      Console.WriteLine(se.ErrorCode + ": " + se.Message); 
      //Console.ReadKey(); 
      Environment.Exit(se.ErrorCode); 

     } 

     byte[] rcvBuffer = new byte[BUFSIZE]; // Receive buffer 
     int bytesRcvd; // Received byte count 
     for (; ;) 
     { // Run forever, accepting and servicing connections 
      // Console.WriteLine(IPAddress.Any); 
      TcpClient client = null; 
      NetworkStream netStream = null; 
      //Console.WriteLine(IPAddress.None); 

      try 
      { 
       client = listener.AcceptTcpClient(); // Get client connection 
       netStream = client.GetStream(); 
       Console.Write("Handling client - "); 

       // Receive until client closes connection, indicated by 0 return value 
       int totalBytesEchoed = 0; 
       while ((bytesRcvd = netStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0) 
       { 
        netStream.Write(rcvBuffer, 0, bytesRcvd); 
        totalBytesEchoed += bytesRcvd; 
       } 
       Console.WriteLine("echoed {0} bytes.", totalBytesEchoed); 

       // Close the stream and socket. We are done with this client! 
       netStream.Close(); 
       client.Close(); 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       netStream.Close(); 
      } 
     } 
    } 
} 
+0

我强烈建议你使用WCF之间的双向通信,而不是实现所有自己的东西。在WCF中,创建接口(服务契约)和实现(服务),并且该框架将所有通信/协议详细信息抽象出来。 – 2013-03-11 18:39:40

+0

@HighCore在我的应用程序体系结构中,我必须实现TCP Client/Server的组合。所以“客户端”以及“服务器”将具有这些组合的东西。问题:我在两台机器上安装了WCF应用程序吗?你的意思是它像“WcfService1”客户端和“WcfService2”服务器项目?所以工作站有“WcfService1”和服务器“WcfService2”? – 2013-03-11 18:42:48

+0

WCF是.Net框架的一部分。我不明白你的问题。无论如何,您必须在目标机器上安装.Net框架,否则您的代码将无法运行。 – 2013-03-11 18:45:56

回答

2

转换我的评论到一个答案:

我强烈建议你使用WCF,而不是实现所有自己的东西。在WCF中,创建接口(服务契约)和实现(服务),并且该框架将所有通信/协议详细信息抽象出来。

您可以使用WCF Duplex有服务器和客户端

2

,你给的是一个简单的 '镜子',在TCP服务器发送回客户端的数据的例子,它从它收到。

您要发送的数据位于byteBuffer变量中(我相信您当前正在发送文本“1024”)。因此,不用“1024”初始化它,你可以用你想要的XML序列化数据初始化它。

在客户端,反过来,不用将数据回送给客户端,您可以简单地在数据的服务器端执行任何操作,也就是您的XML对象。