Java TCP客户端套接字挂起服务器套接字

Java TCP客户端套接字挂起服务器套接字,java,android,sockets,Java,Android,Sockets,我正在开发一个TCP/IP套接字程序来连接我的Android手机和我的服务器PC 我创建了一个简单的echo程序 连接到服务器后,我可以发送注册命令,而不会出现任何问题/延迟/挂起 在使用缓冲读取器接收数据后,我将数据传递到主活动中的函数,实习生通过写入OutputStream将数据发送到服务器。当我的客户端发送此数据时,我的服务器挂起忙等待->我的猜测,但5秒后它恢复正常操作并成功接收数据。甚至我的工作线程AsyncTask也挂起,这很明显,因为与其他消息相比,它们在Logcat中显示消息的时

我正在开发一个TCP/IP套接字程序来连接我的Android手机和我的服务器PC

我创建了一个简单的echo程序

连接到服务器后,我可以发送注册命令,而不会出现任何问题/延迟/挂起

在使用缓冲读取器接收数据后,我将数据传递到主活动中的函数,实习生通过写入OutputStream将数据发送到服务器。当我的客户端发送此数据时,我的服务器挂起忙等待->我的猜测,但5秒后它恢复正常操作并成功接收数据。甚至我的工作线程AsyncTask也挂起,这很明显,因为与其他消息相比,它们在Logcat中显示消息的时间明显延迟

Android Studio 3.3.1

目标API水平:>=26 8.0 Oreo

TCP测试服务器-Hercules

@SuppressLint("StaticFieldLeak")
public void connect(){
    new AsyncTask<Void, Void, Boolean>(){

        @Override
        protected Boolean doInBackground(Void... voids) {
            try {
                socket  = new Socket(ip, portNo);
                out     = socket.getOutputStream();
                in      = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                socketAlive.set(true);
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        }

        @Override
        protected void onPostExecute(Boolean result) {
            if(result){
                sendData("RegisterDevice:<ip>:<mac>");
                readerThread();
            }
            else{
                socketAlive.set(false);
                reconnect();
            }
        }
    }.execute();
}
@SuppressLint("StaticFieldLeak")
public void sendData(final String data){
    if(this.socket == null || this.socket.isClosed() )
    {
        //Unable to send data as output is closed returning
        return;
    }
    new AsyncTask<String, Void, Boolean>(){
        @Override
        protected Boolean doInBackground(String... writeString) {
            try {
out.writewriteString[0]。getBytes;//->将服务器套接字设置为 悬挂


这个问题是由

mainActivity.processEthernetDataString.copyValueOfreadBuffer,0,Ethernet.TCP\u读取\u缓冲区大小

显然,创建并传递给函数的字符串的顺序是TCP_READ_BUFFER_SIZE,值为8192。当通过TCP/IP传输如此大的字符串时,会导致我的服务器暂时挂起,直到收到完整的数据

我通过将线路改为

mainActivity.processEthernetData(String.copyValueOf(readBuffer, 0, ethernetBytesRead)); 

唯一可以挂起ServerSocket的是它的accept方法,这只能在没有客户端套接字和连接的情况下发生。您的代码大多是垃圾代码,依赖于isClosed和friends的不存在属性,忽略读取返回的值,执行无意义的数组初始化,&c。那么,为什么服务器与执行out.write的线程挂起,然后服务器在5秒后恢复操作呢,即使成功地接收和显示已传输的数据??也可以使用tcpdump或Wireshark进行诊断。为什么对flush调用进行了注释?当我尝试使用BufferedWriter进行传输时,使用了flush,但使用OutputStringStream则没有必要。
mainActivity.processEthernetData(String.copyValueOf(readBuffer, 0, ethernetBytesRead));