最近在学习多线程的时候打算做一个简单的多线程socke聊天的程序,结果发现网上的代码都没有完整的实现功能,所以自己实现了一个demo:

demo功能大致就是,有一个服务端负责信息转发,多个客户端发送消息,当一个客户端发送消息时,其他的客户端都可以接受到。

服务端:

客户端:

客户端代码:

package com.cky.client;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner; public class Client {
private PrintWriter out;
//private BufferedReader br;
private Scanner scan;
private Boolean flag=true;
private Socket s;
private InputStream is; public Client() throws UnknownHostException, IOException {
s=new Socket("127.0.0.1", 5001);
is=s.getInputStream();
} public static void main(String []args) throws UnknownHostException, IOException {
Client client =new Client();
client.startup();
}
public void startup() throws UnknownHostException, IOException {
out = new PrintWriter(s.getOutputStream(), true); //开启一个线程监听服务端的消息
Thread ct=new Thread(new Runnable() {
@Override
public void run() {
while(true) {
if(!flag) break;
try {
receive();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
ct.start();
//主线程负责发送消息
System.out.println("请输入你的用户名:");
scan = new Scanner(System.in);
String name=scan.nextLine();
out.println(name);
System.out.println(name+",欢迎进入聊天室,输入quit退出");
while(flag) {
String read=scan.nextLine();
if(read.equalsIgnoreCase("quit")) {
flag=false;
}
//System.out.println(read);
out.println(read);
}
s.close();
} public void receive() throws IOException {
byte ss[]=new byte[1024];
int length=s.getInputStream().read(ss);
System.out.println(new String(ss,0,length));
}
}

服务端代码:

package com.cky.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List; public class Server {
private List<ThreadServer> clients=new ArrayList<ThreadServer>();
public void startup() throws IOException {
System.out.println("监听5001端口");
ServerSocket ss=new ServerSocket(5001);
while(true){
Socket socket=ss.accept();
System.out.println("发现新用户");
Thread st=new Thread(new ThreadServer(socket));
st.start();
}
} public class ThreadServer implements Runnable{
private Socket socket;
private BufferedReader br;
private PrintWriter out;
private String name;
private Boolean flag=true;
public ThreadServer(Socket socket) throws IOException {
this.socket=socket;
br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
out=new PrintWriter(socket.getOutputStream(),true);
String str=br.readLine();
name=str+"["+socket.getInetAddress().getHostAddress()+":"+socket.getPort()+"]";
System.out.println(name+"加入该聊天室");
send(name+"加入该聊天室");
clients.add(this);
}
private void send(String message) {
for (ThreadServer threadServer : clients) {
System.out.println("-->已向线程"+threadServer.name+"发送消息");
threadServer.out.print(message);
threadServer.out.flush();
}
}
private void receive() throws IOException {
String message;
while(flag=true) {
message=br.readLine();
if(message.equalsIgnoreCase("quit")) {
System.out.println("用户"+name+"退出了");
out.println("quit");
out.flush();
clients.remove(this);
flag=false;
}
System.out.println(name+":"+message);
send(name+":"+message);
}
}
@Override
public void run() {
try {
while(flag=true) {
receive();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} public static void main(String []args) throws IOException {
Server server=new Server();
System.out.println("服务器开启");
server.startup();
} }

先启动服务端,监听端口,再使用客户端登录发送消息。

多线程+socket实现多人聊天室的更多相关文章

  1. java socket之多人聊天室Demo

    一.功能介绍 该功能实现了一个类似QQ的最简单多人聊天室,如下图所示. 二.目录结构 三.服务端 1)SocketServer类,该类是服务端的主类,主要负责创建聊天窗口,创建监听客户端的线程: pa ...

  2. 基于Socket实现多人聊天室

    当前支持: 1.仅文字 2.加入聊天室提醒 3.退出聊天室提醒 可能出现的BUG: 1.可能出现客户端发送信息后不能及时推送,需要下一个客户端发送信息后一起推送 服务端代码: 1 package co ...

  3. Java 多线程Socket编程通讯--实现聊天室代码

    1.创建服务器类 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import ja ...

  4. 基于tcp和多线程的多人聊天室-C语言

    之前在学习关于网络tcp和多线程的编程,学了知识以后不用一下总绝对心虚,于是就编写了一个基于tcp和多线程的多人聊天室. 具体的实现过程: 服务器端:绑定socket对象->设置监听数-> ...

  5. 66 网络编程(五)——TCP多线程实现多人聊天室

    思路 客户端读写各一个类,可以使内部类,实现Runnable.读写类都与服务器端建立连接,一个收,一个发. 客户端实现接收和转发.多线程实现每个客户端的连接(使与各客户端的连接独立). 服务器端中创建 ...

  6. 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室

    原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  7. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  8. Apache MiNa 实现多人聊天室

    Apache MiNa 实现多人聊天室 开发环境: System:Windows JavaSDK:1.6 IDE:eclipse.MyEclipse 6.6 开发依赖库: Jdk1.4+.mina-c ...

  9. 多人聊天室(Java)

    第1部分 TCP和UDP TCP:是一种可靠地传输协议,是把消息按一个个小包传递并确认消息接收成功和正确才发送下一个包,速度相对于UDP慢,但是信息准确安全:常用于一般不要求速度和需要准确发送消息的场 ...

随机推荐

  1. 寻找bug并消灭系列——记录在Android开发所遇到的bug(二)

    bug 1: bug描述: 无法成功地将edittext中的内容传入数据库中 bug动图: 经过: 最近写了个项目,项目要使用到SQL数据库,由于没有相关知识,便是找到了各种资料开始了自学之旅,在de ...

  2. 从零开始配置TypeScript + React + React-Router + Redux + Webpack开发环境

    转载请注明出处! 说在前面的话: 1.为什么不使用现成的脚手架?脚手架配置的东西太多太重了,一股脑全塞给你,我只想先用一些我能懂的库和插件,然后慢慢的添加其他的.而且自己从零开始配置也能学到更多的东西 ...

  3. MSSQL查询数据分页

    这几天刚好碰到数据的分页查询,觉得不错,Mark一下,方法有两种,都是使用select top,效率如何就不在这讨论 方法1:利用select top配合not in(或者not exists),查询 ...

  4. MVC 中获取Json数据

    @{ ViewBag.Title = "json示例项目"; } @Scripts.Render("~/bundles/jquery") <h2>j ...

  5. C#线程池多线程Socket通讯 服务器端和客户端示例

    using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; ...

  6. JavaWeb基础之JdbcUtils工具类1.0

    2016年12月20日,第一次学习JDBC.看的是传智播客崔希凡老师的视频,东北口音很是风趣幽默,技术之牛让人膜拜.2017年9月21日,再次重温web知识,分享JdbcUtils工具类,用以接下来的 ...

  7. 【转载】WAI-ARIA无障碍网页应用属性完全展示

    文章转载自 张鑫旭-鑫空间-鑫生活 http://www.zhangxinxu.com/wordpress/ 原文链接:http://www.zhangxinxu.com/wordpress/?p=2 ...

  8. pycharm快捷键(转载)

    1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt + Space 快速导入任意类Ctrl + Shift + Enter 语句完成Ctrl + ...

  9. Mysql数据库之auto_increment

    一.概述 在数据库应用中,我们经常需要用到自动递增的唯一编号来标识记录.在MySQL中,可通过数据列的auto_increment属性来自动生成.可在建表时可用“auto_increment=n”选项 ...

  10. jQuery图片轮播(一)轮播实现并封装

      利用面向对象自己动手写了一个封装好的jquery轮播对象,可满足一般需求,需要使用时只需调用此对象的轮播方法即可. demo:https://github.com/zsqosos/shopweb ...