java如何在数据可用时将数据获取到TCP客户端?
我正在尝试设置将打开连接并侦听新可用数据的客户端
但实际上,如果数据无法立即获得,或者延迟了一些msmy app,则会出现以下错误:
> 07-27 08:50:09.732 27021-27153/com.example.sguidetti.selfmanegment
> E/TCP Client: C: Connecting... 07-27 08:50:09.802
> 27021-27153/com.example.sguidetti.selfmanegment E/SERVER: S: ONLINE
> 07-27 08:50:09.803 27021-27153/com.example.sguidetti.selfmanegment
> E/RESPONSE FROM SERVER: S: Received Message: '3' 07-27 08:50:11.424
> 27021-27021/com.example.sguidetti.selfmanegment V/Monotype:
> SetAppTypeFace- try to flip, app = com.example.sguidetti.selfmanegment
> 07-27 08:50:11.424 27021-27021/com.example.sguidetti.selfmanegment
> V/Monotype: Typeface getFontPathFlipFont - systemFont =
> default#default 07-27 08:50:11.698
> 27021-27180/com.example.sguidetti.selfmanegment E/TCP Client: C:
> Connecting... 07-27 08:50:14.127
> 27021-27180/com.example.sguidetti.selfmanegment E/TCP: S: Error
> java.net.SocketException: recvfrom failed: ECONNRESET (Connection
> reset by peer)
> at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:592)
> at libcore.io.IoBridge.recvfrom(IoBridge.java:556)
> at java.net.PlainSocketImpl.read(PlainSocketImpl.java:485)
> at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:37)
> at
> java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237)
> at java.io.InputStreamReader.read(InputStreamReader.java:231)
> at java.io.BufferedReader.fillBuf(BufferedReader.java:145)
> at java.io.BufferedReader.readLine(BufferedReader.java:397)
> at com.example.sguidetti.selfmanegment.Client.run(Client.java:95)
> at
> com.example.sguidetti.selfmanegment.help$ConnectTask.doInBackground(help.java:127)
> at
> com.example.sguidetti.selfmanegment.help$ConnectTask.doInBackground(help.java:112)
> at 安卓.os.AsyncTask$2.call(AsyncTask.java:288)
> at java.util.concurrent.FutureTask.run(FutureTask.java:237)
> at 安卓.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
> at java.lang.Thread.run(Thread.java:818)
> Caused by: 安卓.system.ErrnoException: recvfrom failed: ECONNRESET
> (Connection reset by peer)
> at libcore.io.Posix.recvfromBytes(Native Method)
> at libcore.io.Posix.recvfrom(Posix.java:161)
> at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:250)
> at libcore.io.IoBridge.recvfrom(IoBridge.java:553)
> at java.net.PlainSocketImpl.read(PlainSocketImpl.java:485)
> at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:37)
> at
> java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237)
> at java.io.InputStreamReader.read(InputStreamReader.java:231)
> at java.io.BufferedReader.fillBuf(BufferedReader.java:145)
> at java.io.BufferedReader.readLine(BufferedReader.java:397)
> at com.example.sguidetti.selfmanegment.Client.run(Client.java:95)
> at
> com.example.sguidetti.selfmanegment.help$ConnectTask.doInBackground(help.java:127)
> at
> com.example.sguidetti.selfmanegment.help$ConnectTask.doInBackground(help.java:112)
> at 安卓.os.AsyncTask$2.call(AsyncTask.java:288)
> at java.util.concurrent.FutureTask.run(FutureTask.java:237)
> at 安卓.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
> at java.lang.Thread.run(Thread.java:818) 07-27 08:50:14.130
> 27021-27217/com.example.sguidetti.selfmanegment E/TCP Client: C:
> Connecting...
对于我的TCP客户端,我使用了下面的GUIDE,只添加了TCPClient。在mMessageListener.messageReceived(mServerMessage);
下为以下字符串mRun = false;
初始化
为了进行测试,我刚刚在我的TCP服务器中添加了一个Thread.Sleep(2000)
,它是用VB制作的,在开始时第一个数据变得很好,因为没有任何延迟之前,它将使数据可用
以下是我的活动,我第二次使用TCP客户端,如果有延迟,它会给出错误:
启动重复x次的客户端功能
public void startClient(){
for(int i=0; i< Integer.valueOf(MainActivity.SelfNumber); i++) {
new ConnectTask().execute("");
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
client.sendMessage("C" + Integer.valueOf(i+1));
}
}
这是我的AsyncTask,我解码服务器发送的文本并将其放入回收视图中
public class ConnectTask extends AsyncTask<String, String, Client> {
@Override
protected Client doInBackground(String... message) {
client = new Client(new Client.OnMessageReceived() {
@Override
public void messageReceived(String message) {
publishProgress(message);
}
});
client.run();
return null;
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
StringTokenizer stringTokenizer = new StringTokenizer(values[0], "#");
nCassa = stringTokenizer.nextToken();
status = stringTokenizer.nextToken();
receipt = stringTokenizer.nextToken();
eur = stringTokenizer.nextToken();
adapter = new SelfAdapter("CASSA SELF N° " + nCassa, "EUR: " + eur, "SC: " + receipt, help.img);
selfList.add(help.adapter);
adapterView.notifyDataSetChanged();
}
}
编辑 实际上,第一个客户端-服务器连接没有延迟,因此您可以在屏幕截图中看到,服务器从客户端获得了IP字符串,客户端获得了数字3,但是当我运行另一个活动时,我再次打开连接,服务器的响应有延迟,您可以在屏幕中看到发生了什么,当服务器必须延迟时,它也从客户端获得CS1字符串
# 1 楼答案
您将收到错误消息“ECONNRESET”,这意味着要么服务器拒绝连接,要么客户端或服务器之间的防火墙阻止连接。无论哪种情况,您都必须首先检查服务器日志。若服务器出于某种原因拒绝,您将在服务器日志中看到。如果服务器没有重置连接,这意味着在服务器上没有ur连接的条目,那么在这种情况下,您应该尝试从开放网络,如果它工作,则尝试调整防火墙以允许所需的端口或IP
您可以从链接获取帮助 Getting "SocketException : Connection reset by peer" in Android