多线程+socket实现多人聊天室
最近在学习多线程的时候打算做一个简单的多线程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实现多人聊天室的更多相关文章
- java socket之多人聊天室Demo
一.功能介绍 该功能实现了一个类似QQ的最简单多人聊天室,如下图所示. 二.目录结构 三.服务端 1)SocketServer类,该类是服务端的主类,主要负责创建聊天窗口,创建监听客户端的线程: pa ...
- 基于Socket实现多人聊天室
当前支持: 1.仅文字 2.加入聊天室提醒 3.退出聊天室提醒 可能出现的BUG: 1.可能出现客户端发送信息后不能及时推送,需要下一个客户端发送信息后一起推送 服务端代码: 1 package co ...
- Java 多线程Socket编程通讯--实现聊天室代码
1.创建服务器类 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import ja ...
- 基于tcp和多线程的多人聊天室-C语言
之前在学习关于网络tcp和多线程的编程,学了知识以后不用一下总绝对心虚,于是就编写了一个基于tcp和多线程的多人聊天室. 具体的实现过程: 服务器端:绑定socket对象->设置监听数-> ...
- 66 网络编程(五)——TCP多线程实现多人聊天室
思路 客户端读写各一个类,可以使内部类,实现Runnable.读写类都与服务器端建立连接,一个收,一个发. 客户端实现接收和转发.多线程实现每个客户端的连接(使与各客户端的连接独立). 服务器端中创建 ...
- 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室
原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室
原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...
- Apache MiNa 实现多人聊天室
Apache MiNa 实现多人聊天室 开发环境: System:Windows JavaSDK:1.6 IDE:eclipse.MyEclipse 6.6 开发依赖库: Jdk1.4+.mina-c ...
- 多人聊天室(Java)
第1部分 TCP和UDP TCP:是一种可靠地传输协议,是把消息按一个个小包传递并确认消息接收成功和正确才发送下一个包,速度相对于UDP慢,但是信息准确安全:常用于一般不要求速度和需要准确发送消息的场 ...
随机推荐
- Python面试题之python是一种什么语言及优缺点
1.说说python是一种什么语言? 参考答案:python是一门动态解释性的强类型定义语言 编译型vs解释型 编译型优点:编译器一般会有预编译的过程对代码进行优化.因为编译只做一次,运行时不需要编译 ...
- 从零开始配置TypeScript + React + React-Router + Redux + Webpack开发环境
转载请注明出处! 说在前面的话: 1.为什么不使用现成的脚手架?脚手架配置的东西太多太重了,一股脑全塞给你,我只想先用一些我能懂的库和插件,然后慢慢的添加其他的.而且自己从零开始配置也能学到更多的东西 ...
- Linux-fdisk磁盘分区命令(16)
名称: fdisk 使用: fdisk [块设备磁盘] 说明: 将一个块设备(磁盘)分成若干个块设备(磁盘),并将分区的信息写进分区表. fdisk命令菜单常用参数如下所示: d:(del)删除一个 ...
- 关于http与https区别
http与https: http叫超文本传输协议,信息为明文传输.https是具有安全性的传输协议,是由http+ssl层,需要到ca申请证书,一般需要费用.信息为加密传输,需要验证用户身份.二者的端 ...
- C#解析XML详解(XPath以及带命名空间NameSpace)
<?xml version="1.0" encoding="utf-8" ?> <bookstore> <book> < ...
- 在ubuntu16.04中一键创建LAMP环境
步骤 1 执行命令apt-get update. 步骤 2 执行命令apt-get install lamp-server^. 步骤 3 在安装过程中会跳出Mysql数据库root用户密码设置窗口,按 ...
- 【JDK1.8】Java 8源码阅读汇总
一.前言 万丈高楼平地起,相信要想学好java,仅仅掌握基础的语法是远远不够的,从今天起,笔者将和园友们一起阅读jdk1.8的源码,并将阅读重点放在常见的诸如collection集合以及concu ...
- win10 UWP 标题栏后退
设置里,标题栏有后退按钮 在win平板,可以有后退键,手机也有 pc可以在标题栏 在OnLaunched //最后 Windows.UI.Core.SystemNavigationManager.Ge ...
- WiFi万能钥匙4.1.32接口
做Key4WiFi时提取的接口 部分代码来自于 http://zke1ev3n.me/2016/04/06/WiFi%E4%B8%87%E8%83%BD%E9%92%A5%E5%8C%99%E6%8E ...
- 转:C++输入一行字符串的一点小结
原文链接: http://www.wutianqi.com/?p=1181 大家在学习C++编程时,一般在输入方面都是使用的cin.而cin是使用空白(空格,制表符和换行符)来定字符串的界的.这就导致 ...