使用java实现 多线程 虚拟服务器聊天
记录一下
下面这是根据ServerSocket类实现的虚拟服务器,两台局域网内的客户端进行交流,只能再局域网内,因为这个只是虚拟的服务器。
工具实体类
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
/**
* @author Mxhlin
* @Email fuhua277@163.com
* @Date 2022/09/29/19:47
* @Version
* @Description
*/
public class Utils {
private PrintWriter writer;// 输出
private BufferedReader reader;// 读取
private String title;// 标题命名
// 发消息
public void a (){
while (true){
String inif = title+":"+new Scanner(System.in).nextLine()+"\r\n";
writer.write(inif);
writer.flush();
}
}
// 收消息
public void b(){
try {
String s = reader.readLine();
System.out.println(s);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public PrintWriter getWriter() {
return writer;
}
public void setWriter(PrintWriter writer) {
this.writer = writer;
}
public BufferedReader getReader() {
return reader;
}
public void setReader(BufferedReader reader) {
this.reader = reader;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Utils() {
}
public Utils(PrintWriter writer, BufferedReader reader, String title) {
this.writer = writer;
this.reader = reader;
this.title = title;
}
}
服务器代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author Mxhlin
* @Email fuhua277@163.com
* @Date 2022/09/29/19:47
* @Version
* @Description
*/
public class Client {
public static void main(String[] args) {
try {
// 设置虚拟服务器 端口号为5678
ServerSocket c = new ServerSocket(1234);
Socket accept = c.accept();
PrintWriter writer = new PrintWriter(accept.getOutputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(accept.getInputStream()));
Utils utils = new Utils(writer,reader,"服务器");
new Thread(utils::a).start();
new Thread(utils::b).start();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
客户端代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* @author Mxhlin
* @Email fuhua277@163.com
* @Date 2022/09/29/19:47
* @Version
* @Description
*/
public class Server {
public static void main(String[] args) {
try {
// 这里host参数需要一个ip地址 , port需要与服务器设置的端口号相匹配,
// 要和服务器连接(服务器前提必须开着);
Socket sc = new Socket("192.168.13.47",1234);
// 创建输出字符流 参数是 Socket获取的输出流
PrintWriter writer = new PrintWriter(sc.getOutputStream());
// 创建缓冲输入字符流 参数 new 输入字节流的字符流 参 数 Socket获取的输出流
BufferedReader reader = new BufferedReader(new InputStreamReader(sc.getInputStream()));
// 实例化有参构造方法
Utils utils = new Utils(writer,reader,"客户端");
// 调用Utils的写入方法
new Thread(utils::a).start();
// 调用Utils的读取方法
new Thread(utils::b).start();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
演示效果


浙公网安备 33010602011771号