java socket之多人聊天室Demo
一、功能介绍
该功能实现了一个类似QQ的最简单多人聊天室,如下图所示。

二、目录结构

三、服务端
1)SocketServer类,该类是服务端的主类,主要负责创建聊天窗口,创建监听客户端的线程:
package multiThreadChatSocketServer; import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; public class SocketServer {
private TextArea ta;
private TextField tf; private ServerSocket ss;
private Socket s;
private DataInputStream dis;
private DataOutputStream dos; public TextField getTextField() {
return tf;
} public TextArea getTextArea() {
return ta;
} public DataInputStream getDataInputStream() {
return dis;
} public DataOutputStream getDataOutputStream() {
return dos;
} public static void main(String[] args) {
SocketServer socketServer = new SocketServer();
socketServer.createUI();
socketServer.connect();
socketServer.createThread();
} public void close() {
try {
dis.close();
dos.close();
s.close();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 创建界面
*/
private void createUI(){
Frame f=new Frame("socketServer");
ta = new TextArea();
tf = new TextField();
Button send = new Button("send"); Panel p = new Panel();
p.setLayout(new BorderLayout());
p.add(tf, "Center");
p.add(send, "East"); f.add(ta, "Center");
f.add(p, "South"); MyServerListener listener = new MyServerListener(this);
//不管点击发送按钮还是输入框回车,都会触发listener事件
send.addActionListener(listener);
tf.addActionListener(listener);
//当关闭窗口的时候,退出系统
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setSize(400,400);
f.setVisible(true);
} /**
* 创建连接
*/
public void connect(){
try {
ss=new ServerSocket(8888);
s=ss.accept();
dis=new DataInputStream(s.getInputStream());
dos=new DataOutputStream(s.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 启动监听客户端发来的消息的线程
*/
public void createThread() {
MyServerReader reader = new MyServerReader(this);
reader.start();
}
}
2)MyServerReader类,该类实时监听客户端输入的信息,如果对方输入“bye”,则退出监听并关闭窗口
package multiThreadChatSocketServer; import java.awt.TextArea;
import java.io.DataInputStream;
import java.io.IOException; /**
* 监听客户端发过来的消息,关显示在服务端的界面上
* @author Administrator
*
*/
class MyServerReader extends Thread {
private SocketServer server;
public MyServerReader(SocketServer server) {
this.server = server;
}
public void run() {
String info;
DataInputStream dis = server.getDataInputStream();
TextArea ta = server.getTextArea();
try {
while (true) {
info = dis.readUTF();
ta.append("对方说: " + info + "\n");
if (info.equals("bye")) {
server.close();
System.exit(0);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3)MyServerListener类,是点发送按钮的时候执行的类
package multiThreadChatSocketServer; import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException; /**
* 当点击发服务端的送按钮的时候,将信息显示在服务端的界面上,并将信息发送给客户端
* @author Administrator
*
*/
class MyServerListener implements ActionListener {
private SocketServer server; public MyServerListener(SocketServer server) {
this.server = server;
} public void actionPerformed(ActionEvent e) {
TextField tf = server.getTextField();
String info = tf.getText();
server.getTextArea().append("自己说: " + info + "\n");
try {
// writeUTF(value:String) :将 UTF-8 字符串写入字节流。先写入以字节表示的 UTF-8 字符串长度(作为 16 位整数),然后写入表示字符串字符的字节。
// 因为先把字符长度写入二进制,16位能保存的字节长度为65535,超出这个长度会报RangeError。
// writeUTFBytes(value:String):不添加字节长度直接写入字符串的字节数据。因此在读取的时候需要指定字节长度
server.getDataOutputStream().writeUTF(info);
} catch (IOException e1) {
e1.printStackTrace();
}
if (info.equals("bye")) {
server.close();
System.exit(0);
}
tf.setText("");
tf.requestFocus();
}
}
四、客户端
1)SocketClient类
package multiThreadChatSocketClient; import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; public class SocketClient {
private TextArea ta;
private TextField tf; private Socket s;
private DataInputStream dis;
private DataOutputStream dos; public TextField getTextField() {
return tf;
} public TextArea getTextArea() {
return ta;
} public DataInputStream getDataInputStream() {
return dis;
} public DataOutputStream getDataOutputStream() {
return dos;
} public static void main(String[] args) {
SocketClient socketClient = new SocketClient();
socketClient.createUI();
socketClient.connect();
socketClient.createThread();
} public void close() {
try {
dis.close();
dos.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 创建界面
*/
private void createUI(){
Frame f=new Frame("socketClient");
ta = new TextArea();
tf = new TextField();
Button send = new Button("send"); Panel p = new Panel();
p.setLayout(new BorderLayout());
p.add(tf, "Center");
p.add(send, "East"); f.add(ta, "Center");
f.add(p, "South"); MyClientListener listener = new MyClientListener(this);
//不管点击发送按钮还是输入框回车,都会触发listener事件
send.addActionListener(listener);
tf.addActionListener(listener);
//当关闭窗口的时候,退出系统
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
f.setSize(400,400);
f.setVisible(true);
} /**
* 创建连接
*/
public void connect(){
try {
s = new Socket("127.0.0.1", 8888);
dis=new DataInputStream(s.getInputStream());
dos=new DataOutputStream(s.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 启动监听服务端发来的消息的线程
*/
public void createThread() {
MyClientReader reader = new MyClientReader(this);
reader.start();
}
}
2)MyClientReader类
package multiThreadChatSocketClient; import java.awt.TextArea;
import java.io.DataInputStream;
import java.io.IOException; /**
* 监听服务端发过来的消息,关显示在客户端的界面上
* @author Administrator
*
*/
class MyClientReader extends Thread {
private SocketClient client;
public MyClientReader(SocketClient client) {
this.client = client;
}
public void run() {
String info;
DataInputStream dis = client.getDataInputStream();
TextArea ta = client.getTextArea();
try {
while (true) {
info = dis.readUTF();
ta.append("对方说: " + info + "\n");
if (info.equals("bye")) {
client.close();
System.exit(0);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3)MyClientListener类
package multiThreadChatSocketClient; import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException; /**
* 当点击客户端的发送按钮的时候,将信息显示在客户端的界面上,并将信息发送给服务端
* @author Administrator
*
*/
class MyClientListener implements ActionListener {
private SocketClient client; public MyClientListener(SocketClient client) {
this.client = client;
} public void actionPerformed(ActionEvent e) {
TextField tf = client.getTextField();
String info = tf.getText();
client.getTextArea().append("自己说: " + info + "\n");
try {
client.getDataOutputStream().writeUTF(info);
} catch (IOException e1) {
e1.printStackTrace();
}
if (info.equals("bye")) {
client.close();
System.exit(0);
}
tf.setText("");
tf.requestFocus();
}
}
java socket之多人聊天室Demo的更多相关文章
- 多线程+socket实现多人聊天室
最近在学习多线程的时候打算做一个简单的多线程socke聊天的程序,结果发现网上的代码都没有完整的实现功能,所以自己实现了一个demo: demo功能大致就是,有一个服务端负责信息转发,多个客户端发送消 ...
- 基于Socket实现多人聊天室
当前支持: 1.仅文字 2.加入聊天室提醒 3.退出聊天室提醒 可能出现的BUG: 1.可能出现客户端发送信息后不能及时推送,需要下一个客户端发送信息后一起推送 服务端代码: 1 package co ...
- 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 ...
- 多人聊天室(Java)
第1部分 TCP和UDP TCP:是一种可靠地传输协议,是把消息按一个个小包传递并确认消息接收成功和正确才发送下一个包,速度相对于UDP慢,但是信息准确安全:常用于一般不要求速度和需要准确发送消息的场 ...
- java小程序---简陋版多人聊天室
功能需求: 1 每运行一次主函数,创建一个客户端聊天界面; 2 客户端界面分三块,公屏(显示所有客户端发送的信息),私屏(用于输入个人想要发送的信息),发送按钮(点击一次,将客户端信息发送到服务端) ...
- java swing+socket实现多人聊天程序
swing+socket实现多人聊天程序 1.准备工作 先看效果: 客户端项目结构图: 服务端项目结构图: 2.运行原理 服务端 先开一个线程serverListerner,线程中开启一个Server ...
- Socket.io官方聊天室DEMO的学习笔记
照着Socket.io官方的聊天室代码敲了一遍,遇到了一个奇怪的问题: 每次点击SEND按钮的时候,都会重新刷新页面. 在点击页面的一瞬间,看到了正在加载jquery的提示, 然后以为是jquery用 ...
随机推荐
- eclipse启动出现Could not read metadata for ……
Could not read metadata for …… E:\workspace\.metadata\.plugins\org.eclipse.core.resources\.projects\ ...
- Topological Sorting拓扑排序
定义: Topological Sorting is a method of arranging the vertices in a directed acyclic graph (DAG有向无环图) ...
- Java 获取CPU、内存、外网IP等硬件信息
import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.Input ...
- 【C++】:STL迭代器使用---[容器::iterator iter;]
参考文章:http://blog.csdn.net/qq_23100787/article/details/51388163 迭代器这种东西,就是为了使访问简单!! 容器::iterator iter ...
- javascript 生存周期
生存周期: 局部 JavaScript 变量 在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它.(该变量的作用域是局部的). 您可以在不同的函数中使用名 ...
- 定时器中的this和函数封装的简单理解;
一.定时器中的this: 不管定时器中的函数怎么写,它里面的this都是window: 在函数前面讲this赋值给一个变量,函数内使用这个变量就可以改变this的指向 二.函数封装 函数封装是一种函数 ...
- c#程序设计原则
单一职责 开闭原则:对扩展开放,对修改封闭. 方法 的职责,一个方法做的事越多,造成问题的可能性会增加. 解决的方法1:就是分拆2:写单独类
- H5C3动画
1 渐变 /* 渐变:不同颜色之间的柔和过渡 线性渐变:沿着某条直线发生渐变效果 注意:渐变准备来说是一张背景图 语法:linear-gradient */ background-image: lin ...
- 20165213 java学习第一周
20165213 -2018-2<Java程序设计>第一周学习总结 教材学习内容总结 java的四个特点:面向对象.平台无关性.动态性.简单. java编写程序步骤:再有jdk的情况下,先 ...
- 类名.class 与 类名.this 详解
类名.class 与 类名.this 详解 今天在看 PropertyPlaceholderConfigurer 源码时,突然看到一个 PropertyPlaceholderConfigurer.th ...