javaTCP实现多人聊天

 客户端

package com.xsh.internet.socket;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/*
客户端
*/
public class ChatClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("10.9.21.235", 9999);
        //创建两个线程实现读写同步进行
        //读
        new Thread(new Runnable() {
            @Override
            public void run() {
                try (BufferedReader br = new BufferedReader(new                  InputStreamReader(socket.getInputStream()))) {
                    while(true) {
                        String data = br.readLine();
                        System.out.println(data);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        //写
        new Thread(new Runnable() {
            @Override
            public void run() {
                try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) {
                    Scanner input = new Scanner(System.in);
                    while(true){
                        String str = input.next();
                        bw.write(str);
                        bw.newLine();
                        bw.flush();
                        if(str.equals("88")||str.equals("拜拜")||str.equals("退出")){
                            break;
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }
}

 服务端

package com.xsh.internet.socket;

import java.io.*;
import java.net.Socket;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ChatThread extends Thread {
    private List<Socket> socketList;
    private Socket socket;
    private String ip;
    private String data;

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public ChatThread(Socket socket, List socketList){
        this.socket = socket;
        this.socketList = socketList;

    }

    public void run(){
        try (BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
            while(true) {
                data = br.readLine();
                String regex = "\\[10.9.21.[0-9]{3}\\]";
                //匹配ip地址,这里需要自己改,我这里直接用的自己格式的ip,没有匹配标准的
                String ipreg = "((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){3}";
                //这里regex需要自己更改
                Pattern pattern = Pattern.compile(regex);
                Matcher matcher = pattern.matcher(data);
                while(matcher.find()){
                    ip = matcher.group();
                }
                data = data.replaceAll(regex, "");
                if(ip != null) {
                    //我这里是把发送的ip地址用[]包住了,所以这里去掉
                    ip = ip.replaceAll("\\[|\\]", "");
                }
                System.out.println(socket.getLocalAddress().getHostName() + "发送内容:" + data + "发送到:" + ip);
                //如果发送以下内容,正常退出,并且列表中删除该Socket
                if(data.equals("88")||data.equals("拜拜")||data.equals("退出")){
                    System.out.println(socket.getInetAddress().getHostAddress() + "正常下线了");
                    socketList.remove(socket);
                    break;
                }
                //遍历ArrayList,找出要发送消息的Socket,将消息发送给该ip
                for (int i = 0; i < socketList.size(); i++) {
                    if (socketList.get(i).getInetAddress().getHostAddress().equals(ip)) {
                        Socket socket = socketList.get(i);
                        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                        bw.write("[" + socket.getInetAddress().getHostAddress() + "]" + data);
                        bw.newLine();
                        bw.flush();
                        break;
                    }
                }
            }
        } catch (IOException e) {
            System.out.println("异常下线");
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

运行代码

package com.xsh.internet.socket;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ChatServer {
    public static void main(String[] args) {

        ServerSocket listen = null;
        List<Socket> socketList = Collections.synchronizedList(new ArrayList<>());
        try {
                //设置端口号为9999
                listen = new ServerSocket(9999);
                System.out.println("服务器启动");
                while(true) {
                    Socket socket = listen.accept();
                    //将监听到的代码添加到列表中
                    socketList.add(socket);
                    System.out.println(socket.getInetAddress().getHostAddress());
                    ChatThread chatThread = new ChatThread(socket, socketList);
                    //使用多线程实现多人聊天
                    new Thread(chatThread).start();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
            try {
                if(listen != null){
                    listen.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值