如果我查看netstat,我会看到有很多连接被创建,并且不断增长,所有连接都处于TIME_WAIT状态。我不知道为什么。我在服务器和客户端中每次都在finally块中关闭套接字。以下是一些代码:没有可用的缓冲区(已达到最大连接数?):连接
在服务器中,我在socketHandlerThread中:
ServerSocket serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(5000);
while(true) {
Socket socket = serverSocket.accept();
}
然后将新套接字放入LinkedBlockingQueue中,工作线程获取套接字并执行以下操作:
try {
outputStream = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
outputStream.flush();
inStream = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
ClientRequest clientRequest = (ClientRequest) inStream.readObject();
...
outputStream.writeObject(serverResponse);
outputStream.flush();
} catch....
} finally {
if (inStream != null) {
inStream.close();
}
if (outputStream != null) {
outputStream.close();
}
if (socket != null) {
socket.close();
}
}
在客户端,我有以下代码:
try {
socket = new Socket(host, port);
outputStream = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
outputStream.flush();
inputStream = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
outputStream.writeObject(request);
outputStream.flush();
Object serverResponse = inputStream.readObject();
} catch....
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
if (socket != null) {
socket.close();
}
}
有人可以帮忙吗?我真的不知道哪里出了错。看起来套接字没有关闭,但我不知道为什么。
可能是因为我在服务器端将套接字放在队列中,导致套接字被复制了吗?
编辑:如果我将客户端和服务器分别放在运行Linux AMI的不同Amazon EC2经典实例上,则可以正常工作。这可能与Windows有关,或者问题只是我在同一台机器(我的本地PC)上运行客户端和服务器所致?
有人看到我的代码中有错误吗?
编辑2:如上所述,在EC2实例上它可以工作,但是如果使用netstat,它仍然显示大量的TIME_WAIT
行。
以下是屏幕截图:
https://drive.google.com/file/d/0BzERdJrwWrNCWjhReGhpR2FBMUU/view?usp=sharing
https://drive.google.com/file/d/0BzERdJrwWrNCOG1TWGo5YmxlaTg/view?usp=sharing
第一张屏幕截图来自Windows。 "WARTEND"表示 "WAITING"(它是德语)。
第二张屏幕截图来自Amazon EC2(左边是客户端机器,右边是服务器机器)。
Thread.sleep(3000);
,看看会发生什么? - biziclop