0

我正在制作原型客户端和服务器,以便了解如何处理重新连接。服务器应该创建一个 serversocket 并永远监听。客户端可以连接、发送其数据并关闭其套接字,但它不会向服务器发送“我完成并关闭”类型的消息。出于这个原因,由于远程客户端已经关闭,服务器在执行 aEOFException时会得到 a。readByte()在 的错误处理程序中EOFException,它将关闭套接字并打开一个新套接字。

这就是问题所在:即使在成功打开套接字/输入流/输出流之后,客户端有时也会SocketWriteError在调用时得到一个。outputStream.write()这可能与我打开和关闭这些套接字的频率有关。一件有趣的事情是客户端在退出之前会执行任意数量的写入/关闭/重新连接。有时会在第一次重新连接时出错,有时需要 50 次重新连接才能看到SocketWriteError.

这是客户端的错误:

java.net.SocketException:对等方重置连接:套接字写入错误
       在 java.net.SocketOutputStream.socketWrite0(本机方法)
       在 java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
       在 java.net.SocketOutputStream.write(SocketOutputStream.java:115)
       在 bytebuffertest.Client.main(Client.java:37)

以下是一些代码片段:

服务器:

public static void main(String[] args)
{
    Server x = new Server();
    x.initialize();
}

private void initialize()
{
    ServerSocket s;
    InputStream is;
    DataInputStream dis;
    while (true) //ADDED THIS!!!!!!!!!!!!!!!!!!!!!!
    {
        try
        {
            s = new ServerSocket(4448);
            s.setSoTimeout(0);
            s.setReuseAddress(true);
            is = s.accept().getInputStream();
            System.out.println("accepted client");
            dis = new DataInputStream(is);
            try
            {

                byte input = dis.readByte();
                System.out.println("read: " + input);
            } catch (Exception ex)
            {
                System.out.println("Exception");
                dis.close();
                is.close();
                s.close();
            }
        } catch (IOException ex)
        {
            System.out.println("ioexception");
        }
    }
}

客户:

public static void main(String[] args)
{
    Socket s;
    OutputStream os;
    try
    {
        s = new Socket("localhost", 4448);
        s.setKeepAlive(true);
        s.setReuseAddress(true);
        os = s.getOutputStream();
        int counter = 0;
        while (true)
        {
            try
            {
                os.write((byte) counter++);
                os.flush();

                os.close();
                s.close();

                s = new Socket("localhost", 4448);
                s.setKeepAlive(true);
                s.setReuseAddress(true);
                os = s.getOutputStream();
            } catch (Exception e)
            {
                e.printStackTrace();
                System.err.println("ERROR: reconnecting...");
            }
        }
    } catch (Exception ex)
    {
        ex.printStackTrace();
        System.err.println("ERROR: could not connect");
    }
}

有谁知道如何正确重新连接?

4

1 回答 1

3

不要在出现错误时关闭 ServerSocket,只需 .accept() 一个新连接。

我通常做的是每次 ServerSocket.accept() 返回一个 Socket 时,我都会产生一个线程来处理来自该 Socket 的发送和接收。这样,一旦有人想连接到您,您就可以开始接受新连接。

于 2009-03-23T19:34:51.610 回答