我正在制作原型客户端和服务器,以便了解如何处理重新连接。服务器应该创建一个 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");
}
}
有谁知道如何正确重新连接?