我想开发客户端和服务器通信,我已经为客户端和服务器编写了一些代码,但是一旦客户端和服务器连接,就不需要一次又一次地重新连接。但是,在我目前的代码中,他们一次又一次地重新连接。
InetAddress host = 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从控制台读取命令并发送到服务器,但在初始连接后不应该重新连接。
在重启等情况下,服务器和客户端应自动连接,客户端应该能够将命令发送到服务器。
我认为我不需要更改serverclass代码。只需要更改clientClass代码。怎么样?
答案 0 :(得分:2)
好的,总有两个主要原因会建立新的连接。
首先,对于ServerClass中while(true)
循环的每个循环,您要创建一个新的服务器套接字,并通过调用 ServerSocket.accept()
等待新连接,这也是一个阻塞操作,这意味着服务器在新连接到达之前一直阻塞。
此行为的第二个原因是,您始终通过创建新套接字从ClientClass强制执行新连接。 套接字建立端到端连接。一旦创建和连接,您就不必再制作另一个。
最方便的修复方法是替换while(true)
循环,使其仅以某种方式覆盖真实的发送/接收逻辑:
<强> ClientClass 强>
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();
}
<强> ServerClass 强>
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();
}