java网络编程之TCP------实现多人聊天室

前言:下列是本人学习java阶段的一些自我总结,若有错误,欢迎指出

TCP协议
英文名:Transmission Control Protocol
中文名:传输控制协议
协议说明:TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。

举例:打电话,需要双方都接通,才能进行对话

特点:效率低,数据传输比较安全

相比UDP,TCP要求双方建立连接才能通信,通常借助一个服务器实现多人通信

TCP实现多人聊天室
思路:写一个用户类和服务器端类,借助多线程和IO就可以实现多人聊天
代码逻辑很清晰,慢慢看下来一遍都能理解,就不多写注释了

server类:

public class server {// 服务端
// 读取 In
    static Socket socket = null;
    static ServerSocket serverSocket = null;
    public server() {// 构造方法
        try {
            serverSocket = new ServerSocket(9999);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        System.out.println("************欢迎使用java聊天室*************");
        server t = new server();
        int count = 0;
        while (true) {          
            try {
                socket = serverSocket.accept();
                count++;
                System.out.println("第" + count + "个客户已连接");
            } catch (IOException e) {
                e.printStackTrace();
            }
            Readl r=new Readl(socket);
            Print p = new Print(socket);
            Thread read = new Thread(r);
            Thread print = new Thread(p);
            read.start();
            print.start();
        }
    }
}
class Readl implements Runnable{//信息读取类
	static List<Socket> socketList=new ArrayList<Socket>();
	Socket socket=null;
	public Readl(Socket s) {// 构造方法
        try {
            socketList.add(s);
            this.socket=s;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
	public void run() {
        // 重写run方法
        try {
            Thread.sleep(1000);
            BufferedReader in = new BufferedReader(new InputStreamReader(this.socket
                    .getInputStream()));
            while (true) {
                String jieshou = in.readLine();
                System.out.println( jieshou);//在服务端输出信息
                for (int i = 0; i < socketList.size(); i++) {//把信息发送到各个客户端
                    Socket socket=socketList.get(i);
                    PrintWriter out = new PrintWriter(socket.getOutputStream());
                    if (socket!=this.socket) {
                        out.println(jieshou);
                    }else{
                        out.println("(你)"+jieshou);
                    }
                    out.flush();
                }
            }
        } catch (Exception e) {

            e.printStackTrace();
        }
    }
	
}
class Print implements Runnable {//信息发送类
    static List<Socket> socketList=new ArrayList<Socket>();
    Scanner input = new Scanner(System.in);
    public Print(Socket s) {// 构造方法
        try {
            socketList.add(s);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
            while (true) {
                String msg = input.next();
            for (int i = 0; i < socketList.size(); i++) {
                Socket socket=socketList.get(i);
                PrintWriter out = new PrintWriter(socket.getOutputStream());
                out.println("服务端说:"+msg);
                out.flush();
            }
            }
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}

cilent类:

public class client implements Runnable {// 客户端
    static Socket socket = null;
    static String name=null;
    public static void main(String[] args) {
    	Scanner in = new Scanner(System.in);
    	System.out.println("请输入你的用户名:(班级姓名学号)");
    	String x=in.next();
    	client.name=x;
    	System.out.println("************客户端"+x+"*************");
        try {
            socket = new Socket("127.0.0.1", 9999);
            System.out.println("已经连上服务器了");
        } catch (Exception e) {
            e.printStackTrace();
        }
        client t = new client();
        Read r = new Read(socket);
        Thread print = new Thread(t);
        Thread read = new Thread(r);
        print.start();
        read.start();
    }
    @Override
    public void run() {//信息发送
    	Scanner input = new Scanner(System.in);
        try {
            Thread.sleep(1000);         
            PrintWriter out = new PrintWriter(socket.getOutputStream());
            while (true) {
                String msg = input.next();
                out.println(name+"说:"+msg);
                out.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
class Read implements Runnable {//信息读取
    static Socket socket = null;
    public Read(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            Thread.sleep(100);
            BufferedReader in = new BufferedReader(new InputStreamReader(socket
                    .getInputStream()));
            while (true) {
                System.out.println(  in.readLine());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

先启动服务端,再多次启动客户端就可以实现多人聊天了。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值