前言:下列是本人学习java阶段的一些自我总结,若有错误,欢迎指出
TCP协议
英文名:Transmission Control Protocol
中文名:传输控制协议
协议说明:TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。
举例:打电话,需要双方都接通,才能进行对话
特点:效率低,数据传输比较安全
相比UDP,TCP要求双方建立连接才能通信,通常借助一个服务器实现多人通信
TCP实现多人聊天室
思路:写一个用户类和服务器端类,借助多线程和IO就可以实现多人聊天
代码逻辑很清晰,慢慢看下来一遍都能理解,就不多写注释了
server类:
public class server {// 服务端
// 读取 In
static Socket socket = null;
static ServerSocket serverSocket = null;
public server() {// 构造方法
try {
serverSocket = new ServerSocket(9999);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
System.out.println("************欢迎使用java聊天室*************");
server t = new server();
int count = 0;
while (true) {
try {
socket = serverSocket.accept();
count++;
System.out.println("第" + count + "个客户已连接");
} catch (IOException e) {
e.printStackTrace();
}
Readl r=new Readl(socket);
Print p = new Print(socket);
Thread read = new Thread(r);
Thread print = new Thread(p);
read.start();
print.start();
}
}
}
class Readl implements Runnable{//信息读取类
static List<Socket> socketList=new ArrayList<Socket>();
Socket socket=null;
public Readl(Socket s) {// 构造方法
try {
socketList.add(s);
this.socket=s;
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
// 重写run方法
try {
Thread.sleep(1000);
BufferedReader in = new BufferedReader(new InputStreamReader(this.socket
.getInputStream()));
while (true) {
String jieshou = in.readLine();
System.out.println( jieshou);//在服务端输出信息
for (int i = 0; i < socketList.size(); i++) {//把信息发送到各个客户端
Socket socket=socketList.get(i);
PrintWriter out = new PrintWriter(socket.getOutputStream());
if (socket!=this.socket) {
out.println(jieshou);
}else{
out.println("(你)"+jieshou);
}
out.flush();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Print implements Runnable {//信息发送类
static List<Socket> socketList=new ArrayList<Socket>();
Scanner input = new Scanner(System.in);
public Print(Socket s) {// 构造方法
try {
socketList.add(s);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void run() {
try {
Thread.sleep(1000);
while (true) {
String msg = input.next();
for (int i = 0; i < socketList.size(); i++) {
Socket socket=socketList.get(i);
PrintWriter out = new PrintWriter(socket.getOutputStream());
out.println("服务端说:"+msg);
out.flush();
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
cilent类:
public class client implements Runnable {// 客户端
static Socket socket = null;
static String name=null;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入你的用户名:(班级姓名学号)");
String x=in.next();
client.name=x;
System.out.println("************客户端"+x+"*************");
try {
socket = new Socket("127.0.0.1", 9999);
System.out.println("已经连上服务器了");
} catch (Exception e) {
e.printStackTrace();
}
client t = new client();
Read r = new Read(socket);
Thread print = new Thread(t);
Thread read = new Thread(r);
print.start();
read.start();
}
@Override
public void run() {//信息发送
Scanner input = new Scanner(System.in);
try {
Thread.sleep(1000);
PrintWriter out = new PrintWriter(socket.getOutputStream());
while (true) {
String msg = input.next();
out.println(name+"说:"+msg);
out.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Read implements Runnable {//信息读取
static Socket socket = null;
public Read(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
Thread.sleep(100);
BufferedReader in = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
while (true) {
System.out.println( in.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
先启动服务端,再多次启动客户端就可以实现多人聊天了。