我想开发客户端和服务器通信,我已经为客户端和服务器编写了一些代码,但是一旦客户端和服务器连接,就没有必要一次又一次地重新连接。但是,在我当前的代码中,它们一次又一次地重新连接。
-
InetAddress host = InetAddress.getLocalHost();
-
Socket s = new Socket(host.getHostName(), 4321);
第二行每次都会创建新的连接,这就是我试图解决的问题(他们只需要连接一次(。
客户端类.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();
}
}
}
}
服务器类.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 从控制台读取命令并发送到服务器,但在初始连接后不应继续重新连接。
在重新启动服务器的情况下,客户端应该自动连接,并且客户端应该能够将命令发送到服务器。
我想我不需要更改服务器类代码。只需要更改客户端类代码。如何?
好的,有两个主要原因可以解释为什么总是会建立新的连接。
首先,对于 ServerClass 中 while(true)
循环的每个周期,您都在创建一个新的服务器套接字并通过调用 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();
}