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

标签 java sockets

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

  1. InetAddress 主机 = InetAddress.getLocalHost();
  2. 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/

相关文章:

Python 套接字监听

c# - 检查客户端是否正在尝试连接?

java - 如何使用 Archiva 配置 SSL?

java - 无法绑定(bind) Spring 表单复选框

sockets - TCP 打开套接字延迟

c - send() 什么时候返回 EWOULDBLOCK?

c++ - 限制通过c++中的套接字传输的数据

java - 如何通过另一个 Activity 杀死一个服务?

java - Spring 数据 REST findBy 嵌套实体

java - CameraToMpegTest.java 不工作,以 IllegalStateException : Can't stop due to wrong state 结束