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

 更新时间:2016年10月26日 11:59:23   作者:Shadow0418  
本篇文章主要介绍了java多线程实现服务器端与多客户端之间的通信,介绍了多线程来实现服务器与多线程之间的通信的基本步骤,有需要的小伙伴可以参考下。

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

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

相关文章

  • Java json转换实体类(JavaBean)及实体类(JavaBean)转换json代码示例

    Java json转换实体类(JavaBean)及实体类(JavaBean)转换json代码示例

    这篇文章主要介绍了两种常见的JSON与Java实体类相互转换的方法,分别是使用库Jackson、Gson、Fastjson和在线工具,无论是将JSON转换为Java实体类还是将Java实体类转换为JSON,这些方法都能显著简化开发过程,需要的朋友可以参考下
    2024-12-12
  • JavaWeb中的简单分页完整代码(推荐)

    JavaWeb中的简单分页完整代码(推荐)

    这次主要是讲解一下通过登录后对得到的数据进行分页,首先我们新建一个登录页面login.jsp,因为我们主要学习的分页,所以登录验证的部分没有提到。关于javaweb中的分页代码大家通过本文学习吧
    2016-11-11
  • Java SiteMesh新手学习教程代码案例

    Java SiteMesh新手学习教程代码案例

    这篇文章主要介绍了Java SiteMesh新手学习教程代码案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • java springboot的概述、特点与构建介绍

    java springboot的概述、特点与构建介绍

    大家好,本篇文章主要讲的是springboot的概述、特点与构建介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 使用@slf4j找不到符号log的问题及解决

    使用@slf4j找不到符号log的问题及解决

    这篇文章主要介绍了使用@slf4j找不到符号log的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Character.UnicodeBlock中cjk的说明详解

    Character.UnicodeBlock中cjk的说明详解

    这篇文章主要为大家详细介绍了Character.UnicodeBlock中cjk的说明,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • springboot中使用ElasticSearch的详细教程

    springboot中使用ElasticSearch的详细教程

    这篇文章主要介绍了ElasticSearch在springboot中使用的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • Java字节缓存流的构造方法之文件IO流

    Java字节缓存流的构造方法之文件IO流

    这篇文章主要介绍了Java字节缓存流的构造方法之文件IO流,同时也介绍了字符流中的一些相关的内容,并且通过大量的案例供大家理解。最后通过一些经典的案例帮助大家对前面所学的知识做了一个综合的应用,需要的朋友可以参考一下
    2022-04-04
  • mybatisplus如何解决分页最多500条数据

    mybatisplus如何解决分页最多500条数据

    这篇文章主要介绍了mybatisplus如何解决分页最多500条数据的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 将本地SpringBoot项目发布到云服务器的方法

    将本地SpringBoot项目发布到云服务器的方法

    这篇文章主要介绍了如何将本地SpringBoot项目发布到云服务器,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12

最新评论