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

时间:2018-03-08 06:54:26

标签: java sockets

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

  1. InetAddress host = InetAddress.getLocalHost();
  2. Socket s = new Socket(host.getHostName(), 4321);
  3. 第二行每次都会创建新连接,这是我正在尝试解决的问题(它们只需要连接一次)。

    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代码。怎么样?

1 个答案:

答案 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();
      }