.net网络通信不稳定

时间:2022-09-14 17:14:59
把电脑作为服务器,使用TcpListener.BeginAcceptTcpClient(receiveMsg, server)监听连接。
用android作为客户端,安卓和电脑用无线网连接。android向服务器发送消息,就是点一次发送按钮,android就向服务器建立一个连接,然后发送消息,关闭连接。
问题是:为什么经常会收到空的字符串啊?
下面是相关代码:

private static ManualResetEvent allDone = new ManualResetEvent(false);//用于控制线程是否阻塞。
NetControl netControl = new NetControl(textBox1);
netControl.BeginListen();//监听服务。

public void BeginListen()
        {
            Thread.CurrentThread.IsBackground = true;
            TcpListener server = new TcpListener(IPAddress.Any, 12121);
            server.Start();
            while (true)
            {
                allDone.Reset();
                server.BeginAcceptTcpClient(receiveMsg, server);
                allDone.WaitOne();
            }
        }

        /// <summary>
        /// 服务器侦听
        /// </summary>
        /// <param name="result"></param>
        private void receiveMsg(IAsyncResult result)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            TcpListener server = (TcpListener)result.AsyncState;
            using (TcpClient client = server.EndAcceptTcpClient(result))
            {
                using (NetworkStream stream = client.GetStream())
                {
                    int dataLength = 0;
                    string str;
                    byte[] buffer = new byte[64];
                    while (stream.DataAvailable)//没有数据就会跳过
                    {
                        dataLength = stream.Read(buffer, 0, buffer.Length);
                        str = Encoding.ASCII.GetString(buffer, 0, dataLength);
                    }
                    string msg = Encoding.ASCII.GetString(buffer);
                    textBox.Text +="\r\n"+msg;//显示出接收到的消息
                }
                allDone.Set();
            }
            textBox.Text += "\r\n-----";
        }


这是android相关代码:

public void sendMsg(String msg) throws IOException
{
InetAddress serverAddress=InetAddress.getByName("192.168.43.189");
Socket client=new Socket(serverAddress,12121);
PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())),true);
out.println(msg);
out.close();
System.out.println("end");
}

3 个解决方案

#1


这个不是网络通信不稳定,是你程序设计有问题。空字符串有可能是你建立连接或者断开连接时接收到的消息?
这样试试:
while (true)
            {
                allDone.WaitOne();
                server.BeginAcceptTcpClient(receiveMsg, server);
            }
bool flag = false;
while (stream.DataAvailable)//没有数据就会跳过
                    {
                        dataLength = stream.Read(buffer, 0, buffer.Length);
                        str = Encoding.ASCII.GetString(buffer, 0, dataLength);
                        flag  = true;
                    }
if(flag)
{
string msg = Encoding.ASCII.GetString(buffer);
                    textBox.Text +="\r\n"+msg;//显示出接收到的消息
}

#2


引用 1 楼 yfqvip 的回复:
这个不是网络通信不稳定,是你程序设计有问题。空字符串有可能是你建立连接或者断开连接时接收到的消息?
这样试试:
while (true)
            {
                allDone.WaitOne();
                server.BeginAcceptTcpClient(receiveMsg, server);
          ……

按照你这样试过了,不行的。我觉得没必要使用flag=false,因为我不是要接收到空数据就丢弃,而是避免:android发送的是字符串,我接收到的却是空字符串。

而且,我以前C#对C#用socket通信时,也会这样。服务器和客户端在一台电脑上测试很正常,然后跨互联网测试数据就传不过去了。

#3


TCP 是基于流的协议。。必须要自行处理粘在一起的 or 从中切开的封包。

#1


这个不是网络通信不稳定,是你程序设计有问题。空字符串有可能是你建立连接或者断开连接时接收到的消息?
这样试试:
while (true)
            {
                allDone.WaitOne();
                server.BeginAcceptTcpClient(receiveMsg, server);
            }
bool flag = false;
while (stream.DataAvailable)//没有数据就会跳过
                    {
                        dataLength = stream.Read(buffer, 0, buffer.Length);
                        str = Encoding.ASCII.GetString(buffer, 0, dataLength);
                        flag  = true;
                    }
if(flag)
{
string msg = Encoding.ASCII.GetString(buffer);
                    textBox.Text +="\r\n"+msg;//显示出接收到的消息
}

#2


引用 1 楼 yfqvip 的回复:
这个不是网络通信不稳定,是你程序设计有问题。空字符串有可能是你建立连接或者断开连接时接收到的消息?
这样试试:
while (true)
            {
                allDone.WaitOne();
                server.BeginAcceptTcpClient(receiveMsg, server);
          ……

按照你这样试过了,不行的。我觉得没必要使用flag=false,因为我不是要接收到空数据就丢弃,而是避免:android发送的是字符串,我接收到的却是空字符串。

而且,我以前C#对C#用socket通信时,也会这样。服务器和客户端在一台电脑上测试很正常,然后跨互联网测试数据就传不过去了。

#3


TCP 是基于流的协议。。必须要自行处理粘在一起的 or 从中切开的封包。