TCP通信:用代码实现与多个客户端同时通信

 

复制代码
package Karl.Demo.Test;

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception {
        //1.创建Sockrt对象,并同时请求与服务端程序连接
        Socket socket=new Socket("127.0.0.1",8888);
        //得到字节输出流,用来发送给服务端
        OutputStream os=socket.getOutputStream();
        //把低级字节输出流包装成数据输出流
        DataOutputStream dos=new DataOutputStream(os);
        Scanner sc=new Scanner(System.in);
        System.out.println("----------客户端开启---------");
        while (true) {
            System.out.println("请输入:");
            String msg = sc.nextLine();

            //用户输入exit,就退出客户端
            if ("exit".equals(msg)) {
                System.out.println("-------退出-------");
                dos.close();
                socket.close();
                break;
            }


            //开始写数据出去
            dos.writeUTF(msg);
            dos.flush();
        }

    }
}
复制代码
复制代码
package Karl.Demo.Test;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("----------服务端启动------------");
        //1.创建ServerSocket对象,同时为服务器注册端口
        ServerSocket serverSocket=new ServerSocket(8888);
        while (true) {
            //2.使用serversocket对象,调用accept方法,等待客户端连接请求
            Socket socket=serverSocket.accept();
            //获取IP地址
            System.out.println(socket.getRemoteSocketAddress()+"---------上线---------");
            //3.把这个客户端对应的socket通信管道,交给一个独立的线程负责处理
            new ServerRraderThread(socket).start();

        }

    }
}
复制代码
复制代码
package Karl.Demo.Test;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class ServerRraderThread extends Thread{
    //定义一个socket
    private Socket socket;
    //定义一个有参构造器,把获取来的数据交给本接口的socket
    public ServerRraderThread(Socket socket){
        this.socket=socket;
    }
    //重写run方法
    @Override
    public void run() {
        try {
            //用本接口socket获取到的数据交给字节输入流is
            InputStream is=socket.getInputStream();
            //把低级字节输入流is包装成数据输入流dis
            DataInputStream dis=new DataInputStream(is);
            //把读取数据放入死循环
            while (true) {
                try {
                    //用数据输入流方法读取数据交给String定义的msg
                    String msg=dis.readUTF();
                    //打印
                    System.out.println(msg);
                } catch (IOException e) {
                    //获取关闭服务器的IP
                    System.out.println(socket.getRemoteSocketAddress()+"-------离线-----");
                    //释放资源
                    socket.close();
                    dis.close();
                    break;
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
复制代码

 

posted @   Karlshell  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示