用于客户端和服务器通信的 Java 套接字程序自动重新连接



我想开发客户端和服务器通信,我已经为客户端和服务器编写了一些代码,但是一旦客户端和服务器连接,就没有必要一次又一次地重新连接。但是,在我当前的代码中,它们一次又一次地重新连接。

  1. InetAddress host = InetAddress.getLocalHost();
  2. 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();
      }

相关内容

最新更新