栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java tcp通信

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java tcp通信

tcp实现服务端接收多个客户端消息,原理:主线程使用while死循环接收socket连接,为每个客户端的socket通信管道分配一个子线程接收

引入线程池 (创建固定数量的线程,避免产生过多线程,消耗资源)

客户端
public class ClientDemo {
    public static void main(String[] args) {
        try {
            System.out.println("----客户端----");

            //1.创建Socket通信管道请求有服务端的连接,端口号为6666
            Socket socket = new Socket("127.0.0.1",6666);

            //2.从Socket通信管道中得到一个字节输出流  负责发送数据
            OutputStream os = socket.getOutputStream();

            //3.把低级的字节流包装成打印流
            PrintStream ps = new PrintStream(os);

            Scanner sc = new Scanner(System.in);
            while(true){
                System.out.println("请输入:");
                String msg = sc.nextLine();
                ps.println(msg);
                ps.flush();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
服务端
public class SeverDemo {

    
    //使用静态变量记住一个线程池对象
    private static ExecutorService pool = new ThreadPoolExecutor(3,5,6,
            TimeUnit.SECONDS,new ArrayBlockingQueue<>(2),
            Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());

    public static void main(String[] args) {
        try {
            System.out.println("----服务端----");
            //1.注册端口
            ServerSocket serverSocket = new ServerSocket(6666);

            //定义一个死循环由主线程负责不断接收客户端的socket管道连接
            while (true) {
                //2.每接收到一个客户端的socket管道,交给一个独立的子线程
                Socket socket = serverSocket.accept();
                System.out.println(socket.getRemoteSocketAddress() + "上线");
                //任务对象负责读取消息
                Runnable target = new ServerReaderRunnable(socket);
                pool.execute(target);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
线程池处理Runnable任务
public class ServerReaderRunnable implements Runnable {
    private Socket socket;
    public ServerReaderRunnable(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            //3.从Socket通信管道中得到一个字节输入流
            InputStream is = socket.getInputStream();

            //4.把字节输入流包装成缓冲字符输入流进行消息的接收
            BufferedReader br = new BufferedReader(new InputStreamReader(is));

            //5.按照行读取消息
            String msg;
            while ((msg = br.readLine()) != null){
                System.out.println(socket.getRemoteSocketAddress() + "说了 : " + msg);
            }
        } catch (IOException e) {
            System.out.println(socket.getRemoteSocketAddress() + "下线");
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/820716.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号