Document

使用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);
        }
    }
}

演示效果

在这里插入图片描述

posted @ 2022-09-29 21:57  一蓑烟雨任平生。。  阅读(45)  评论(0)    收藏  举报
Document