最近在学习多线程的时候打算做一个简单的多线程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. python 多进程间交换信息与共享信息

    多线程调用函数,获取其返回值,个人总结了三种方法: 一.Queue(进程队列) 构造方法:multiprocessing.Queue([maxsize]) Queue.Queue类即是一个队列的同步实 ...

  2. 51nod 1522 上下序列

    题目描述 现在有1到n的整数,每一种有两个.要求把他们排在一排,排成一个2*n长度的序列,排列的要求是从左到右看,先是不降,然后是不升. 特别的,也可以只由不降序列,或者不升序列构成. 例如,下面这些 ...

  3. SQL server 数据库备份大

    首先简单的介绍一下Sql server 备份的类型有: 1:完整备份(所有的数据文件和部分的事务日志文件) 2:差异备份(最后一次完成备份后数据库改变的部分) 3:文件和文件组备份(对指定的文件和文件 ...

  4. Pyhton编程(三)之Pycharm安装及运算符

    一:上节题目解答 1)使用while循环输出 1 2 3 4 5 6 8 9 10(注意:没有7) n=1while n<11: if n==7: pass //pass代码段指代空代码.. e ...

  5. python中时间日期格式化符号:

    %y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01-12) %d 月内中的一天(0-31) %H 24小时制小时数(0-23) %I 12小时制小时数( ...

  6. WordCount项目

    采用的源码来自http://blog.csdn.net/lnz001/article/details/54851551 经修改后,已上传至GitHub.https://github.com/FengX ...

  7. .NET接入接口/请求服务器

    之前只调用过自己写的接口,这个是调用外部接口 一.创建方法链接接口 , string method = "Get", string token = null) { if (stri ...

  8. 锁对象Lock

    Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题: public class LockTest { publicstaticv ...

  9. LeetCode 190. Reverse Bits (反转位)

    Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...

  10. 测试服务搭建之centos7下安装java

    一 安装Java 1 创建普通用户 useradd wujian passwd wujian 提示输入密码:[输入wujian的密码] user:wujian group:root passwd:12 ...