Heim  >  Artikel  >  Java  >  Java-Multithreading implementiert die Kommunikation zwischen Server und mehreren Clients

Java-Multithreading implementiert die Kommunikation zwischen Server und mehreren Clients

高洛峰
高洛峰Original
2017-01-05 15:23:213309Durchsuche

Verwenden Sie die Java-Sprache, um einen Netzwerkserver zu erstellen und die Kommunikation zwischen Client und Server zu realisieren, sodass der Client über unabhängige Threads verfügt und sich nicht gegenseitig stört.

Grundlegende Schritte zum Anwenden von Multithreading, um die Kommunikation zwischen Server und Multithreading zu realisieren

Der Server erstellt einen ServerSocket und ruft in einer Schleife Accept() auf, um auf die Clientverbindung zu warten

Der Client erstellt einen Socket und fordert eine Verbindung mit dem Server an

Der Server akzeptiert die Anfrage des Clients und erstellt einen Socket, um eine Standleitungsverbindung mit dem Client herzustellen

Der Socket zum Herstellen der Verbindung befindet sich in einem separaten Thread-Dialog

Der Server wartet weiterhin auf neue Links

Serverseitiger Server.java

package test.concurrent.socket; 
  
import java.io.*; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 
  
/** 
 * Created by dong on 15-6-22. 
 * 基于TCP协议的Socket通信,实现用户登录 
 * 服务器端 
 */
public class Server { 
  
  public static void main(String[] args) { 
  
    try { 
      //1、创建一个服务器端Socket,即ServerSocket, 指定绑定的端口,并监听此端口 
      ServerSocket serverSocket = new ServerSocket(8888); 
      Socket socket = null; 
      //记录客户端的数量 
      int count = 0; 
      System.out.println("***服务器即将启动,等待客户端的链接***"); 
      //循环监听等待客户端的链接 
      while (true){ 
        //调用accept()方法开始监听,等待客户端的链接 
        socket = serverSocket.accept(); 
        //创建一个新的线程 
        ServerThread serverThread = new ServerThread(socket); 
        //启动线程 
        serverThread.start(); 
  
        count++; //统计客户端的数量 
        System.out.println("客户端的数量: " + count); 
        InetAddress address = socket.getInetAddress(); 
        System.out.println("当前客户端的IP : " + address.getHostAddress()); 
      } 
  
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
}

Serverseitiger Thread Verarbeitungsklasse ServerThread.java

package test.concurrent.socket; 
  
import java.io.*; 
import java.net.Socket; 
  
/** 
 * Created by dong on 15-6-22. 
 * 服务器端线程处理类 
 */
public class ServerThread extends Thread { 
  
  //和本线程相关的Socket 
  Socket socket = null; 
  public ServerThread(Socket socket){ 
    this.socket = socket; 
  } 
  
  //线程执行的操作,响应客户端的请求 
  public void run(){ 
  
    InputStream is = null; 
    InputStreamReader isr = null; 
    BufferedReader br = null; 
  
    OutputStream os = null; 
    PrintWriter pw = null; 
    try { 
  
      //获取一个输入流,并读取客户端的信息 
      is = socket.getInputStream(); 
      isr = new InputStreamReader(is); //将字节流转化为字符流 
      br = new BufferedReader(isr); //添加缓冲 
      String info = null; 
      //循环读取数据 
      while ((info = br.readLine()) != null){ 
        System.out.println("我是服务器,客户端说: " +info); 
      } 
  
      socket.shutdownInput(); //关闭输入流 
  
      //获取输出流,响应客户端的请求 
      os = socket.getOutputStream(); 
      pw = new PrintWriter(os); //包装为打印流 
      pw.write("欢迎你"); 
      pw.flush(); //将缓存输出 
  
  
    } catch (IOException e) { 
      e.printStackTrace(); 
    }finally { 
  
  
        try { 
          //关闭资源 
          if (pw != null) 
            pw.close(); 
          if (os != null) 
            os.close(); 
          if (is != null) 
            is.close(); 
          if (isr != null) 
            isr.close(); 
          if (br != null) 
            br.close(); 
          if (socket != null) 
            socket.close(); 
        } catch (IOException e) { 
          e.printStackTrace(); 
  
        } 
  
    } 
  
  
  
  } 
}

Client Client.java

package test.concurrent.socket; 
  
import java.io.*; 
import java.net.Socket; 
  
/** 
 * Created by dong on 15-6-22. 
 * 客户端 
 */
public class Client { 
  
  public static void main(String[] args) { 
  
    try { 
      //1、创建客户端Socket,指定服务器端口号和地址 
      Socket socket = new Socket("localhost",8888); 
      //2、获取输出流,向服务器发送信息 
      OutputStream os = socket.getOutputStream(); //字节输出流 
      PrintWriter pw = new PrintWriter(os); //将输出流包装为打印流 
      pw.write("用户名:tom; 密码:456"); 
      pw.flush(); 
      socket.shutdownOutput(); //关闭输出流 
  
      InputStream is = socket.getInputStream(); 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
  
      String info = null; 
      //循环读取 
      while ((info = br.readLine()) != null){ 
        System.out.println("我是客户端:服务器说:" + info); 
      } 
  
      br.close(); 
      is.close(); 
      isr.close(); 
  
  
      pw.close(); 
      os.close(); 
      socket.close(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
}

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Lernen aller hilfreich sein wird Jeder wird die chinesische PHP-Website unterstützen.

Weitere Artikel zum Java-Multithreading zur Implementierung der Kommunikation zwischen dem Server und mehreren Clients finden Sie auf der chinesischen PHP-Website!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn