• Bio初级通讯案例



    前言`

    bio通讯学习笔记,从简单案例到复杂案例


    一、简单案例

    1.客户端

    代码如下(示例):

    package com.xuexi.testSocket.one2;
    
    import java.io.*;
    import java.net.Socket;
    import java.util.Scanner;
    
    public class Client {
        public static void main(String[] args) {
            Socket socket = null;
            try {
                // 创建socket请求连接
                socket = new Socket("127.0.0.1",9999);
    //            socket = new Socket("192.168.0.109",9999); // 联想g50-70
                // 从socket中获取字节输出流
                OutputStream os = socket.getOutputStream();
                // 把字节流包装成打印流
                PrintStream ps = new PrintStream(os);
                Scanner sn = new Scanner(System.in);
                while(true){
                    System.out.print("请说:");
                    String msg = sn.nextLine();
                    ps.println(msg);
                    ps.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    2.服务端

    代码如下(示例):

    package com.xuexi.testSocket.one2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
        public static void main(String[] args) {
            try {
                System.out.println("启动服务器。。。");
                // 定义服务端端口注册
                ServerSocket ss = new ServerSocket(9999);
                // 监听客户端socket连接请求
                Socket socket = ss.accept();
                // 从socket管道中得到一个字节流输入对象
                InputStream is = socket.getInputStream();
                // 把字节流组装成一个缓冲字符输入流
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String smg;
                while ((smg = br.readLine()) != null){
                    System.out.println("服务器收到:"+smg);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    二、多线程方式

    1.客户端

    代码如下(示例):

    package com.xuexi.testSocket.one3;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintStream;
    import java.net.Socket;
    import java.util.Scanner;
    
    public class Client {
        public static void main(String[] args) {
            Socket socket = null;
            try {
                // 创建socket请求连接
                socket = new Socket("127.0.0.1",9999);
                // 从socket中获取字节输出流
                OutputStream os = socket.getOutputStream();
                // 把字节流包装成打印流
                PrintStream ps = new PrintStream(os);
                Scanner sn = new Scanner(System.in);
                while(true){
                    System.out.print("请说:");
                    String msg = sn.nextLine();
                    ps.println(msg);
                    ps.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    2.服务端

    代码如下(示例):

    package com.xuexi.testSocket.one3;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
        public static void main(String[] args) {
            try {
                System.out.println("启动服务器。。。");
                // 定义服务端端口注册
                ServerSocket ss = new ServerSocket(9999);
                // 定义死循环,负责不断接收客户端的socket请求
                while (true){
                    // 监听客户端socket连接请求
                    Socket socket = ss.accept();
                    // 创建多线程,每次处理客户端都新建一个连接
                    new ServerThread(socket).start();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    package com.xuexi.testSocket.one3;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.Socket;
    
    public class ServerThread extends Thread{
        private Socket socket;
        public ServerThread(Socket socket){
            this.socket = socket;
        }
    
        @Override
        public void run() {
            InputStream is = null;
            try {
                // 从socket中获取字节流
                is = socket.getInputStream();
                // 使用缓冲字符流包装字节流
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String meg;
                while((meg = br.readLine()) != null){
                    System.out.println(meg);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    三、线程池方式

    1.客户端

    代码如下(示例):

    package com.xuexi.testSocket.one4;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintStream;
    import java.net.Socket;
    import java.util.Scanner;
    
    public class Client {
        public static void main(String[] args) {
            Socket socket = null;
            try {
                // 创建socket请求连接
                socket = new Socket("127.0.0.1",9999);
                // 从socket中获取字节输出流
                OutputStream os = socket.getOutputStream();
                // 把字节流包装成打印流
                PrintStream ps = new PrintStream(os);
                Scanner sn = new Scanner(System.in);
                while(true){
                    System.out.print("请说:");
                    String msg = sn.nextLine();
                    ps.println(msg);
                    ps.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    2.服务端

    代码如下(示例):

    package com.xuexi.testSocket.one4;
    
    import com.atguigu.testSocket.one3.ServerThread;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
        public static void main(String[] args) {
            try {
                System.out.println("启动服务器。。。");
                // 定义服务端端口注册
                ServerSocket ss = new ServerSocket(9999);
                // 初始化线程池对象
                HandlerSocketServerPool pool = new HandlerSocketServerPool();
                // 定义死循环,负责不断接收客户端的socket请求
                while (true){
                    // 监听客户端socket连接请求
                    Socket socket = ss.accept();
                    // 把socket对象交给线程池处理
                    Runnable target = new ServerRunnableTarget(socket);
                    pool.execute(target);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    package com.xuexi.testSocket.one4;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.Socket;
    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    public class HandlerSocketServerPool{
        // 创建一个线程池,
        private ExecutorService executorService;
    
        // 初始化线程池对象
        public HandlerSocketServerPool(){
            this.executorService = new ThreadPoolExecutor(2,2,120,
                    TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(2));
        }
    
        // 提供一个方法来提交任务给线程池的任务队列来暂存,等着线程池来处理
        public void execute(Runnable target){
            executorService.execute(target);
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    package com.xuexi.testSocket.one4;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.Socket;
    
    public class ServerRunnableTarget implements Runnable{
        private Socket socket;
        public ServerRunnableTarget(Socket socket){
            this.socket = socket;
        }
        @Override
        public void run() {
            InputStream is = null;
            try {
                // 从socket中获取字节流
                is = socket.getInputStream();
                // 使用缓冲字符流包装字节流
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String meg;
                while((meg = br.readLine()) != null){
                    System.out.println("服务器接收到:"+meg);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

  • 相关阅读:
    Mysql进阶优化篇06——分组查询优化、分页查询优化、覆盖索引
    JS流程控制语句_循环语句
    带你秒懂 SSR-服务端渲染
    EFCore 6.0入门看这篇就够了
    Java 线程通信
    WebAssembly — 概览
    1.6、计算机网络的性能指标(2)
    算法——哈希表篇
    Shell脚本-for循环和for int循环
    java计算机毕业设计计算机组成原理教学演示软件源码+数据库+系统+lw文档+mybatis+运行部署
  • 原文地址:https://blog.csdn.net/weixin_43833700/article/details/126449619