通信编程基本介绍

什么是通信编程

通信编程是指通过编程语言实现不同设备(如计算机、服务器、嵌入式设备等)之间数据交换的技术。其核心是建立设备间的连接,并通过约定的规则(协议)发送和接收数据,实现信息交互。常见场景包括客户端 - 服务器(C/S)通信、网络聊天、文件传输、远程控制等。

在 Java 中,通信编程主要基于TCP/IP 协议(面向连接的可靠传输)和UDP 协议(无连接的不可靠传输),通过 JDK 提供的网络编程类库实现。

Java 通信编程中常用的四个核心类

以下四个类是 Java 中基于 TCP/IP 协议进行通信编程的基础,主要用于实现客户端与服务器的连接和数据传输:

1. ServerSocket(服务器端套接字)
  • 作用:用于在服务器端创建一个监听端口,等待客户端的连接请求。
  • 核心功能
    • 通过ServerSocket(int port)构造方法绑定指定端口(如 8080、10086)。
    • 调用accept()方法阻塞等待客户端连接,返回一个Socket对象(与客户端的连接通道)。
    • 支持设置连接队列长度、超时时间等参数。
  • 示例

    java

    // 服务器端在10086端口监听
    ServerSocket serverSocket = new ServerSocket(10086);
    // 等待客户端连接,返回连接对象
    Socket socket = serverSocket.accept();
    
2. Socket(客户端套接字)
  • 作用:客户端用于与服务器建立连接的对象,也是双方数据传输的通道。
  • 核心功能
    • 客户端通过Socket(String host, int port)构造方法指定服务器 IP(或域名)和端口,发起连接。
    • 连接成功后,通过getInputStream()getOutputStream()获取输入流和输出流,用于接收和发送数据。
    • 提供close()方法关闭连接,释放资源。
  • 示例

    java

    // 客户端连接服务器(IP为127.0.0.1,端口10086)
    Socket socket = new Socket("127.0.0.1", 10086);
    // 获取输出流(向服务器发送数据)
    OutputStream out = socket.getOutputStream();
    // 获取输入流(接收服务器数据)
    InputStream in = socket.getInputStream();
    
3. InputStream(输入流)
  • 作用:用于从连接中读取数据(如客户端读取服务器发送的数据,或服务器读取客户端发送的数据)。
  • 核心方法
    • read():读取单个字节数据,返回字节值(-1 表示读取结束)。
    • read(byte[] b):读取数据到字节数组,返回实际读取的字节数。
    • close():关闭流,释放资源(通常通过try-with-resources自动管理)。
  • 注意InputStream是抽象类,实际使用的是其实现类(如SocketgetInputStream()返回的流对象)。
4. OutputStream(输出流)
  • 作用:用于向连接中写入数据(如客户端向服务器发送数据,或服务器向客户端发送数据)。
  • 核心方法
    • write(int b):写入单个字节。
    • write(byte[] b):写入字节数组中的所有数据。
    • flush():强制将缓冲区中的数据发送出去(避免数据滞留)。
    • close():关闭流,释放资源。
  • 注意OutputStream也是抽象类,实际使用的是其实现类(如SocketgetOutputStream()返回的流对象)。

四个类的协作关系

  1. 服务器端:ServerSocket监听端口 → 客户端连接后通过accept()返回Socket → 用SocketInputStream接收客户端数据,用OutputStream向客户端发送数据。
  2. 客户端:Socket连接服务器 → 用OutputStream向服务器发送数据,用InputStream接收服务器数据。

通过这四个类的配合,可实现客户端与服务器的双向通信,是 Java 中 TCP/IP 通信编程的基础。

通信编程
服务端与客户端的第一个区别:
        服务端在通信的角色中是地址固定的 ,客户端只要保证与服务端之间的网络是通顺就行

服务端-客户端 : C-S 架构 微信 与 微信服务器
服务端-浏览器: B-S架构 百度网站 淘宝网站 与 他们的服务器
服务端-服务端:分布式 微服务 等
客户端-客户端:P2P 点对点 QQ 微信视频聊天 两个人直接通信,不需要经过服务器

核心类:
Socket 套接字
ServerSocket 服务端套接字
InputStream 输入流
OutputStream 输出流

双端通信


阻塞:
Thread :
生命周期 :T3 创建 运行 终止
NEW 新建
RUNNABLE 可运行
BLOCKED 阻塞
WAITING 无限期等待
TIMED_WAITING 限期等待
TERMINATED 终止
阻塞:
堵车
阻塞:程序在等待某个资源时,暂时停止运行
Server.java 和 Client.java 代码中,存在多处阻塞情况:
serverSocket.accept() - 服务器等待客户端连接时会阻塞
in.read() - 等待数据时会阻塞
sc.nextLine() - 等待用户输入时会阻塞
端口号:TCP UDP 协议 各自有一套端口
65536个 最大是65535
1024 不要使用 系统组件使用
1025-5000 知名的企业软件事件 mysql 3306
5000-10000之间 不知名的企业软件 8080 tomcat
50000-65535 自定义端口 系统保留用来临时分配
给每个需要通信的程序分配端口号
异步:异步通信是指程序在进行网络操作时,不等待操作完成,而是继续执行其他任务,当
操作完成后通过回调、事件等方式通知程序。
操作是非阻塞的。
提高了程序的并发性和响应性。
实现较复杂,但适用于高并发、实时性要求高的系统。
实现方式:
多线程:为每个通信任务创建一个线程。
线程池:使用 ExecutorService 来管理线程资源。
NIO(New I/O):使用 Selector、Channel 实现非阻塞 I/O。
Future / Callback:Java 提供的异步编程机制。
同步:同步通信是指程序在进行网络操作(如发送或接收数据)时,必须等待该操作完成后
才能继续执行下一步。
操作是顺序执行的。
程序会阻塞,直到当前操作完成。
实现简单,但效率较低,因为线程会“卡住”等待。
两边各自使用两个线程,一个线程负责发送,一个线程负责接收,发送和接收是两个独立的
线程,互不干扰,发送线程发送消息后,不需要等待接收线程接收完,可以继续发送下一条
消息,接收线程接收消息后,可以继续接收下一条消息,发送和接收是同时进行的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值