用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;//显示出接收到的消息
}
这样试试:
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
按照你这样试过了,不行的。我觉得没必要使用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;//显示出接收到的消息
}
这样试试:
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
按照你这样试过了,不行的。我觉得没必要使用flag=false,因为我不是要接收到空数据就丢弃,而是避免:android发送的是字符串,我接收到的却是空字符串。
而且,我以前C#对C#用socket通信时,也会这样。服务器和客户端在一台电脑上测试很正常,然后跨互联网测试数据就传不过去了。
#3
TCP 是基于流的协议。。必须要自行处理粘在一起的 or 从中切开的封包。