这是本人从其他地方学习到的关于聊天室的一个模本,我从中截取了一部分关于客户端和服务端通信的Socket的内容。希望对大家对socket有个了解,我写的这些代码可以实现两人或多人在多台电脑上实现简单的对话。在运行时要先运行server(服务端),再运行client(客户端)。Windows获取自己电脑的ip需要再DOS(命令窗口)界面输入ipconfig或者再网络和共享中心已连接的网络查看详细信息。具体的代码如下

客户端代码

 package talkRoom;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;/*** 客户端* @author ylg**/
public class Client {//客户端用于与服务端通信的socketprivate Socket socket;/***初始化客户端相关内容*/public Client(){try {/*** 实例化socket的过程就是连接的过程通常我们要传入两个参数* 1:字符串,服务器的IP地址* 2:整数,服务器端申请的端口号* (serversocket创建时申请的端口号:8088)*/System.out.println("尝试连接");//此处的localhost可以改为运行服务端的那台电脑的的ip地址这样就可以连在一起聊天了//localhost指的是本机的ipsocket =new Socket("localhost", 8088);System.out.println("连接成功");} catch (Exception e) {e.printStackTrace();}}/*** 客户端用于交互的方法*/public void start(){try {/*** 创建一个线程,用于读取服务器发过来的信息*/Runnable hander=new GetMessageFromServerHandler();Thread t=new Thread(hander);t.start();/*** 客户端想向服务发送消息,通过socket花去输出流之后写出数据即可*/OutputStream out=socket.getOutputStream();/*** 向服务器发送字符串,我们可以将字节流转换为缓冲字符流输出PrintWrint* */OutputStreamWriter osw=new OutputStreamWriter(out,"UTF-8");/*** 发送一个字符串就应当立即写出,所以要自动行刷新*/PrintWriter pw=new PrintWriter(osw,true);/*** 创建scanner,将控制台输入的字符串通过pw发送给服务器*/String message=null;Scanner scanner=new Scanner(System.in);while(true){message=scanner.nextLine();pw.println(message);}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {Client client=new Client();client.start();}/*** 该线程的作用是让客户端可以读取服务器发送过来的信息* @author ylg**/class GetMessageFromServerHandler implements Runnable{/*** 通过socket获取输入流,在转换为缓冲字符输入流* 最后通过循环都读取服务端发送的每一行信息*/public void run() {try {InputStream in=socket.getInputStream();InputStreamReader isr=new InputStreamReader(in,"utf-8");BufferedReader br=new BufferedReader(isr);String message=null;while((message=br.readLine())!=null){System.out.println(message);}} catch (Exception e) {}}}
}

服务端代码(请先运行服务端)


package talkRoom;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** 服务端* @author ylg**/
public class Server {/*** 用于与客户端连接的ServerSOocket*/private ServerSocket server;/*** 存放所有客户端的输入流,用于广播信息*/private List<PrintWriter> allOut;/*** 线程池,用于控制服务端线程数量,并重用线程*/private ExecutorService threadPool;/*** 构造方法,用于初始化服务器相关内容* */public Server(){try {//初始化ServerSocket/*** 初始化时要求我们传入一个整数,这个整数表示端口号,客户端就是* 通过这个端口号连接到服务端的*/server=new ServerSocket(8088);/*** 初始化存放所有客户端输出流的家集合*/allOut =new ArrayList<PrintWriter>();//初始化线程池threadPool=Executors.newFixedThreadPool(50);} catch (Exception e) {e.printStackTrace();}}/*** 将给定的输出流存入共享集合中* @param out*/private synchronized void addOut(PrintWriter out){allOut.add(out);}/*** 从共享集合中删除给定的删除流* @param out*/private synchronized void removeOut(PrintWriter out){allOut.remove(out);}//还要遍历方法,并且三个操作集合的方法互斥/*** 遍历所有的输出流将给定的字符串发送给所有客户端* @param message 服务器接收到的消息*/private synchronized void sendMsgToAllClient(String message){for(PrintWriter pw:allOut){pw.println(message);}}/*** 服务端开始工作的方法*/public void start(){try {/*** socket accept()* 该方法是一个阻塞方法,用于等待客户端的连接* 一旦一个客户端连接上,该方法就会返回与该客户端通信socket*/System.out.println("等待客户端的连接...");/*** 死循环的目的是一直监听不同客户端的连接*/while(true){Socket socket=server.accept();System.out.println("一个客户端连接上了...");/*** 当一个客户端连接后,启动一个线程,将该客户端的socket传入,* 是该线程与客户端通信*/Runnable clientHandler=new ClientHandler(socket);
//              Thread t=new Thread(clientHandler);
//              t.start();threadPool.execute(clientHandler);} } catch (Exception e) {}finally {}}public static void main(String[] args) {Server server =new Server();server.start();}/*** 该线程的作用是与给定的客户端Socket进行通信* @author ylg**/class ClientHandler implements Runnable{/*** 当前线程用于交流的指定客户端的Socket*/private Socket socket;/*** 创建线程体时将交互的Socket传入* @param socket*/public ClientHandler(Socket socket){this.socket=socket;}/*** 定义在try外面是因为finally中要引用*/PrintWriter pw=null;public void run(){try {/*** 通过socket获取输出流,用于将信息发送给客户端*/OutputStream out=socket.getOutputStream();OutputStreamWriter osw=new OutputStreamWriter(out, "utf-8");pw=new PrintWriter(osw,true);/*** 将该客户端的输出流存入共享集合*/addOut(pw);/*** 通过连接上的客户端的socket获取输入流来读取客户端发送过来的信息*/InputStream in=socket.getInputStream();InputStreamReader isr=new InputStreamReader(in,"UTF-8");/*** 包装为缓冲流字符输入流,可以按行读取字符串*/BufferedReader br=new BufferedReader(isr);String message=null;while((message=br.readLine())!=null){//将当前的发送的消息广播给所有客户端sendMsgToAllClient(message);/*  //System.out.println("客户端说: "+message); //将读取到的信息发送给客户端pw.println(message);*///在服务端上显示System.out.println(message);}} catch (Exception e) {}finally{/*** linux客户端若断开连接,服务端会读取到null* windows的客户端断开连接,服务端会抛出异常* 所以finally是我们最后处理的最佳地点*/System.out.println("客户端下线");/*** 当客户端断开后,将其输出流从共享集合中删除*/removeOut(pw);/*** 输出在线人数*/System.out.println("当前在线人数"+allOut.size());/*** 不同分别关闭输入流与输出流* 关闭socket即可,因为这两个流都是从socket获取的,就好比打电话* 我们最终挂断电话就自然断开了麦克风和听筒一样*/try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}
}

看不懂的可以在下方留言

简单聊天室(java版)相关推荐

