基于Java+socket实现多线程聊天室-控制台版
- 一、系统介绍
- 二、功能展示
- 1.运行效果
- 三、代码展示
- 四、其它
- 1.其他系统实现
- 2.获取源码
一、系统介绍
首先启动server端,然后启动client端。任意一个client发送给server的消息都将会被转发给所有在线的client,实现了一个聊天室功能。
client发送exit指令可以下线,所有的client端,以及server端都会收到它的下线通知。
原理
socket 通信是基于TCP/IP 网络层上的一种传送方式。
首先,服务端初始化ServerSocket,然后对指定的端口(这里是65000)进行绑定,接着对端口进行监听,通过调用accept方法阻塞,此时,如果客户端有一个socket连接到服务端,那么服务端通过监听和accept方法可以与客户端进行连接,就创建了一个客户端线程。
然后就是客户端的启动和连接了,在服务端socket启动之后,启动客户端连接ServerSocket,这里实现了多线程,可以同时连接多个客户端。这里多线程方面使用了线程池,线程池的作用是:
- 线程复用,减少创建线程耗时;
- 防止短时间内高并发,指定线程池大小,超过数量将等待,防止短时间创建
大量线程导致资源耗尽,服务挂掉。
二、功能展示
1.运行效果
三、代码展示
package wechat;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
import java.io.*;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;
public class WeChatClient {
Socket clientSocket = null;
BufferedReader reader = null;
private static final int PORT = 65000;
public static void main(String[] args) throws IOException {
new TCPClient();
System.exit(0); //client退出后自动结束此进程
}
//客户端逻辑写在构造方法中
public TCPClient() {
clientSocket = new Socket();
try {
clientSocket.connect(new InetSocketAddress("localhost", PORT));
new getInputStream().start();
System.out.println("Client started!");
reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String receiveStr = null;
while ((receiveStr = reader.readLine()) != null) {
//接收服务端发来的数据
if (receiveStr.equals("exit")) {
//如果发送exit,服务端会回传exit,这里判断回传的是不是exit。是的话就结束此线程
break;
}
System.out.println(receiveStr);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//exit -> 关闭客户端套接字、线程、BufferReader
try {
if (reader != null) {
reader.close();
}
if (clientSocket != null) {
clientSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//客户端线程,用于向服务端写入从客户端控制台输入的数据
class getInputStream extends Thread {
@Override
public void run() {
BufferedReader is = null;
PrintWriter os = null;
try {
is = new BufferedReader(new InputStreamReader(System.in));
os = new PrintWriter(new BufferedOutputStream(clientSocket.getOutputStream()));
String str = null;
while ((str = is.readLine()) != null) {
os.println(str);
os.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
四、其它
1.其他系统实现
Java+Swing实现学生选课管理系统
Java+Swing实现学校教务管理系统
Java+Swing+sqlserver学生成绩管理系统
Java+Swing用户信息管理系统
Java+Swing实现的五子棋游戏
基于JavaSwing 银行管理系统
Java+Swing+mysql仿QQ聊天工具
Java+Swing 聊天室
Java+Swing+dat文件存储实现学生选课管理系统
Java+Swing可视化图像处理软件
Java+Swing学生信息管理系统
Java+Swing图书管理系统
Java+Swing图书管理系统2.0
基于java+swing+mysql图书管理系统3.0
大作业-基于java+swing+mysql北方传统民居信息管理系统
2.获取源码
点击下载
基于Java+socket实现多线程聊天室-控制台版