首页 > 编程 > Java > 正文

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

2019-11-26 13:39:27
字体:
来源:转载
供稿:网友

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

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

  1. 服务器端创建ServerSocket,循环调用accept()等待客户端链接
  2. 客户端创建一个Socket并请求和服务器端链接
  3. 服务器端接受客户端请求,创建socekt与该客户端建立专线链接
  4. 建立链接的socket在一个单独的线程上对话
  5. 服务器继续等待新的链接

服务器端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.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();     }   } } 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表