这是本人从其他地方学习到的关于聊天室的一个模本,我从中截取了一部分关于客户端和服务端通信的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 {
//客户端用于与服务端通信的socket
private Socket socket;
/**
*初始化客户端相关内容
*/
public Client(){
try {
/**
* 实例化socket的过程就是连接的过程通常我们要传入两个参数
* 1:字符串,服务器的IP地址
* 2:整数,服务器端申请的端口号
* (serversocket创建时申请的端口号:8088)
*/
System.out.println("尝试连接");
//此处的localhost可以改为运行服务端的那台电脑的的ip地址这样就可以连在一起聊天了
//localhost指的是本机的ip
socket =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 web利用mvc结构实现简单聊天室功能

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

  2. 基于TCP协议的聊天室控制台版

    我之前写过一篇博客,主要是基于TCP协议实现的聊天室swing版,在此再写一个基于TCP协议实现的聊天室控制台版,便于学习和比较. package 聊天室console版.utils; import ...

  3. SpringBoot 搭建简单聊天室

    SpringBoot 搭建简单聊天室(queue 点对点) 1.引用 SpringBoot 搭建 WebSocket 链接 https://www.cnblogs.com/yi1036943655/p ...

  4. JavaSE项目之聊天室swing版

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

  5. 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

    基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...

  6. Python Socket 简单聊天室2

    上篇文章写了一个简单的单线程的一问一答的简单聊天室.这次我们使用SocketServer模块搭建一个多线程异步的聊天室. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  7. Asp.Net SignalR - 简单聊天室实现

    简单聊天室 使用持久链接类我们就可以做一些即时通讯的应用了,我使用Group做了一个简单的聊天室,先上图技术细节下面再讲 可以加入聊天室.创建聊天室.发送消息,下面就说说我是如何通过Group做出来的 ...

  8. ASP.NET SingalR + MongoDB 实现简单聊天室(一):搭建基本框架

    ASP.NET SingalR不多介绍.让我介绍不如看官网,我这里就是直接上源代码,当然代码还是写的比较简单的,考虑的也少,希望各位技友多多提意见. 先简单介绍聊天室功能: 用户加入聊天室,自动给用户 ...

  9. 利用socket.io+nodejs打造简单聊天室

    代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...

随机推荐

  1. Django学习(四)---Admin配置

    1)Admin: admin是django自带的功能强大的自动化数据管理界面 被授权的用户可以直接在Admin中管理数据库(增.删.改.查) Django提供了许多针对Admin的定制功能 2)配置A ...

  2. WNMP(Windows + Nginx + PHP + MySQL) 安装

    最近在开发一个新的项目,环境用的是: Nginx1.10.3  下载地址: http://nginx.org/en/download.html  下载windows版本包 PHP 7.1.1  下载地 ...

  3. 解决React Native unable to load script from assets index.android.bundle on windows

    React Native运行的时候,经常碰到React Native unable to load script from assets index.android.bundle on windows ...

  4. Linux服务器学习(一)

    一.首先连接服务器 下载一个windows下连接linux的ssh工具,我这里用的putty.一次填入HostName(主机名,可以是服务器域名也可以是对应的ip).Port(端口号默认为22).Co ...

  5. Android - Fragment (三)不同Fragment之间的通信

    在Fragment的java文件中,可以使用getActivity()来获得调用它的activity, 然后再找到另一个Fragment,进行通信 getActivity().getFragmentM ...

  6. 玩玩微信公众号Java版之三:access_token及存储access_token

    微信官方参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183   基本说明: access_token是 ...

  7. hdu_3746: Cyclic Nacklace

    题目链接 给出一个字符串,你可以通过在首尾加入字符使其变成一个具有周期T(T>=2)的字符串,求所需加入的最少字符数. 所考察算法仍然是对next数组含义的理解 #include<cstd ...

  8. nopCommerce 3.9 大波浪系列 之 事件机制(生产者、消费者)

    一.nop事件机制简介 应用场景:客户支付成功后,需要发送短信.邮件告知客户订单支付成功(短信.邮件由不同模块实现) 实现方法: 1.定义支付成功OrderPaidEvent事件. 2.定义短信,邮箱 ...

  9. JavaScript 学习推荐

    主要是个人的学习网站,书籍推荐,还有个人学习经历,以及一些学习经验或技巧 JavaScript学习网站推荐 如果想快速入门,这些是很推荐的网站      快速入门,很快能让你了解前端,有什么,做什么, ...

  10. jmeter断言:断言条件之间是“或”的关系

    有时,我们在做断言时,需要同时满足一系列条件,这在jmeter自带响应断言中已经实现: 有时,同一请求在不同时间,返回的响应是不同的,而这都是正确的响应,也就是说,我们判断的条件之间是或的关系,此时, ...