我想开发客户端和服务器通信,我已经为客户端和服务器编写了一些代码,但是一旦客户端和服务器连接,就不需要一次又一次地重新连接。然而,在我当前的代码中,它们不断地一次又一次地重新连接。
InetAddress 主机 = InetAddress.getLocalHost();
Socket s = new Socket(host.getHostName(), 4321);
第二行每次都会创建新的连接,这是我试图解决的问题(他们只需要连接一次)。
ClientClass.java
public class CientClass {
public static void main(String[] args)
{
System.out.println("CLIENT SITE");
while (true) {
try {
InetAddress host = InetAddress.getLocalHost();
Socket s = new Socket(host.getHostName(), 4321);
DataOutputStream dout = new DataOutputStream(s.getOutputStream());
Scanner sc = new Scanner(System.in);
System.out.println("Ener for server:");
String data = sc.next();
dout.writeUTF(data);
}
catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
}
}
}
Serverclass.java
public class Serverclass {
public static void main(String[] args) {
System.out.println("SERVER SITE");
while (true) {
try {
ServerSocket ss = new ServerSocket(4321);
Socket s = ss.accept();
DataInputStream din = new DataInputStream(s.getInputStream());
String str = (String) din.readUTF();
System.out.println("message:" + str);
ss.close();
}
catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
}
}
}
clientClass 从控制台读取命令并将其发送到服务器,但在初始连接后不应继续重新连接。
在重新启动服务器的情况下,客户端应该自动连接,并且客户端应该能够向服务器发送命令。
我认为我不需要更改服务器类代码。只需要更改clientClass代码即可。怎么办?
最佳答案
好吧,总是会建立新连接有两个主要原因。
首先,对于 while(true)
的每个周期在您的 ServerClass 中循环,您正在创建一个新的服务器套接字并通过调用 ServerSocket.accept()
等待新连接这也是一个阻塞操作,这意味着服务器会一直阻塞,直到有新连接到达。
此行为的第二个原因是,您始终通过创建新套接字来强制从 ClientClass 建立新连接。 套接字建立端到端连接。创建并连接后,您无需再创建一个。
对您来说最方便的修复方法是替换 while(true)
循环,使其仅以如下方式覆盖真正的发送/接收逻辑:
客户端类
try
{
InetAddress host = InetAddress.getLocalHost();
Socket s = new Socket( host.getHostName(), 4321 );
DataOutputStream dout = new DataOutputStream( s.getOutputStream() );
while ( isAlive )
{
Scanner sc = new Scanner( System.in );
System.out.println( "Ener for server:" );
String data = sc.next();
dout.writeUTF( data );
}
}
catch ( Exception e )
{
System.out.println( e );
e.printStackTrace();
}
服务器类
try
{
ServerSocket ss = new ServerSocket( 4321 );
Socket s = ss.accept();
DataInputStream din = new DataInputStream( s.getInputStream() );
while ( isAlive )
{
String str = (String) din.readUTF();
System.out.println( "message:" + str );
}
ss.close();
}
catch ( Exception e )
{
System.out.println( e );
e.printStackTrace();
}
关于Java套接字程序用于客户端和服务器通信自动重连,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49167103/