原理是通过套字节,两边各自有一个Socket,在两边都确定了ip地址与端口号后,通过socket传输io数据流(内容)可以实现简单的”一问一答“的聊天。
服务器可同时接受多人发起聊天连接(多个客户端可同时与服务器通信)
服务器端
package com.tedu;
/**
* @author Myli
* @create 2023-02-14 10:47
* 这个类用来当做回声案例的服务器端
* 1.启动服务器
* 2.接收客户端的连接请求
* 3.给每个用户分配对应的话务员
* 4.话务员:主要负责和对应的客户端对象进行沟通I/O
*/
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**1.创建优化后的Server类,充当服务器端*/
public class net {
/**2.创建方法,负责服务多个客户*/
public void service() {
/**3.匿名对象+匿名内部类(重写run方法)*/
new Thread() {
/**5.把业务写在run()中*/
@Override
public void run() {
try {
//5.1 启动服务器,设置端口号为8000并等待客户端连接
ServerSocket ss = new ServerSocket(8000);
System.out.println("服务器启动成功!");
while (true) {//死循环,一直accept,也就是接受客户端的连接请求
//5.2 一直接受所有客户端的连接请求
Socket socket = ss.accept();
System.out.println("客户端连接成功!");
//5.3 给每个客户分配自己对应的话务员,1v1
HuaWuThread t = new HuaWuThread(socket);//创建话务员内部类,主要负责和客户端沟通
t.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
;
}.start();/**4.启动线程*/
}
/**6.创建话务员内部类,主要负责和客户端沟通 I/O*/
class HuaWuThread extends Thread {
//6.1 定义本类中的成员变量socket,用来保持通话
Socket socket;
//6.2含参构造,接受当前的连接信息,保持通话,为谁服务就保存谁的数据
public HuaWuThread(Socket socket) {
this.socket = socket;
}
//6.3把话务员的业务放在run(),一直读取客户端发来的数据,并作出回应
@Override
public void run() {
try {
//7.1读取一行BufferedReader,并且写出一行PrintWriter --双向流
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(
new OutputStreamWriter(socket.getOutputStream()));
//7.2读取客户端发来的一行数据
String line;//定义变量,记录读取到的一行数据
while ((line = in.readLine()) != null) {//只要有数据就一直读
System.out.println("客户端发来的数据:" + line);
//7.1可以给客户端作出响应-接收键盘输入的响应
System.out.println("请输入您的回应:");
String input = new Scanner(System.in).nextLine();
//7.2发出作为服务器的响应
out.println(input);
out.flush();//把数据发出去
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
net s = new net();
//服务器网络启动
s.service();
}
}
客户端
package cn.tedu;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
/**
* @author Myli
* @create 2023-02-14 10:51
*/
public class Client {
public static void main(String[] args) {
try {
//1.连接指定的服务器,同时指定服务器的IP和端口号
Socket socket = new Socket("127.0.0.1", 8000);
//2.给服务器发送数据
while (true) {
//向服务器写出一行数据,并且读取服务器响应回来的数据
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//3.通过流对象进行发送和读取的操作
System.out.println("请输入您想给服务器发送的数据:");
String input = new Scanner(System.in).nextLine();
out.println(input);//向服务端发送指定数据
out.flush();//把数据刷出去
String line = in.readLine();//读取回声数据
System.out.println("服务器端响应的数据是:" + line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
此为实例,有具体的socket问题可以看思路链接: link 拓展的话,看有没有时间接着拓展。