首页 > Java > java教程 > 正文

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

高洛峰
发布: 2017-01-05 15:23:21
原创
3621人浏览过

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

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

服务器端创建ServerSocket,循环调用accept()等待客户端链接

客户端创建一个Socket并请求和服务器端链接

服务器端接受客户端请求,创建socekt与该客户端建立专线链接

立即学习Java免费学习笔记(深入)”;

建立链接的socket在一个单独的线程上对话

服务器继续等待新的链接

PHPShops多用户商城系统
PHPShops多用户商城系统

随着电子商务模式更加多样化,企业和个人的迫切需求,PHPShops多用户商城系统正可以为其提供专业的电子商务解决方案。社区化电子商务,主要面向行业类和地方门户类站点。 PHPShops多用户商城系统(简称PHPShops)是基于电子商务的一套平台交易系统,它采用目前最流行网站建设工具PHP+MYSQL,实现模版分离技术,通过HTML交互式网页技术来实行客户端与服务器端的交流。无论在

PHPShops多用户商城系统 0
查看详情 PHPShops多用户商城系统

服务器端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(); 
    } 
  } 
}
登录后复制

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

更多java多线程实现服务器端与多客户端之间的通信相关文章请关注PHP中文网!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号