有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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字符串

enter image description here


共 (1) 个答案

  1. # 1 楼答案

    您将收到错误消息“ECONNRESET”,这意味着要么服务器拒绝连接,要么客户端或服务器之间的防火墙阻止连接。无论哪种情况,您都必须首先检查服务器日志。若服务器出于某种原因拒绝,您将在服务器日志中看到。如果服务器没有重置连接,这意味着在服务器上没有ur连接的条目,那么在这种情况下,您应该尝试从开放网络,如果它工作,则尝试调整防火墙以允许所需的端口或IP

    您可以从链接获取帮助 Getting "SocketException : Connection reset by peer" in Android