基于TCP/IP通信协议的聊天室
概述:
- 基于TCP/IP通信协议的聊天室是通过服务端/客户端的模式进行的,必须是服务端开启之后,客户端通过获取服务端的ip和端口号并连接之后才能进行信息的共享,具体的实现过程代码如下:
package cs聊天室;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* 服务端
* @author 黄小宝
*
*/
public class MyServer {
//定义一个集合用来存储所有连接到服务器的客户端socket,并将其包装成线程安全的
static volatile List<Socket> socketList = new ArrayList<>();
public static void main(String[] args) throws IOException {
//创建一个服务器
ServerSocket server=new ServerSocket(9999);
System.out.println("服务器已创建,等待连接.......");
while(true) {
//开始监视,这个时候,如果没有客户端连接,这里会被一直阻塞
Socket s=server.accept();
System.out.println(s.getInetAddress().getHostName()+"连接成功");
socketList.add(s);
//每当一个客户端连接后,就开启一个线程为该客户服务
new ServerThread(s).start();
}
}
}
- 这个是服务端,即服务器,里面定义了端口号,因为是本机,所以在创建ServerSocket对象时,没有添加ip地址,这个类的作用是创建一个服务器并开启服务器,将开启过程放在while循环里面,可以无限的接收来自客户端的连接,并为每一个连接到服务器的客户端创建一个线程。
package cs聊天室;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
/**
* 服务端线程, 他负责为每一个客户端提供线程服务
* @author 黄小宝
*
*/
public class ServerThread extends Thread {
//定义当前线程需要处理的socket
private Socket s;
public ServerThread(Socket s) {
super();
this.s = s;
}
@Override
public void run() {
//采用循环不断的读取从socket发过来的信息
try {
System.out.println("欢迎使用!!!");
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
String content = null;
while((content=br.readLine())!=null){
//遍历集合中的每一个socket,将读到的类容给每个socket都发一次
for(Socket s:MyServer.socketList) {
PrintStream ps=new PrintStream(s.getOutputStream());
ps.println(content);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 这个类是一个线程类,是服务器用来处理来自每一个客户端访问的线程,他可以实现将所有客户端发送的消息全部发送给每一个其他的客户端,达到群聊里面每一个客户端都能够看到所发的消息
package cs聊天室;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
* @author 黄小宝
*
*/
public class MyClient {
public spackage cs聊天室;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 客户端
* @author 黄小宝
*
*/
public class MyClient {
public static void main(String[] args) throws UnknownHostException, IOException {
//创建客户端
Socket s= new Socket("192.168.7.141",8888);
//启动线程,不断的读取来自服务器的数据
new ClientThread(s).start();
//获取socket对应的输出流
PrintStream ps=new PrintStream(s.getOutputStream());
String line=null;
//不断的读取键盘输入
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
while((line=br.readLine())!=null) {
//将用户的键盘输入类容写入socket对应的输出流
ps.println(line);
}
}
}
tatic void main(String[] args) throws UnknownHostException, IOException {
//创建客户端
Socket s= new Socket("192.168.7.141",8888);
//启动线程,不断的读取来自服务器的数据
new ClientThread(s).start();
//获取socket对应的输出流
PrintStream ps=new PrintStream(s.getOutputStream());
String line=null;
//不断的读取键盘输入
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
while((line=br.readLine())!=null) {
//将用户的键盘输入类容写入socket对应的输出流
ps.println(line);
}
}
}
- 这是客户端,可以通过建立Socket对象来连接到服务器,因为每一个客户端都需要接收来自服务器发送的消息,所以这里要再创建一个客户端的线程用来无限的接收来自服务器的消息
package cs聊天室;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* 客户端线程
* @author 黄小宝
*
*/
public class ClientThread extends Thread {
//该线程负责处理的socket
private Socket s;
public ClientThread(Socket s) {
this.s = s;
}
@Override
public void run() {
String content = null;
//不断的读取socket输入流中的内容,并将这些内容打印出来
try {
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
while((content=br.readLine())!=null) {
System.out.println(content);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 到这里所有的代码已经写完了,接下来就是测试的环节:首先需要开启服务器,注意,必须先要开启服务器,然后客户端才可以连接:
打开服务器之后 :
服务器已创建,等待连接.......
打开客户端之后:
服务器已创建,等待连接.......
DESKTOP-HPFJ5AE连接成功
欢迎使用!!!
然后就可以使用多个客户端连接到服务器,在控制台输入消息,每个客户端都能看到各自发的消息了!