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命令。

  • 相关阅读:
    app卡顿问题检测--KMCGeigerCounter
    报错---[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m:3294**
    键盘工具栏的快速集成--IQKeyboardManager
    iOS 对网络视频采集视频截图
    iOS-label出现未知边框线的bug
    iOS开发中图片方向的获取与更改
    通过代码设置button中文字的对齐方式
    util.date
    统计字符串每个字母的个数
    异常处理之多重catch
  • 原文地址:https://www.cnblogs.com/shenhainixin/p/5181758.html
Copyright © 2011-2022 走看看