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用 ...
随机推荐
- POJ 2230 Watchcow(有向图欧拉回路)
Bessie's been appointed the new watch-cow for the farm. Every night, it's her job to walk across the ...
- Kylin Cube构建过程优化
原文地址:https://kylin.apache.org/docs16/howto/howto_optimize_build.html Kylin将一个cube的build过程分解为若干个子步骤,然 ...
- swift - self的弱引用
1. weak var weakSelf = self 2. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()) {[weak se ...
- Java_6 方法
1方法的定义和使用的注意事项 方法:一些功能整合成一个功能模块 注意事项: a: 方法不能定义在另一个方法的里面 b: 写错方法名字 c: 写错了参数列表 d: 方法返回值是void,方法中可 ...
- 建立SSH的信任关系
1.在Client上root用户执行ssh-keygen命令,生成建立安全信任关系的证书. Client端 # ssh-keygen -t rsa Generating public/private ...
- vue(ajax:axios中文文档)
axios 基于http客户端的promise,面向浏览器和nodejs 特色 浏览器端发起XMLHttpRequests请求 node端发起http请求 支持Promise API 监听请求和返回 ...
- c# sharpsvn 客户端开发总结
判断文件夹是否是 working copy 工作副本两个方法 if (!IsWorkingCopy(localPath))//查看某目录是否是受svn管理的状态, 即是否为工作副本 { notiny ...
- git 本地仓库与远程仓库的连接
在远程如github新建一个项目名称为blog, 本地项目为store,是一个laravel框架项目,首先用 git init初始化本目,然后用git remote add origin git@gi ...
- poj 2886 (线段树+反素数打表) Who Gets the Most Candies?
http://poj.org/problem?id=2886 一群孩子从编号1到n按顺时针的方向围成一个圆,每个孩子手中卡片上有一个数字,首先是编号为k的孩子出去,如果他手上的数字m是正数,那么从他左 ...
- java.lang.AbstractMethodError: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;
在Tomcat下部署应用时会报这个错误,参考以下这篇博客:http://blog.csdn.net/robinsonmhj/article/details/37653189,删除Tomcat目录下we ...