  1. java 简单聊天室_java实现简单聊天室单人版

    本文实例为大家分享了java实现简单聊天室的具体代码,供大家参考,具体内容如下 先整理下思路: 1.创建一个通信服务端,传入端口号和相关的流后等待客户端连接,并初始化图形界面. 2.创建一个JFram ...

  2. 简单局域网聊天室--Java版

    Java 的Socket编程: 1.TCP协议是面向连接的.可靠的.有序的.以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低 2.Java中 ...

  3. java web利用mvc结构实现简单聊天室功能

    简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是:         1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进 ...

  4. java jsp聊天系统_java web实现简单聊天室

    目标 servlet.jsp实现简单聊天室,用户通过浏览器登录后进入聊天室,可发送消息进行群聊,点击聊天信息框中的用户名可实现拍一拍功能. 基础知识 数据的存取 setAttribute / getA ...

  5. java web聊天室原理_java web利用mvc结构实现简单聊天室功能

    简单聊天室采用各种内部对象不适用数据库实现. 一个聊天室要实现的基本功能是: 1.用户登录进入聊天室, 2.用户发言 3.用户可以看见别人发言 刚才算是简单的需求分析了,现在就应该是进行mvc结构的设 ...

  6. 视频教程-网络聊天室Java基础版(Socket_Swing编程)仿QQ聊天-Java

    网络聊天室Java基础版(Socket_Swing编程)仿QQ聊天 IT行业资深从业者,7年资深Java高级开发,Java架构师.曾就职银行.电信等行业多家上市公司.担任项目负责人,软件架构师.有丰富 ...

  7. java web聊天室原理_java web实现简单聊天室

    目标 servlet.jsp实现简单聊天室,用户通过浏览器登录后进入聊天室,可发送消息进行群聊,点击聊天信息框中的用户名可实现拍一拍功能. 基础知识 数据的存取 setAttribute / getA ...

  8. node.js入门 - 2.创建一个简单聊天室

    这篇文章将通过开发一个简单聊天室的方式,介绍node.js的net模块. 一.第一版,只向客户端发送信息   我们先实现一个简单的版本,代码如下: var net=require('net'); va ...

  9. JavaSE项目之聊天室swing版

    引子: 当前,互联网 体系结构的参考模型主要有两种,一种是OSI参考模型,另一种是TCP/IP参考模型. 一.OSI参考模型,即开放式通信系统互联参考模型(OSI/RM,Open Systems In ...

最新文章

  1. numpy.ravel() vs numpy.flatten()
  2. 全面讲解Python列表数组(二),列表分区/片,列表操作符,比较操作符,逻辑操作符,连接操作符,重复操作符,成员关系操作符;
  3. 从 Google 的一道面试题谈谈数学基础的重要性
  4. MYSQL基础笔记(三)-表操作基础
  5. P4721 【模板】分治 FFT
  6. C# list删除 另外list里面的元素_C#并发实战Parallel.ForEach使用
  7. MATLAB中前馈+反馈系统搭建-基于matlab控制系统工具箱
  8. HTML5页面如何在手机端浏览器调用相机、相册功能
  9. echarts 世界地图标点_echarts中国地图3D各个城市标点demo
  10. 计算机之父图灵成为新50英镑“代言人”,吴恩达发推:Wonderful!
  11. 【计算机史】早期人类的重要计算工具科普
  12. ubuntu php mysql 乱码,ubuntu 服务器字符乱码问题
  13. 青柠开车Spring Cloud(六) —— Spring Cloud Gateway与zuul使用对比
  14. opencv +python采集识别填涂卡(答题卡)数据
  15. 移动开发的项目管理心得
  16. MKS Robin nano V3.0 主板使用Klipper固件教程
  17. c语言 递归计算P函数
  18. Oracle物化视图的使用总结
  19. 传奇私服开服架设教程 传奇服务端设置教程
  20. 入手评测 r5 5600x和r7 5700g选哪个好

热门文章

  1. JavaScript实现抽奖(jQuery)
  2. 数塔问题(数字三角形)
  3. 在shell 脚本中获取该脚本的所在目录
  4. web前端期末大作业 基于HTML+CSS+JavaScript学生宿舍管理系统
  5. 初探“Android Instant Apps”
  6. 【强化学习PPO算法】
  7. 计算机 社会网络分析,社会网络分析的工具.ppt
  8. php星期代码,PHP星期几获取代码
  9. 美国在线黄页服务提供商YP控股拟竞购雅虎网络资产
  10. 第一次写ssm项目经验总结