当执行客户端重新启动或关闭时,服务器端的所有套接字连接都挂起CLOSE_WAIT。用于将序列化数据发送到XDR流中的XdrAble。池是标准KeyedSocketPool的对象。MAXIMUM_RETRY、MAXIMUM_RETYR_BEFORE_RESET_POOL是为重置池连接而定义的常量。关闭连接时我缺少了什么?
公共RESP调用(REQ request、RESP response、int requestLength和int timeOut)引发异常{
Socket Socket=Null;
IOException ioException = null;
short attempts = 0;
boolean needResetPool = false;
while (true)
{
ioException = null;
try
{
// Get socket (open if not connected)
socket = (Socket) pool.borrowObject ();
socket.setSoTimeout (timeOut);
// Send request
BufferedOutputStream outputStream = new BufferedOutputStream (socket
.getOutputStream ());
XdrBufferEncodingStream xdrIn = new XdrBufferEncodingStream (
requestLength);
xdrIn.beginEncoding (socket.getInetAddress (), socket.getPort ());
request.xdrEncode (xdrIn);
xdrIn.endEncoding ();
outputStream.write (xdrIn.getXdrData ());
outputStream.flush ();
xdrIn.close ();
// Read response
BufferedInputStream inputStream = new BufferedInputStream (socket
.getInputStream ());
byte[] buffer = new byte[UreMsgBodyLength.MAXIMUM_MSG_LEN];
int bytesRead = inputStream.read (buffer);
if (bytesRead < UreMsgBodyLength.MESSAGE_HEADER_LEN)
throw new IOException("Socket Read Failed - invalid bytesRead="+bytesRead);
int encodedLength = bytesRead;
if ( encodedLength < 0 || ( encodedLength & 3) != 0 )
encodedLength = UreMsgBodyLength.MAXIMUM_MSG_LEN;
XdrBufferDecodingStream xdrOut = new XdrBufferDecodingStream (buffer, encodedLength);
xdrOut.beginDecoding ();
response.xdrDecode (xdrOut);
xdrOut.endDecoding ();
xdrOut.close ();
return response;
}
catch (ConnectException ex)
{
ioException = ex;
}
catch (IOException ex)
{
ioException = ex;
if (socket != null)
{
needResetPool = true;
try { socket.close (); } catch (Throwable t) {}
try
{
pool.invalidateObject (socket); // Mark the socket as invalid
}
catch (Throwable t)
{
}
socket = null;
}
}
finally
{
if (socket != null)
{
try
{
pool.returnObject (socket);
}
catch (Throwable t)
{
}
}
}
if (attempts >= MAXIMUM_RETYR_BEFORE_RESET_POOL && needResetPool)
{
pool.clear (pool.getKey ()); // clean all connect for the current server id
}
if (attempts >= MAXIMUM_RETRY)
{
throw ioException;
}
attempts++;
} // while
}
关闭连接时我错过了什么?
服务器没有关闭它的套接字来响应读取EOS(read()返回-1)。这段代码也处理不好。CLOSE_WAIT表示对等方已关闭连接,本地系统正在等待应用程序关闭此端。
真的需要你帮忙。 我的项目是通过电缆连接两台PC机,并使用tcp套接字将客户端文本框形式的字符串发送到服务器。问题是ATI只能发送一个字符串,然后连接就会关闭。 注意:某个端口上的连接将在表单加载中建立并成功。
我正在开发一个非常简单的Java客户机/服务器系统(只是为了让我的脚沾满套接字)。由于某种原因,我一直收到“套接字已关闭”错误。。。这是我的密码。。 服务器文件 客户端文件 我在客户端的第41行得到了错误,然后在第46行得到了NullPointerException。。 提前感谢您的帮助。我只是想在这里学习。
我使用的代码女巫只允许4个不同端口上的4个连接。此代码正在工作,但当客户端关闭连接时,它无法重新建立连接。连接被拒绝。认为是因为线程关闭。如何解决这个问题?我无法更改端口号... 从套接字导入* BUFF=25 def服务器(主机、端口): 如果名称==“main”:导入线程
问题内容: 我正在通过TCP创建一个Java客户端/服务器应用程序,其中有两个套接字: 一种是交换消息。 二是用于文件传输。 我已经在服务器中创建了两个ServerSockets,以便 通过接受ServerSockets 创建套接字1和2 。 首先,客户端通过第一个套接字发送一些字节, 以便它可以告诉服务器它需要哪个文件。 然后,服务器通过第二个套接字将文件发送给客户端。 客户端收到文件后,尝试将
我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput
问题内容: 我有一个RMI服务器和一个桌面RMI客户端。重新启动服务器时,客户端出现错误。是否可以在不重新启动客户端的情况下重新启动RMI连接? [编辑]这是堆栈跟踪: 问题答案: 服务器终止后,您将收到一个ConnectException。之后,您可以使用Naming.lookup获取新的服务器对象。