Java android客户端套接字在断开套接字连接后才获得响应
我的android应用程序在套接字关闭之前不会接收数据(通常我会强制关闭服务器,然后客户端会收到响应) 一些代码供任何想要查看的人使用: -服务器Java android客户端套接字在断开套接字连接后才获得响应,java,c#,android,sockets,Java,C#,Android,Sockets,我的android应用程序在套接字关闭之前不会接收数据(通常我会强制关闭服务器,然后客户端会收到响应) 一些代码供任何想要查看的人使用: -服务器 private void receiveCallback(IAsyncResult ar) { Socket socket = (Socket)ar.AsyncState; int received = socket.EndReceive(ar); byte[] dataBuf = new by
private void receiveCallback(IAsyncResult ar)
{
Socket socket = (Socket)ar.AsyncState;
int received = socket.EndReceive(ar);
byte[] dataBuf = new byte[received];
Array.Copy(_buffer, dataBuf, received);
string text = Encoding.ASCII.GetString(dataBuf);
form.logMessage("Recieved: " + text);
//Check commands
if (!String.IsNullOrWhiteSpace(text))
{
sendText(form.onCommand(text), socket);
}
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket);
}
public void sendText(string message,Socket socket)
{
byte[] data = Encoding.ASCII.GetBytes(message);
form.logMessage("Sending: " + message);
socket.NoDelay = true;
socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(sendCallback), socket);
form.logMessage("Sent!");
socket.NoDelay = false;
}
-客户
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG, "Clicked send button!");
String babam = ((EditText)findViewById(R.id.requestText)).getText().toString();
Log.i(TAG,"Going to send: " + babam);
new Thread(new ResponseThread(babam)).start();
}
});
public class ResponseThread implements Runnable{
String toSend;
public ResponseThread(String toSend)
{
this.toSend = toSend;
}
@Override
public void run() {
try {
PrintStream stream = new PrintStream(socket.getOutputStream(),true);
stream.println(toSend);
Log.i(TAG, "Sent request!");
Log.i(TAG, "Waiting for reponse...");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String response = in.readLine();
Log.i(TAG,"Response: " + response);
statusText.setText(response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
08-09 20:48:29.133 12801-12801/com.artish1.sockettest I/Client﹕ Clicked send button!
08-09 20:48:29.133 12801-12801/com.artish1.sockettest I/Client﹕ Going to send: roll
08-09 20:48:29.158 12801-13029/com.artish1.sockettest I/Client﹕ Sent request!
08-09 20:48:29.158 12801-13029/com.artish1.sockettest I/Client﹕ Waiting for reponse...
08-09 20:49:04.371 12801-12801/com.artish1.sockettest I/Client﹕ Clicked send button!
08-09 20:49:04.371 12801-12801/com.artish1.sockettest I/Client﹕ Going to send: roll
08-09 20:49:04.382 12801-13280/com.artish1.sockettest I/Client﹕ Sent request!
08-09 20:49:04.382 12801-13280/com.artish1.sockettest I/Client﹕ Waiting for reponse...
08-09 20:49:37.399 12801-13029/com.artish1.sockettest I/Client﹕ Response: Rolled!YepRolled!Yep
08-09 20:49:37.400 12801-13280/com.artish1.sockettest I/Client﹕ Response: null
以下是我的一些输出:
-服务器
[8/9/2015 9:04:28 PM] Recieved: roll
[8/9/2015 9:04:28 PM] Rolled dice! 6 + 4 = 10
[8/9/2015 9:04:28 PM] Sending: Rolled!
[8/9/2015 9:04:28 PM] Sent!
[8/9/2015 9:04:28 PM] Recieved:
[8/9/2015 9:04:29 PM] Recieved: roll
[8/9/2015 9:04:29 PM] Rolled dice! 5 + 1 = 6
[8/9/2015 9:04:29 PM] Sending: Rolled!
[8/9/2015 9:04:29 PM] Sent!
[8/9/2015 9:04:29 PM] Recieved:
-客户
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG, "Clicked send button!");
String babam = ((EditText)findViewById(R.id.requestText)).getText().toString();
Log.i(TAG,"Going to send: " + babam);
new Thread(new ResponseThread(babam)).start();
}
});
public class ResponseThread implements Runnable{
String toSend;
public ResponseThread(String toSend)
{
this.toSend = toSend;
}
@Override
public void run() {
try {
PrintStream stream = new PrintStream(socket.getOutputStream(),true);
stream.println(toSend);
Log.i(TAG, "Sent request!");
Log.i(TAG, "Waiting for reponse...");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String response = in.readLine();
Log.i(TAG,"Response: " + response);
statusText.setText(response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
08-09 20:48:29.133 12801-12801/com.artish1.sockettest I/Client﹕ Clicked send button!
08-09 20:48:29.133 12801-12801/com.artish1.sockettest I/Client﹕ Going to send: roll
08-09 20:48:29.158 12801-13029/com.artish1.sockettest I/Client﹕ Sent request!
08-09 20:48:29.158 12801-13029/com.artish1.sockettest I/Client﹕ Waiting for reponse...
08-09 20:49:04.371 12801-12801/com.artish1.sockettest I/Client﹕ Clicked send button!
08-09 20:49:04.371 12801-12801/com.artish1.sockettest I/Client﹕ Going to send: roll
08-09 20:49:04.382 12801-13280/com.artish1.sockettest I/Client﹕ Sent request!
08-09 20:49:04.382 12801-13280/com.artish1.sockettest I/Client﹕ Waiting for reponse...
08-09 20:49:37.399 12801-13029/com.artish1.sockettest I/Client﹕ Response: Rolled!YepRolled!Yep
08-09 20:49:37.400 12801-13280/com.artish1.sockettest I/Client﹕ Response: null
请注意,所有响应是如何同时出现的,此时我将强制关闭服务器
我对套接字没有太多经验,但我一直在看其他关于这方面的帖子,有人说是为了强制刷新请求。这样我就可以在客户机上获得它,但我已经通过服务器发送了它(通过输出得到确认)
有人想喝一杯吗?尝试在邮件末尾添加一个
\n
。也不要将“NoDelay”设置为false。您正在执行异步发送。好的,删除了“节点延迟为false”。我应该在哪封邮件中添加\n?这里有很多东西,我都困了,害怕犯一些愚蠢的错误。安卓客户端正在做一个Readline
;因此,发送给它的所有消息必须以换行符结尾。如果没有,客户端将只是旋转它的轮子,直到套接字关闭。嗯,它似乎不起作用。我按照你的要求在末尾添加了一个/n,但是我收到了相同的结果<代码>消息+=“\\n”;表格.日志信息(“发送:+信息”)代码>,但仍未按时收到<代码>响应:滚!滚代码>尝试消息+=“\n”代码>换行符的单反斜杠。哦,我忘了告诉你我已经尝试了单反斜杠和双反斜杠。你发送消息后是否尝试刷新套接字?