当前位置: 首页 > 知识库问答 >
问题:

tcp连接卡在close_wait java中

尤博达
2023-03-14

有很多close_wait连接,当客户端客户端将消息发送到服务器并输出TCP FSM卡在close_wait状态时

这是客户端代码,

public class Client1 
    {

        private static Socket socket;
        public static void main(String args[])
        {
            try
            {
                String host = "localhost";
                int port = 25000;
                InetAddress address = InetAddress.getByName(host);
                socket = new Socket(address, port);
                //Send the message to the server
                OutputStream os = socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os);
                BufferedWriter bw = new BufferedWriter(osw);
                String number = "2";
                String sendMessage = number + "\n";
                bw.write(sendMessage);
                bw.flush();
                System.out.println("Message sent to the server : "+sendMessage);
                //Get the return message from the server
                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String message = br.readLine();
                System.out.println("Message received from the server : " +message);
            }
            catch (Exception exception) 
            {
                exception.printStackTrace();
            }
            finally
            {
                //Closing the socket
                try
                {   
                    socket.close();   
                }
                catch(Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

这是侦听即将到来的连接的服务器代码

public class Server1 
{

    private static Socket socket;

    public static void main(String[] args) 
    {
        try
        {

            int port = 25000;
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("Server Started and listening to the port 25000");

            //Server is running always. This is done using this while(true) loop
            while(true) 
            {
                //Reading the message from the client
                socket = serverSocket.accept();
                InputStream is = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String number = br.readLine();
                System.out.println("Message received from client is "+number);

                //Multiplying the number by 2 and forming the return message
                String returnMessage;
                try
                {
                    int numberInIntFormat = Integer.parseInt(number);
                    int returnValue = numberInIntFormat*2;
                    returnMessage = String.valueOf(returnValue) + "\n";
                }
                catch(NumberFormatException e)
                {
                    //Input was not a number. Sending proper message back to client.
                    returnMessage = "Please send a proper number\n";
                }

                //Sending the response back to the client.
                OutputStream os = socket.getOutputStream();
                OutputStreamWriter osw = new OutputStreamWriter(os);
                BufferedWriter bw = new BufferedWriter(osw);
                bw.write(returnMessage);
                System.out.println("Message sent to the client is "+returnMessage);
                bw.flush();
            }
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                socket.close();
            }
            catch(Exception e){}
        }
    }
}

输出TCP FSM

 -bash:~$ netstat -an | grep 25000
    tcp4       0      0  127.0.0.1.25000        127.0.0.1.56459        CLOSE_WAIT 
    tcp46      0      0  *.25000                *.*                    LISTEN   

共有1个答案

酆奇文
2023-03-14

您在错误的位置关闭了接受的套接字。它需要在接受循环内。

 类似资料:
  • 我是socket新手,正在尝试通过tcp socket创建连接池。我的实现为每个调用发送32位长度的二进制消息。但有时读卡器从服务器接收到以前的响应时,我会遇到问题(当客户端关闭并在发送错误时重新建立套接字时,可能会发生这种情况)。如何在新请求之前刷新套接字(上次调用的剩余字节)。有什么建议吗? 编辑:我了解到tcp总是流0s,如果我在消息之前发送字节(1),这样我就可以使用刷新功能在新调用之前检

  • 问题内容: 在Go中,TCP连接(net.Conn)是io.ReadWriteCloser。我想通过模拟TCP连接来测试我的网络代码。我有两个要求: 要读取的数据存储在字符串中 每当写入数据时,我都希望将其存储在某种缓冲区中,以便以后使用 是否有数据结构或简单的方法? 问题答案: 为什么不使用?它是一种并且具有获取存储数据的方法。如果需要将其设置为,则可以定义自己的类型: 并定义一个方法:

  • 问题内容: 这是我的代码: 输出量 为什么和具有相同的地址?在TCP中,我认为为新连接创建了一个新套接字。 问题答案: 这让我困惑了一秒钟,但这是正确的。确实创建了一个新的套接字(具有唯一的本地+远程地址元组)。维基百科的这段引文很好地描述了它: 服务器可以使用相同的本地端口号和本地IP地址创建多个同时建立的TCP套接字,每个套接字都映射到其自己的服务器子进程,并为自己的客户端进程提供服务。由于远

  • 提前致谢

  • 在一个简单的客户端-服务器TCP套接字中,当我试图在Android Studio中创建客户端套接字时,遇到了一个问题。导致错误的指令是<code>Sockets=new Socket(主机名,端口) 我使用的端口是 1993,我尝试了变量的一些值: 在每种情况下,应用程序都会因为这个错误而停止,下面的错误属于第一点,其他的得到类似的错误。 Eclipse中的相同指令工作,我在命令行上使用服务器“n

  • 问题内容: 我有以下几点: 然后两个功能: 其中ReadLogStash是正在运行的goroutine。如果另一侧关闭,我得到EOF。ReadLogStash中的一个好的实现是什么,当它获得EOF时,尝试每X秒重新建立一次连接? 问题答案: Go有同步和沟通的渠道,请使用它们! 使您的连接处于循环状态,并让它等待某种消息返回通道。 除非您在ReadLogStash中具有更多功能,否则您可能只能使用