【问题标题】:Could not send second message over TCP/IP无法通过 TCP/IP 发送第二条消息
【发布时间】:2016-05-31 20:34:34
【问题描述】:

我正在尝试使用 TCPClientTCPListner 类在 c# 应用程序中通过 TCP/IP 发送消息

以下是我从 codeproject 网站获得的代码。

客户 code written over btn click

try
        {
            TcpClient tcpclnt = new TcpClient();
            Console.WriteLine("Connecting.....");

            tcpclnt.Connect("192.168.0.102", 8001);
            // use the ipaddress as in the server program

            Console.WriteLine("Connected");
            //Console.Write("Enter the string to be transmitted : ");

            String str = textBox1.Text;
            Stream stm = tcpclnt.GetStream();

            ASCIIEncoding asen = new ASCIIEncoding();
            byte[] ba = asen.GetBytes(str);
            Console.WriteLine("Transmitting.....");

            stm.Write(ba, 0, ba.Length);

            byte[] bb = new byte[100];
            int k = stm.Read(bb, 0, 100);

            for (int i = 0; i < k; i++)
                Console.Write(Convert.ToChar(bb[i]));


            tcpclnt.Close();
        }

        catch (Exception ex)
        {
            Console.WriteLine("Error..... " + ex.Message);
        }

服务器 code written on form_load

try
        {
            IPAddress ipAd = IPAddress.Parse("192.168.0.102");
            // use local m/c IP address, and 
            // use the same in the client

            /* Initializes the Listener */
            TcpListener myList = new TcpListener(ipAd, 8001);

            /* Start Listeneting at the specified port */
            myList.Start();

            Console.WriteLine("The server is running at port 8001...");
            Console.WriteLine("The local End point is  :" +
                              myList.LocalEndpoint);
            Console.WriteLine("Waiting for a connection.....");

            Socket s = myList.AcceptSocket();
            Console.WriteLine("Connection accepted from " + s.RemoteEndPoint);

            byte[] b = new byte[100];
            int k = s.Receive(b);
            Console.WriteLine("Recieved...");
            string str = string.Empty;
            for (int i = 0; i < k; i++)
            {
                Console.Write(Convert.ToChar(b[i]));
                str = str + Convert.ToChar(b[i]);

            }
            label1.Text = str;
            ASCIIEncoding asen = new ASCIIEncoding();
            s.Send(asen.GetBytes("The string was recieved by the server."));
            Console.WriteLine("\nSent Acknowledgement");
            /* clean up */
            s.Close();
           // myList.Stop();

        }

client 上,我正在通过tcp 发送写在文本框中的字符串,server 很好地收到了它。

但是当我尝试发送另一个字符串时,它会在没有任何exception 的情况下失败,并且客户端应用程序会无限期挂起。

这里有什么问题?

【问题讨论】:

  • 虽然这不是您的主要问题:TCP/IP 是基于流的,而不是基于消息的。像这样的代码存在致命缺陷:您可能永远不会假设对Receive 的特定调用会接收特定数量的字节。您可以确定的是,如果客户端写入N 字节,Receive 调用的某种组合最终将接收所有N 字节。这样的代码可以在本地套接字上的测试设置中正常工作,但在实际网络中工作时会严重失败。

标签: c# tcpclient tcplistener


【解决方案1】:

服务器应始终处于侦听模式,即服务器代码应处于 while 循环中,以便它可以连续接受客户端。您的服务器将接受一个客户端,然后自行关闭。因此,如果您单击客户端的按钮,一个新的客户端会尝试连接到服务器,但现在服务器将不可用。

【讨论】:

    【解决方案2】:

    查看您提供的代码,服务器仅尝试从客户端读取1条消息,因此需要循环读取来自客户端的多条传入消息,处理消息并发送响应然后获取更多消息。

    另请注意,服务器目前只希望一个客户端连接,处理该客户端然后关闭。

    客户端的设置与示例中的基本相同,因此您不能在不修改另一个的情况下修改一个的工作方式。

    【讨论】:

      猜你喜欢
      • 2016-05-12
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      相关资源
      最近更新 更多