Android与C#服务器的TCP通信->;插座,关上
我有一个Android客户端和一个C#服务器。它们通过套接字进行通信,C#服务器处理异步接收 通信本身没有问题。我可以在服务器上验证客户端,并相互发送消息。但是如果我试图通过关闭客户端上的套接字Android与C#服务器的TCP通信->;插座,关上,c#,java,android,sockets,tcp,C#,Java,Android,Sockets,Tcp,我有一个Android客户端和一个C#服务器。它们通过套接字进行通信,C#服务器处理异步接收 通信本身没有问题。我可以在服务器上验证客户端,并相互发送消息。但是如果我试图通过关闭客户端上的套接字 socket.close(); 服务器收到“垃圾邮件”和空数据包。一旦OutputStream关闭,就会发生这种情况 这是我的Android客户端代码: public void run() { try { InetAddress
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 emulator时,我得到了正确的服务器消息:“Client Disconnected”
但当我关闭Outputstream或客户端上的整个套接字时,OnDataReceived()会以data.length为“0”的速度重复调用
谢谢你的帮助 它不是空的“数据包”(请注意,TCP是一个流)——从TCP套接字读取零字节意味着另一端关闭了连接,因此您也应该关闭自己的一端
“客户端已断开连接”这可能是仿真器出现故障并切断所有连接时的结果。您是否可以尝试使用真实设备,以便从可能的原因列表中排除仿真器?也可以尝试在关闭套接字之前关闭输入和输出流。好的,但是如果没有,为什么会调用“OnDataReceived”发送数据?正是为了告诉您必须关闭连接。