socket实现简单的聊天项目

client端代码如下:

public class Client {
    private static int SERVER_PORT = 10000; //默认服务器端口号
    private static String SERVER_IP = "127.0.0.1";//服务器ip
    private static Scanner scan;
    private static Socket socket;//客户端服务
    private static String name;//客户端名称
    public static void main(String[] args) throws IOException {
        socket = new Socket(SERVER_IP, SERVER_PORT);
        scan = new Scanner(System.in);
        System.out.println("客户端已启动");
        System.out.println("请取名:");
        name = scan.nextLine();//客户端取名
        new Send(name, socket).start();//创建线程向服务器发送消息
        new Receive(socket).start();//创建一个线程接受服务端消息
    }
    static class Send extends Thread {
        private static PrintWriter outputStream;
        private String massage;
        private String name;
        private Socket socket;
        public Send(String name, Socket socket) throws IOException {
            this.name = name;
            this.socket = socket;
        }
        @Override
        public void run() {
            try {
                outputStream = new PrintWriter(socket.getOutputStream(), true);//发送消息,自动刷新
            } catch (IOException e) {
                e.printStackTrace();
            }
            outputStream.println(name);
            while (true) {
                System.out.println("请输入:");
                massage = scan.nextLine();
                outputStream.println(massage);
            }
        }
    }

    static class Receive extends Thread {
        private Socket socket;
        private BufferedReader inputStream;
        public Receive(Socket socket) {
            this.socket = socket;
        }
    @Override
    public void run() {
        try {
            inputStream = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (true) {  //循环接收消息
            try {
                String str = inputStream.readLine();
                System.out.println(str);//读取服务端返回的消息
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

}
sever端代码:

public class Server {
    private static int SERVER_PORT = 10000;//服务器将要监听的端口号
    private static ServerSocket sever;
    private static ExecutorService service;
    private static BufferedReader in;
    private static HashMap<String, Socket> hashMap;

public static void main(String[] args) throws IOException {
    start(SERVER_PORT);
}

private static void start(int port) throws IOException {
    Socket socket;
    sever = new ServerSocket(port);//监听端口
    service = Executors.newFixedThreadPool(5);
    hashMap = new HashMap<>();
    System.out.println("服务端已启动");
    while (true) {//通过无限循环监听端口
        socket = sever.accept();//监听是否有服务端连接
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String name = in.readLine();//读取客户端名称
        System.out.println(name + "进入");
        hashMap.put(name, socket);
        service.execute(new ServerThread(socket, hashMap,name));
    }
}

}
服务器端线程类(用于执行监听到的任务)

public class ServerThread extends Thread {
    private Socket socket;//保存监听到的有需求的客户端
    private HashMap<String, Socket> hashMap;
    private String sendName;
    public ServerThread(Socket socket, HashMap hashMap,String sendName) throws IOException {
        this.socket = socket;
        this.hashMap = hashMap;
        this.sendName=sendName;
    }
@Override
public void run() {
    try {
        receive();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private void receive() throws IOException {
    String massage;
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    while (true) {  //循环接收消息
        massage = in.readLine();
        send(massage);//服务器收到的消息转发
    }
}

public void send(String massage) throws IOException {
    int i = massage.indexOf("@");
    String name= massage.substring(i + 1, massage.length());
    //遍历map
    Socket s = hashMap.get(name);
    if (s == null) {
        socket.getOutputStream().write("用户不存在\n".getBytes());
        socket.getOutputStream().flush();
        return;
    }
    s.getOutputStream().write((sendName+":"+massage.substring(0, i)+"\n").getBytes());//将消息发给客户端
    socket.getOutputStream().flush();
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值