最近在学习多线程的时候打算做一个简单的多线程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. mysql慢查询分析工具 mysqlsla 安装

    概述 mysqlsla 是一款很不错的mysql慢查询日志分析工具,而且简单易用.mysqlsla 是用perl编写的脚本,运行需要perl-DBI和per-DBD-Mysql两模块的支持.mysql ...

  2. WPF DataGrid Custommization using Style and Template

    WPF DataGrid Custommization using Style and Template 代码下载:http://download.csdn.net/detail/wujicai/81 ...

  3. 学习总结---OVS

    OVS的组成 OVS的匹配条件和动作 OVS的发展方向 OVS的实践 OVS与Namespace配合模拟租户之间的数据通信 基本思路: Namespace模拟出不同的主机,这些主机之间的通信需要通过S ...

  4. js系列教程1-数组操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  5. 我的第一个python web开发框架(7)——本地部署前端访问服务器

    PS:本系列内容进度节奏会放的很慢,每次知识点都尽量少一点,这样大家接触的知识点少了,会更容易理解,因为少即是多.另外,对于后面代码部分,虽然尽量不用那些复杂的封装和类,但它并不表示看了就能全部记住, ...

  6. iOS四种多线程(swift和oc)

    在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项.当然也会给出几种多线程的案例,在实际使用中感受它们的区别.还有一点需要说明的是,这篇文章将会使用 Swift 和 ...

  7. 【转载】基于vw等viewport视区相对单位的响应式排版和布局

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

  8. 转载:WPF MVVM之INotifyPropertyChanged接口的几种实现方式

    原文地址:http://www.cnblogs.com/xiwang/ 序言 借助WPF/Sliverlight强大的数据绑定功能,可以比实现比MFC,WinForm更加优雅轻松的数据绑定.但是在使用 ...

  9. Spring IOC(四)总结

    目录 1.spring容器中Bean生命周期 2.IOC容器中核心接口 3.IOC容器启动流程 4.IOC依赖注入流程 =============正文分割线================== Spr ...

  10. mybatis返回int类型报null

    解决这个问题,是当查出来为NULL时,结一个默认值,如:0. MySQL: SELECT IFNULL(MAX(id),0)AS sort FROM table Oracle: SELECT nvl( ...