java多线程实现服务器端与多客户端之间的通信

来源:互联网 发布:数据库怎么加锁 编辑:程序博客网 时间:2024/05/18 02:57

用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰。

应用多线程来实现服务器与多线程之间的通信的基本步骤

  1. 服务器端创建ServerSocket,循环调用accept()等待客户端链接
  2. 客户端创建一个Socket并请求和服务器端链接
  3. 服务器端接受客户端请求,创建socekt与该客户端建立专线链接
  4. 建立链接的socket在一个单独的线程上对话
  5. 服务器继续等待新的链接
服务器端Server.java
packagetest.concurrent.socket;
  
importjava.io.*;
importjava.net.InetAddress;
importjava.net.ServerSocket;
importjava.net.Socket;
  
/**
 * Created by dong on 15-6-22.
 * 基于TCP协议的Socket通信,实现用户登录
 * 服务器端
 */
publicclassServer {
  
  publicstaticvoid main(String[] args) {
  
    try{
      //1、创建一个服务器端Socket,即ServerSocket, 指定绑定的端口,并监听此端口
      ServerSocket serverSocket = newServerSocket(8888);
      Socket socket = null;
      //记录客户端的数量
      intcount = 0;
      System.out.println("***服务器即将启动,等待客户端的链接***");
      //循环监听等待客户端的链接
      while(true){
        //调用accept()方法开始监听,等待客户端的链接
        socket = serverSocket.accept();
        //创建一个新的线程
        ServerThread serverThread = newServerThread(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
packagetest.concurrent.socket;
  
importjava.io.*;
importjava.net.Socket;
  
/**
 * Created by dong on 15-6-22.
 * 服务器端线程处理类
 */
publicclassServerThread extendsThread {
  
  //和本线程相关的Socket
  Socket socket = null;
  publicServerThread(Socket socket){
    this.socket = socket;
  }
  
  //线程执行的操作,响应客户端的请求
  publicvoidrun(){
  
    InputStream is = null;
    InputStreamReader isr = null;
    BufferedReader br = null;
  
    OutputStream os = null;
    PrintWriter pw = null;
    try{
  
      //获取一个输入流,并读取客户端的信息
      is = socket.getInputStream();
      isr = newInputStreamReader(is);//将字节流转化为字符流
      br = newBufferedReader(isr);//添加缓冲
      String info = null;
      //循环读取数据
      while((info = br.readLine()) != null){
        System.out.println("我是服务器,客户端说: " +info);
      }
  
      socket.shutdownInput();//关闭输入流
  
      //获取输出流,响应客户端的请求
      os = socket.getOutputStream();
      pw = newPrintWriter(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.java
packagetest.concurrent.socket;
  
importjava.io.*;
importjava.net.Socket;
  
/**
 * Created by dong on 15-6-22.
 * 客户端
 */
publicclassClient {
  
  publicstaticvoid main(String[] args) {
  
    try{
      //1、创建客户端Socket,指定服务器端口号和地址
      Socket socket = newSocket("localhost",8888);
      //2、获取输出流,向服务器发送信息
      OutputStream os = socket.getOutputStream(); //字节输出流
      PrintWriter pw = newPrintWriter(os);//将输出流包装为打印流
      pw.write("用户名:tom; 密码:456");
      pw.flush();
      socket.shutdownOutput();//关闭输出流
  
      InputStream is = socket.getInputStream();
      InputStreamReader isr = newInputStreamReader(is);
      BufferedReader br = newBufferedReader(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();
    }
  }
}

阅读全文
0 0