Java—在完成读取后保持套接字客户端的活动状态
我对Java中的套接字有点陌生,但我的问题是: 我已经编写了一个客户端线程类,它将请求连接到另一个应用程序创建的服务器(因此我没有为服务器类创建的类)。基本上,这个应用程序将传输一定数量的字节,并关闭套接字的服务器端。我已经完全能够接收和处理这些字节 我的问题是,是否可以告诉客户端套接字“等待”来自同一地址/端口的另一个连接可用,然后继续读取字节?(本质上,我运行应用程序,它读取字节并完成,然后我再次运行应用程序,客户端仍然能够读取) 以下是我的客户端线程的代码:Java—在完成读取后保持套接字客户端的活动状态,java,sockets,client,Java,Sockets,Client,我对Java中的套接字有点陌生,但我的问题是: 我已经编写了一个客户端线程类,它将请求连接到另一个应用程序创建的服务器(因此我没有为服务器类创建的类)。基本上,这个应用程序将传输一定数量的字节,并关闭套接字的服务器端。我已经完全能够接收和处理这些字节 我的问题是,是否可以告诉客户端套接字“等待”来自同一地址/端口的另一个连接可用,然后继续读取字节?(本质上,我运行应用程序,它读取字节并完成,然后我再次运行应用程序,客户端仍然能够读取) 以下是我的客户端线程的代码: public class Cl
public class ClientThread extends Thread{
private Socket soc;
private InputStream in;
private String host;
private int port;
public ClientThread(String host, int port)
{
this.host = host;
this.port = port;
soc = null;
in = null;
}
public boolean connectToServer()
{
try {
soc = new Socket(host, port);
in = new BufferedInputStream(soc.getInputStream());
System.err.println("Connection accepted: "+soc);
return true;
} catch (UnknownHostException e) {
System.err.println("Unable to determine IP of host: "+host+".");
return false;
} catch (SocketException e) {
System.err.println("Error creating or accessing the socket.");
return false;
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: "+host+".");
return false;
}
}
public boolean disconnectFromServer()
{
try {
if(in != null)
in.close();
if(soc != null && soc.isConnected()) {
soc.close();
soc = null;
System.err.println("Connection successfully closed!");
}
return true;
} catch (Exception e) {
System.err.println("Exception: "+e);
return false;
}
}
@Override
public void run() {
try {
int sz = 0;
byte[] tmp = new byte[25];
while(true)
{
if(sz == -1) {
sz = 0;
}
sz += in.read(tmp, sz, 25-sz);
System.out.println(sz);
if(sz == 25) {
tmp = new byte[25];
for(byte b: tmp)
System.out.print(b);
sz = 0;
Thread.sleep(500);
}
}
} catch (SocketException e) {
System.err.println("Connection closed abruptly.");
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to: "+host+".");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
当
accept()
返回时,服务器将收到一个套接字,只要该套接字没有关闭,连接就会保持打开状态
因此,当您第一次运行应用程序,然后关闭服务器,然后第二次运行它时,我认为连接将中断,您必须重新初始化它
isConnected()
如果您想确定,可以运行一次客户机-服务器连接,然后关闭服务器,重新启动,然后尝试从服务器读取/写入数据。如果连接断开,您将从读取中得到-1,从写入中得到IOException
。好的,是的,我相信当应用程序完成时,连接将关闭。如果有新的服务器端套接字可用,是否有一种让客户端自动重新连接的有效方法?也许你可以编写一个线程
,它每隔一段时间用我在回答中描述的方法检查连接(只需读或写,我想读将是最简单的方法),当连接丢失时,只需调用一个方法来打开连接。这可能会起作用。但如果不是太麻烦的话,我还有一个问题。假设我在应用程序传输所有数据之前手动断开客户端的连接。然后我想重新连接我的客户机以完成其余数据的读取。可能吗?我打开了TCPview,它说在我断开客户端连接后,应用程序的套接字仍在侦听。