zoukankan      html  css  js  c++  java
  • 网络编程——服务器与多客户端通信

    要想服务器同时支持多个客户端的连接,就必须加入多线程的处理机制,将每一个连接的客户端都创建一个新的线程对象。

    package com.vince;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class MutilServerDemo {
    
        /**
         * 服务器*/
        public static void main(String[] args) {
            ExecutorService es=Executors.newCachedThreadPool();
            try {
                //端口号从1024~65535
                ServerSocket ss=new ServerSocket(8000);
                System.out.println("服务器已启动,正在等待连接...");
                while(true){
                    Socket socket=ss.accept();//等待客户端连接,该方法会阻塞     
                    es.execute(new ClientThread(socket));
                }
                
                
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
        }
        //处理客户请求的线程
        static class ClientThread implements Runnable{
            private Socket socket;
            public ClientThread(Socket socket){
                this.socket=socket;
            }
            
            public void run() {
                try {
                    System.out.println("客户端的IP为:"+socket.getInetAddress().getHostAddress());
                    InputStream input=socket.getInputStream();
                    BufferedReader br=new BufferedReader(new InputStreamReader(input));
                    OutputStream output=socket.getOutputStream();
                    PrintStream ps=new PrintStream(output);
                    while(true){
                    String info=br.readLine();
                    if(info==null||"bye".equals(info)){
                        break;
                    }
                    System.out.println(info);
                    ps.println("echo:"+info);
                    }
                    input.close();
                    output.close();
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
                
            }
            
        }
    }
    package com.vince;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintStream;
    import java.net.Socket;
    import java.util.Scanner;
    //客户端
    public class MutilClientDemo {
    
        public static void main(String[] args) {
            // 连接服务器
            try {
                Socket socket = new Socket("localhost", 8000);
                System.out.println("连接成功!");
                boolean flag=true;
                OutputStream out = socket.getOutputStream();
                InputStream in = socket.getInputStream();
                PrintStream ps = new PrintStream(out);
                BufferedReader br = new BufferedReader(new InputStreamReader(in));
                Scanner input=new Scanner(System.in);
                while(flag){
                    System.out.println("请输入:");
                    String info=input.next();
                    if("bye".equals(info)){
                        flag=false;
                    
                    }
                ps.println(info);
                info = br.readLine();
                System.out.println(info);
                }
                out.close();
                in.close();
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
        }
    
    }

    测试时,使用cmd命令打开多个框(代表多个客户端),执行java命令。

  • 相关阅读:
    使用一行Python代码从图像读取文本
    FastAI 简介
    OpenCV-Python 轮廓:更多属性 | 二十四
    Numpy和OpenCV中的图像几何变换
    从云计算到边缘计算
    OpenCV-Python 轮廓属性 | 二十三
    c# GetType()和typeof()的区别
    C# 子类父类方法同名,三种处理方式
    C# string 与 String的区别
    decimal
  • 原文地址:https://www.cnblogs.com/shenhainixin/p/5181758.html
Copyright © 2011-2022 走看看