当前位置: 首页 > news >正文

Socket编程:客户端与服务器通信全解析(网络编程)

客⼾端和服务端

服务端:在常⻅的⽹络数据传输场景下,把提供服务的⼀⽅进程,称为服务端,可以提供对外服务。

客⼾端:获取服务的⼀⽅进程,称为客⼾端。

Socket套接字

概念

Socket套接字,是由系统提供⽤于⽹络通信的技术,是基于TCP/IP协议的⽹络通信的基本操作单元。基于Socket套接字的⽹络程序开发就是⽹络编程。

socket 是操作系统中特殊的文件,表示"网卡"硬件设备

socket api 传输层,提供给应用层

TCP : 有链接, 可靠传输, 面向字节流, 全双工

UDP : 无链接, 不可靠传输, 面向数据报, 全双工

链接:抽象的,虚拟的链接.通信双方,各自保存对方的关键信息(IP和端口)

TCP有链接,先保存对方的关键信息,然后发送数据

UDP无链接,不需要保存对方的关键信息,直接发送数据

不可靠传输:数据发送出去之后,关系对方是否收到,如果

可靠传输:发送出去之后,不管了

全双工:同时进行双向通信

半双工:同一时刻,只能单向通信(兽医)

UDP数据报套接字编程

DatagramSocket

Datagram:数据报

创建一个这样的对象,就相当于在系统内核里创建了一个socket文件. 创建socket文件,也会占用文件描述符表的一个位置,用完之后要记得及时关闭,否则可能会出现"文件资源泄露"

DatagramSocket 构造方法

DatagramSocket()
创建⼀个UDP数据报套接字的Socket,绑定到本机任
意⼀个随机端⼝(⼀般⽤于客⼾端)
DatagramSocket(int port)
创建⼀个UDP数据报套接字的Socket,绑定到本机指
定的端⼝(⼀般⽤于服务端)

谁主动,谁就是客户端. 谁被动,谁就是服务器.

DatagramSocket 方法

void receive(DatagramPacket p)

从此套接字接收数据报(如果没有接收到数据报,该

⽅法会阻塞等待)

void send(DatagramPacket p)

从此套接字发送数据报包(不会阻塞等待,直接发

送)

void close()

关闭此数据报套接字

DatagramPacket

DatagramPacket 构造方法

DatagramPacket(byte[] buf, int length)

构造⼀个DatagramPacket以⽤来接收数据报,接收的

数据保存在字节数组(第⼀个参数buf)中,接收指定 ⻓度(第⼆个参数length)

DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)

构造⼀个DatagramPacket以⽤来发送数据报,发送的数据为字节数组(第⼀个参数buf)中,从0到指定⻓度(第⼆个参数length)。address指定⽬的主机的IP和端⼝号

DatagramPacket ⽅法:

InetAddress getAddress()

从接收的数据报中,获取发送端主机IP地址;或从发送的数据报中,获取接收端主机IP地址

int getPort()

从接收的数据报中,获取发送端主机的端⼝号;或从发送的数据报中,获取接收端主机端⼝号

byte[] getData()获取数据报中的数据

InetSocketAddress:创建⼀个Socket地址,包含IP地址和端⼝号

代码示例

