Android TCP与C#Server的通信 – > socket.Close
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Android TCP与C#Server的通信 – > socket.Close,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2790字,纯文字阅读大概需要4分钟。
内容图文
![Android TCP与C#Server的通信 – > socket.Close](/upload/InfoBanner/zyjiaocheng/799/b7df871a8a614def80d55f67547dafb5.jpg)
我有一个Android客户端和一个C#服务器.它们通过套接字进行通信,C#服务器处理异步接收.
通信本身没有任何问题.我可以在服务器上验证客户端并相互发送消息.但是,如果我尝试通过客户端关闭套接字
socket.close();
服务器被空包发送“垃圾邮件”.一旦OutputStream关闭,就会发生这种情况.
这是我的Android客户端代码:
public void run()
{
try
{
InetAddress serverAddr = InetAddress.getByName(pServerIp);
Socket socket = new Socket(serverAddr, pServerPort);
try
{
OutputStream socketoutstr = socket.getOutputStream();
OutputStreamWriter osr = new OutputStreamWriter( socketoutstr );
bw = new BufferedWriter( osr );
InputStream socketinstr = socket.getInputStream();
InputStreamReader isr = new InputStreamReader( socketinstr );
br = new BufferedReader( isr );
User tmp = Login("SESAM", "PASSWORD");
if(tmp != null)
{
Log.e("TCP", "Login succeeded!");
user = tmp;
}
else
{
Log.e("TCP", "Login failed!");
socket.close();
}
}
catch(Exception e)
{
Log.e("TCP", "S: Error", e);
socket.close();
}
finally
{
}
}
}
这是我处理传入数据的服务器代码的一部分:
private void WaitForData()
{
try
{
WorkerCallback = new AsyncCallback(OnDataReceived);
UndefinedPacket packet = new UndefinedPacket();
socket.BeginReceive(packet.DataBuffer, 0, packet.DataBuffer.Length, SocketFlags.None, WorkerCallback, packet);
}
catch (SocketException se)
{
Console.WriteLine(se.Message);
}
}
private void OnDataReceived(IAsyncResult asyn)
{
UndefinedPacket socketData = (UndefinedPacket)asyn.AsyncState;
try
{
int CharCount = socket.EndReceive(asyn);
char[] chars = new char[CharCount];
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
String text = System.Text.Encoding.UTF8.GetString(socketData.DataBuffer);
int charLen = d.GetChars(socketData.DataBuffer, 0, CharCount, chars, 0);
String data = new String(chars);
if (data.Length > 0)
{
IClientPacket packet = PacketFactory.GetInstance(data);
server.PacketManager.AddIncomingPacket(packet, this);
}
Console.WriteLine("Received Data!");
WaitForData();
}
catch (ObjectDisposedException)
{
Console.WriteLine("OnDataReceived: Socket has been closed");
server.RemoveWorkerSocket(this);
}
catch (SocketException se)
{
if (se.ErrorCode == 10054) // Connection reset by peer
{
string msg = "Client Disconnected";
Console.WriteLine(msg);
server.RemoveWorkerSocket(this);
}
else
{
Console.WriteLine(se.Message);
server.RemoveWorkerSocket(this);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
server.RemoveWorkerSocket(this);
}
}
当我关闭Android模拟器时,我收到正确的服务器消息:“Client Disconnected”.
但是当我关闭Outputstream或者客户端OnDataReceived()上的整个套接字被反复调用时,data.length为’0′.
谢谢您的帮助!
解决方法:
它不是空的“数据包”(请注意TCP是一个流) – 从TCP套接字读取零字节意味着另一端关闭连接,所以你也应该关闭你的结束.
这里的“客户端断开连接”可能是模拟器关闭并切断所有连接时RST的结果.
内容总结
以上是互联网集市为您收集整理的Android TCP与C#Server的通信 – > socket.Close全部内容,希望文章能够帮你解决Android TCP与C#Server的通信 – > socket.Close所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。