>  기사  >  Java  >  Java 멀티스레딩은 서버와 여러 클라이언트 간의 통신을 구현합니다.

Java 멀티스레딩은 서버와 여러 클라이언트 간의 통신을 구현합니다.

高洛峰
高洛峰원래의
2017-01-05 15:23:213349검색

Java 언어를 사용하여 클라이언트와 서버 간의 통신을 구현하는 네트워크 서버를 구축하여 클라이언트가 독립적인 스레드를 가지며 서로 간섭하지 않도록 합니다.

서버와 멀티스레딩 간의 통신을 구현하기 위해 멀티스레딩을 적용하는 기본 단계

서버는 ServerSocket을 생성하고 루프에서 accept()를 호출하여 클라이언트 연결을 기다립니다.

클라이언트가 소켓을 생성하고 서버에 연결을 요청합니다

서버가 클라이언트의 요청을 수락하고 소켓을 생성하여 클라이언트와 전용 회선 링크를 설정합니다

The 링크를 설정하는 소켓은 별도의 스레드에 있습니다. Dialog

서버는 계속해서 새 링크를 기다립니다

Server-side 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(); 
    } 
  } 
}

서버측 스레드 처리 클래스 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(); 
    } 
  } 
}

위 내용은 모두의 학습에 도움이 되기를 바랍니다. 모두가 PHP 중국어 웹사이트를 지지해주기를 바랍니다.

서버와 여러 클라이언트 간의 통신을 구현하기 위한 Java 멀티스레딩과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.