IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Socket通信流程-基于Java多线程实现Socket异步通信 -> 正文阅读

[Java知识库]Socket通信流程-基于Java多线程实现Socket异步通信

服务原语Primitive

实现原理

对应Java命令

ServerSocket---用于建立通信连接的对象

Socket---用于通信的对象

服务原语

Server端

Client端

SOCKET创建一端的socket,也是一个通信的线程,允许有多个

ServerSocket server = new ServerSocket(PORT);

默认绑定本地IP,端口号PORT需要在初始化中定义

Socket socket = new Socket();

默认绑定本地IP

BIND将socket与本地地址绑定

LISTEN监听连接的请求

Socket?socket =?server.accept();

此时线程阻塞,监听来自Client端的连接,当Client端发起connect命令

ACCEPT被动的接收连接请求

CONNECT主动发起请求

socket.connect(IP:PORT);

SEND

socket.getOutputStream();

RECEIVE

socket.getInputStream();

CLOSE主动断开请求

socket.close();

Server端代码

public class Server extends  Port{
    public static void main(String[] args) {
        try {
            //初始化ServerSocket
            ServerSocket server = new ServerSocket(2000);
            //阻塞等待客户端连接
            //一旦建立连接,初始化Socket
            Socket client=server.accept();

            try {
                new SendThread(client).start();
                new ReplyThread(client).start();
            } catch (Exception e) {
                System.out.println("异常关闭");
            } finally {
                //SendThread和ReplyThread之一的线程释放了锁,才能关闭Socket
                synchronized (lock) {
                    lock.wait();
                }
                client.close();
                server.close();
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

Client端代码

public class Client extends Port{
    public static void main(String[] args) {
        try {
            //初始化Socket
            Socket client = new Socket();
            client.setSoTimeout(300000);
            //初始化连接服务器ServerSocket
            client.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000));

            try {
                new SendThread(client).start();
                new ReplyThread(client).start();
            } catch (Exception e) {
                System.out.println("异常关闭");
            } finally {
                //SendThread和ReplyThread之一的线程释放了锁,才能关闭Socket
                synchronized (lock) {
                    lock.wait();
                }
                client.close();
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

Server和Client继承的父类

public class Port {

    public static final Object lock = new Object();

}

发送线程代码

@AllArgsConstructor
public class SendThread extends Thread {

    private Socket socket;

    @SneakyThrows
    @Override
    public void run() {
        BufferedReader input=new BufferedReader(new InputStreamReader(System.in));
        PrintStream send=new PrintStream(socket.getOutputStream());

        do {
            //键盘(当前)--->程序(当前)
            String sendMsg = input.readLine();
            //程序(当前)--->程序(对面)
            send.println(sendMsg);
            if("Esc".equals(sendMsg)) break;
        } while (true);
        synchronized (Port.lock) {
            Port.lock.notify();
        }
    }
}

接收线程代码

@AllArgsConstructor
public class ReplyThread extends Thread {

    private Socket socket;

    @SneakyThrows
    @Override
    public void run() {
        BufferedReader reply=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintStream output = System.out;

        do {
            //程序(对面)--->程序(当前)
            String replyMsg = reply.readLine();
            //程序(当前)--->键盘(当前)
            output.println(replyMsg);
            if("Esc".equals(replyMsg)) break;
        } while(true);
        synchronized (Port.lock) {
            Port.lock.notify();
        }
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 11:59:28  更:2021-08-26 12:01:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:54:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码