这是本人从其他地方学习到的关于聊天室的一个模本,我从中截取了一部分关于客户端和服务端通信的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. SSH框架 spring 配置中的: scope="prototype"

    "可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理, 避免struts中Action的线程安全问题." 这句话怎么 ...

  2. PHP发送E-mail---新手教程

    首先下载PHPmailer拓展包,其实就是别人封装好的类库,下载链接:http://pan.baidu.com/s/1slbhGo1 首先去163注册个账号,然后登陆进去,点击设置下面的 POP3/S ...

  3. 1. MongoDB 安装和启动

    1. MongoDB是一个Document Database.A record in MongoDB is a document,MongoDB documents are similar to JS ...

  4. 微信公众平台——token验证php版

    这几天开始接触微信公众号的开发,注册这些就不说了,我是先弄了个测试号用着.进入正题 所谓token验证,其实就是微信服务器向自己要用到的服务器url发送一段数据,其中有一个参数$_GET['echho ...

  5. Andorid源码系列:View的onTouchEvent()与performClick(),performLongClick()调用时机解析

    这是大土豆的第一篇博客,想着工作3年多了,在工作上从一名菜鸟逐渐成长为在项目中能干点事的人,自己对Android的见解也一步步加深,有必要写一些对Android代码和开发过程中的感悟,和广大朋友们分享 ...

  6. 如何使用OLAMI自然语言理解开放平台API制作自己的智能对话助手小程序

    我们经常在电影中看到机器和人对答如流,随着越来越多自然语言开放平台的出现,IT爱好者制作一个自己的APP或者小玩具等逐渐可以变为现实. 自然语言对话即你的APP或者你制作的工具.机器人等能够对用户输入 ...

  7. luogu P3398 仓鼠找sugar [LCA]

    题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...

  8. 自带win10的笔记本电脑如何装win7

    网上那么多的装机教程,还有必要专门写一篇装机攻略么?有的,非常必要的!因为真的有很多未知的坑要趟!首先,win10好不好?除了正版,其他没什么好的...如果没有SSD,经常要卡死于磁盘读写.当然,你可 ...

  9. 基于FPGA的VGA显示静态图片

    终于熬到暑假了,记过三四周的突击带考试,终于为我的大二画上了一个完整的句号,接下来终于可以静心去做自己想做的事情了,前一阵子报了一个线上培训班,学学Sobel边缘检测,之前一直在学习图像处理,但是因为 ...

  10. poj 3761 bubble sort (排列组合)

    #include<cstdio> #include<cstring> #define ll long long #define mod 20100713 ; ll a[maxn ...