import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UdpEchoServer { //先创建 socket对象 private DatagramSocket socket = null; public UdpEchoServer(int port) throws SocketException { socket = new DatagramSocket(port); } public void start() throws IOException { //启动服务器 System.out.println("服务器启动...."); //服务器,需要不断处理客户发送过来的请求 while(true){ //循环一次就是处理一个请求 //1.读取请求并解析 DatagramPacket requestPacket = new DatagramPacket(new byte[1024],1024); socket.receive(requestPacket); //为了处理方便 String request = new String(requestPacket.getData(),0,requestPacket.getLength()); //2.根据请求构造响应 String response = process(request); //3.把响应返回给客户端 DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length, requestPacket.getSocketAddress()); socket.send(responsePacket); System.out.printf("[%s:%d]; resp: %s\n",requestPacket.getAddress().toString(),responsePacket.getPort(),request,response); } } private String process(String request) { return request; } public static void main(String[] args) throws IOException { //端口号是一个整数,随意指定 UdpEchoServer udpEchoServer = new UdpEchoServer(9090); udpEchoServer.start(); } }
import java.io.IOException; import java.net.*; import java.util.Scanner; public class UdpEchoCient { private DatagramSocket socket = null; private String serverIP; private int serverPort; public UdpEchoCient(String serverIp,int serverPort) throws SocketException { socket = new DatagramSocket(); this.serverIP = serverIp; this.serverPort = serverPort; } public void start() throws IOException { System.out.println("客户端启动"); Scanner sc = new Scanner(System.in); while (true) { //1.从控制台读取用户输入 System.out.println("-> "); String request = sc.next(); //2.构造请求,发送给服务器 DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), request.getBytes().length, InetAddress.getByName(serverIP), this.serverPort); socket.send(requestPacket); //3.读取服务器响应 DatagramPacket responsePacket = new DatagramPacket(new byte[1024], 1024); socket.receive(responsePacket); String response = new String(requestPacket.getData(), 0, requestPacket.getLength()); System.out.println(response); } } public static void main(String[] args) throws IOException { UdpEchoCient cient = new UdpEchoCient("127.0.0.1",9090); cient.start(); } }

服务器必须要指定固定的端口,确保客户端随时能找到服务器.

客户端来说,必须不指定固定端口,让系统随机分配空闲的端口,避免端口号冲突(大饼)

http://www.cnnetsun.cn/news/4025191.html

相关文章:

  • 如何为Cocos Creator +微信小游戏项目建立一套可长期执行的性能治理体系?
  • SAP Task Gateway 扩展实战,如何为统一任务入口增加新的 Provider
  • Win11Debloat实测:半小时卸载预装软件、关闭遥测,新电脑终于不卡了
  • 性能优化:连接池、缓存、批量处理
  • 开源的报文分析平台:12 个规则库全接引擎,附在线体验
  • 从一句主题到一支成片:Pixelle-Video 零门槛全自动短视频引擎
  • Prompts原语:标准化提示词模板
  • 正则分组/php5版本下preg_replace /e模式下的代码执行
  • Kimi LeetCode 3906. 统计网格路径中好整数的数目 Rust实现
  • maxGraph零基础入门:纯客户端JavaScript图表库,零成本5分钟画出可交互流程图
  • Portainer:Docker可视化Web管理面板的新手首选方案
  • 华硕笔记本控制权争夺战:G-Helper一天上手,性能、散热与续航全面解放
  • Dism++完整上手指南:免费清理系统垃圾、修复更新失败的终极优化工具,5分钟就能见效
  • 【Proteus仿真设计】基于stm32单片机的智能家居系统设计
  • Dify 企业级实验(03):事件驱动流水线——Webhook 与定时触发如何组成异步处理链?
  • 一条命令给 Win11 系统优化瘦身,Win11Debloat 把预装软件和广告一次清干净
  • Windows APK安装器完全指南:免模拟器在电脑上安装安卓应用
  • SOLIDWORKS 正版软件价格全解析:商业版、教育版、科研版报价指南
  • 相机缓冲数据三种数据格式(数组、指针new、vector)
  • 贵州微信网站建设全流程解析:中小企业如何利用私域流量实现低成本高增长
  • 预算不够不用全套打包!生产自动化与 AI 管理支持分开采购、分步落地
  • 永嘉网站建设几年才见效?资深从业者揭秘低成本高效获客真相
  • 深入解析南海网站建设报价背后的逻辑与行业内幕揭秘
  • 揭秘城乡规划建设网站背后的真相:为什么它不仅是信息枢纽更是城市发展的灵魂指南
  • 范县网站建设企业为何需要专业的数字化升级之路?本地老板必看攻略
  • 南阳网站建设价格揭秘:为什么有人几百元有人几万元?
  • 南京百度网站建设多少钱?深度解析中小企业如何通过南京百度网站建设实现低成本高效率获客与品牌升级
  • 铝基板营销型网站建设:从流量焦虑到成交转化的终极指南 如何打造高转化的B2B官网
  • 选择滨州正规网站建设公司避坑指南:从需求到上线的全流程深度解析与实操建议
  • 第24篇 · 从零到一,我的AI学习之路——复盘与给后来者的建议