多线程+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慢,但是信息准确安全:常用于一般不要求速度和需要准确发送消息的场 ...
随机推荐
- ch4-计算属性(表达式计算 computed methods watchers)
1 计算属性 1.1 模板内的表达式是非常便利的,但是它们实际上只用于简单的运算. 在模板中放入太多的逻辑会让模板过重且难以维护. <div id="test1"> { ...
- Java集合源码分析(二)Linkedlist
前言 前面一篇我们分析了ArrayList的源码,这一篇分享的是LinkedList.我们都知道它的底层是由链表实现的,所以我们要明白什么是链表? 一.LinkedList简介 1.1.LinkedL ...
- 【转】IO流程
原文地址:http://blog.chinaunix.net/uid-26922071-id-3954900.html IO之流程与buffer概览 为了说明这个流程,还是用图来描述一下比较直观. ...
- Centos 7.0 execute yum update ——File "/usr/libexec/urlgrabber-ext-down", line 75, in <module> 解决方式
[打开这个文件:/usr/lib/python2.7/site-packages/urlgrabber/grabber.py找到elif errcode in (42, 55,56) 用 eli ...
- angular.js基础
内置指令 所有的内置指令的前缀都为ng,不建议自定义指令使用该前缀,以免冲突.首先从一些常见的内置指令开始.先列出一些关键的内置指令,顺便简单说说作用域的问题. ng-model 将表单控件和当前作用 ...
- LeetCode 31. Next Permutation (下一个排列)
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- LaunchScreen.storyboard 换图的问题
之前设置了`LaunchScreen.storyboard`,在这个storyboard中加了一个imageView,里面设置了一张图片launch.png,今天需要更换这个启动图片,我就直接去工程里 ...
- 径向基网络(RBF network)
来源:http://blog.csdn.net/zouxy09/article/details/13297881 1.径向基函数 径向基函数(Radical Basis Function,RBF)方法 ...
- POJ1222EXTENDED LIGHTS OUT(高斯消元)
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11815 Accepted: 7 ...
- Is It A Tree?
Is It A Tree? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...