天天看点

使用多线程实现多客户端的连接(通过Socket实现TCP编程)

服务器线程类

package com.susu;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerThread implements Runnable{
  
  private Socket socket=null;
  
  public ServerThread(Socket socket){
    this.socket=socket;
  }
  @Override
  public void run() {
    // TODO Auto-generated method stub
    InputStream is=null;
    InputStreamReader isr=null;
    BufferedReader br=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();
      //输出流
      OutputStream os=socket.getOutputStream();
      PrintWriter pw=new PrintWriter(os);
      pw.write("欢迎你!!");
      pw.flush();
      //关闭输出流
      socket.shutdownOutput();
    
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }  finally{
      //关闭资源
      try {
        if(br!=null)
          br.close();
        if(isr!=null)
          isr.close();
        if(is!=null)
          is.close();
        if(socket!=null)
          socket.close();
      } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }

}      

服务端

package com.susu;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

  /**
   * 服务端
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
      ServerSocket ss = new ServerSocket(2000);
      System.out.println("***服务器即将启动,等待客户端连接***");
      Socket socket = null;
      int count = 0;
      // 循环监听客户端的连接
      while (true) {
        socket = ss.accept();
        // 创建线程实例
        ServerThread serverThread = new ServerThread(socket);
        Thread thread = new Thread(serverThread);
        // 开启线程
        thread.start();
        System.out.println("客户端IP地址:"
            + socket.getInetAddress().getHostAddress());
        System.out.println("已连接的客户端数:" + (++count));
      }

    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

}      

客户端:

package com.susu;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
  public static void main(String[] args) {
    try {
      Socket socket=new Socket("127.0.0.1", 2000);
      //输出流
      OutputStream os=socket.getOutputStream();
      PrintWriter pw=new PrintWriter(os);
      pw.write("今天天气很好~");
      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);
      }
      
      //关闭资源
      pw.close();
      os.close();
      socket.close();
    } catch (UnknownHostException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}      

运行结果: