网络协议:一文搞懂Socket套接字

article/2025/8/27 16:09:43

本篇内容包括:Socket 套接字的简介、Socket 套接字的分类、Java 中的 Socket 即 java.net.ServerSocketjava.net.Socket 的使用,以及Java 使用套接字 Scoket 编程的Demo。

一、Socket 简介

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的通信协议,数据在传输前要建立连接,传输完毕后还要断开连接。TCP 协议提供的是点对点的通信,每条 TCP 连接由两端的套接字唯一确定。可以理解为 TCP 连接两端的套接字来连起来就形成了管道,管道的两端或者说管道的端口就是 Socket 套接字。

Socket 的原意是“插座”,在计算机通信领域,Socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

在这里插入图片描述

Socket 的典型应用就是 Web 服务器和浏览器:浏览器获取用户输入的 URL,向服务器发起请求,服务器分析接收到的 URL,将对应的网页内容返回给浏览器,浏览器再经过解析和渲染,就将文字、图片、视频等元素呈现给用户。


二、Socket 分类

TCP/IP 协议族提供三种常见的 Socket 类型:流式 Socket(SOCK_STREAM)流式套接字、数据报 Socket(SOCK_DGRAM)数据报套接字、原始 Socket(SOCK_RAW)原始套接字。

1、流式套接字(SOCK_STREAM)

用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠 的数据服务,原因在于其使用了传输控制协议 TCP。 这类套接字中,传输数据之前必须在两个应用进程之间建立一条通信连接, 这就确保了参与通信的两个应甩进程都是活动并具响应的e当连接建立之卮应用进程只要通过套接字向 TCP 层发送数据流,而另一个应用进程便可以接收到相应的数据流,它们不需要知道传输层是如何对数据流进行处理。特别责要注意的是通信连接必须显式建文。该套接字类型适食传输大量的数据,但不支持广播和多播方式。

2、数据报套接字(SOCK_DGRAM)

提供了一种无连接的服务,通信双方不需要建立任何显式连接,数据可以发送到指定的套接字,并且可以从指定的套接字接收数据。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用UDP进行数据的传输。由于数据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。与数据报套接字相比,使用流式套接字是一个更为可靠的方法,但对于某些应用,建立一个显式连接所导致的系统开销是令人难以接收的,并且数据报套接字支持广播和多播方式。

3、原始套接字(SOCK_RAW)

与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的 IP 数据包,而流套接字只能读取 TCP 的数据,数据报套接字只能读取 UDP 的数据。使用原始套接字的主要目的是为了避开 TCP/IP 处理机制,被传送的数据包可以被直接传送给需要它的应用程序。因此,其主要是在编写自定义底层协议的应用程序时使用,例如各种不同的 TCP/IP 实用程序

三、Java 中的 Socket

Java 中对 Socket 的使用是基于两个类 java.net.ServerSocketjava.net.Socket

img

1、java.net.Socket 构造方法

//不含参构造方法
Socket();
// 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
Socket(InetAddress address, int port)
// 创建一个流套接字并将其连接到指定主机上的指定端口号
Socket(String host, int port)
// 创建一个套接字并将其连接到指定远程地址上的指定远程端口
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
// 创建一个套接字并将其连接到指定远程主机上的指定远程端口
Socket(String host, int port, InetAddress localAddr, int localPort)

2、java.net.Socket 常用方法

// 将此套接字连接到服务器
connect(SocketAddress endpoint)
// 将此套接字连接到服务器,并指定一个超时值
connect(SocketAddress endpoint, int timeout)// 返回服务端的ip地址
getInetAddress();
// 获取服务端的端口号
getPort();
// 获取本地客户端的ip地址
getLocalAddress();
// 获取本地客户端的端口号
getLocalPort();
// 返回此套接字的输入流
getInputStream()
// 返回此套接字的输出流
getOutputStream()// 根据连接是否关闭返回一个boolean值,关闭则返回true,否则返回false
isClose();
// 如果连接是否曾被连接过则返回true,否则返回false
isConnect();
// 如果Socket已经与本地的一个端口绑定,返回true,否则返回false
isBound();// 关闭输入流
shutdownInput();
// 关闭输出流
shutdownOutput();// 关闭Socket
close();

3、java.net.ServerSocket 构造方法

// 创建绑定到特定端口的服务器套接字
ServerSocket(int port)

4、java.net.ServerSocket 常用方法

// 侦听并接受到此套接字的连接。
accept()
// 返回此服务器套接字的本地地址
getInetAddress()

四、Java Socket Demo

Demo:编程实现基于 TCP 的 Socket 服务器端和客户端的通信

1、Demo 服务端

服务端的 Socket Demo 流程思路:

  1. 创建 ServerSocket 对象,绑定监听端口;
  2. 通过 accept() 方法监听客户端请求;
  3. 链接建立后,通过输入流读取客户端发送的请求信息;
  4. 通过输出流向客户端发送响应信息;
  5. 关闭相关资源。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;/** 基于TCP协议的Socket通信,实现用户登录* 服务器端*/
public class Server {public static void main(String[] args) {try {// 1、创建一个服务器Socket,即ServerSocket,指定绑定的端口,并监听此端口ServerSocket serverSocket = new ServerSocket(8888);// 2、调用()方法开始监听,等待客户端的连接System.out.println("服务器即将启动,等待客户端的连接");Socket socket = serverSocket.accept();// 就会处于阻塞的状态,等待监听// 3、获取输入流,病读取客户端信息InputStream is = socket.getInputStream();// 字节输入流// 将字节流转换为字符流InputStreamReader isr = new InputStreamReader(is);// 为输入流添加缓冲BufferedReader br = new BufferedReader(isr);String info = null;while((info = br.readLine())!=null){System.out.println("我是服务器,读取客户端发过来的信息:"+info);}socket.shutdownInput();//关闭输入流// 关闭资源br.close();isr.close();is.close();socket.close();serverSocket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

2、Demo 客户端

客户端的 Socket Demo 流程思路:

  1. 创建 Socket对象,指明需要连接的服务器的地址和端口号;

  2. 连接建立后,通过输出流向服务器端发送请求信息;

  3. 通过输入流获取服务器响应的信息;

  4. 关闭相关资源。

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;/** 客户端*/
public class Client {public static void main(String[] args) {// 1、创建客户端Socket,指定服务器地址和端口try {Socket  socket = new Socket("localhost", 8888);// 2、获取输出流,向服务器端发送信息OutputStream os = socket.getOutputStream();// 获取字节输出流// 将输出流包装为打印流PrintWriter pw = new PrintWriter(os);pw.write("用户名:user 密码:pawd");pw.flush();socket.shutdownInput();//关闭输出流// 3、关闭资源pw.close();os.close();socket.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

http://chatgpt.dhexx.cn/article/pQg6ATvx.shtml

相关文章

Java Socket通信之TCP协议

文章目录 一、 Java流套接字通信模型1.TCP模型2.TCP Socket常见APIServerSocket APISocket API 二、TCP流套接字编程1.回显服务器2.多线程服务器 三、TCP中的长短连接四、协议1. 为什么需要协议?2. 封装/分用 VS 序列化/反序列化3. 自定义协议 紧接着 Java Socket通…

TCP/IP协议讲解

TCP/IP与OSI参考模型 应用层:向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、虚拟终端等。 应用层协议:两个主机的两个应用程序之间进行相互交流的数据格式。 运行在TCP协议上的协议: 1、HTTP(Hypertext…

tcp/ip协议与socket介绍

1、tcp/ip五层协议模型 应用层、传输控制层、网络层、数据链路层、物理 2. 应用层 直接向用户提供服务,完成用户希望在网络上完成的各种工作。如curl命令。 3. 传输控制层 3.1 TCP和UDP协议 TCP协议:面向连接的可靠传输协议。利用TCP进行通信时&…

socket协议介绍

2019独角兽企业重金招聘Python工程师标准>>> 本文主要讲述了Socket协议脚本的基础知识和编写方法,让大家能够在短时间内快速掌握简单的Socket协议脚本的编写方法。      1.socket协议介绍      Socket协议有万能协议之称,很多系统底层都是用的socket协议,…

Socket 网络协议 等

🍬 什么是服务器? 对外提供服务的一套软件,放在网络上 (IP地址) 什么是客户端? 是为了连接服务器的一个软件 网络编程的3要素 协议 IP地址 局域网IP地址 公网IP地址(买的) 查看…

socket实现http协议

1、在B/S架构中,Web浏览器与Web服务器之间的一次HTTP请求与响应:需要完成以下步骤: http://localhost:8089/index.html 1)、浏览器端根据所在的HTTP协议解析出对应的url域名:localhost 2)、通过DNS域名解析&#xf…

TCP/IP协议族通信的socket介绍及编程

一、概念介绍 TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。 UDP(User Data Protocol,用…

tensorflow之argmax函数独特讲解

在讲解之前,先来一个该函数的参数说明: argmax(a, axisNone, outNone) # a 表示array # axis 表示指定的轴,默认是None,表示把array平铺, # out 默认为None,如果指定,那么返回的结果会插入其中…

南京邮电大学离散数学实验三:编程实现整除关系这一偏序关系上所有盖住关系的求取,并判定对应偏序集是否为格

实验原理及内容 说明:这部分内容主要包括: 1、形式化描述实验中所使用的数据结构和存储结构,给出函数之间的调用关系和数据传递方式; 2、给出核心算法的C或Java等语言的源代码,并加上详细注释,分析算法的…

组合学笔记(六)局部有限偏序集的关联代数,Möbius反演公式

tags: Combinatorics 写在前面 前面铺垫了很多偏序集和格,分配格等的基本知识, 下面开始以这些代数结构为研究对象, 探寻其上的一些性质与关系, 我们先以关联代数的定义开始说起. 关联代数简介 定义 令 I n t ( P ) \mathrm{Int}(P) Int(P)表示 P P P上所有的区间的集合, …

离散中偏序集、乘积群、关系的性质和集合的相关证明

离散证明题&#xff08;三&#xff09; 9.令❄是定义在有限集合A上的一个二元运算&#xff0c;若对于∀a,b∈A&#xff0c;❄满足①aa❄a②a❄bb❄a③a❄(b❄c)(a❄b)❄c,在A上定义一个关系C比如a≤b<>aa❄b. 证明&#xff1a;(1)(A,≤)是一个偏序集 (2)∀a,b∈A,a∧ba❄…

偏序关系以及最大元,最小元,极大,极小元和上下界与上下确界

偏序关系的定义 偏序关系就是自反&#xff0c;反对称&#xff0c;传递的序偶集合。其中满足偏序的集合我们一般称为A&#xff0c;偏序关系一般称为R。 A*A产生的序偶有很多&#xff0c;所以我们使用<A,R>去表示满足某个偏序关系的A中元素的子集。 如果使用图像画这个偏序…

上偏续关系哈斯图_[离散]哈斯图偏序集--最好理解版本

离散数学哈斯图的画法 两个步骤&#xff1a;(1)排点的层数 (2)把有关系的点连接起来 看一道题&#xff1a;设A{1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;6&#xff0c;8&#xff0c;9}&#xff0c;偏序集S{A,《},其中《为整除关系&#xff0c;画出S的哈斯图 首先把…

【集合论】序关系 ( 偏序集元素之间的关系 | 可比 | 严格小于 | 覆盖 | 哈斯图 )

文章目录 一、可比二、严格小于三、覆盖四、哈斯图 一、可比 可比 : A A A 集合 , 该集合上存在 偏序关系 ≼ \preccurlyeq ≼ 小于等于 , 偏序集 是 集合 和 偏序关系 组成的有序对 < A , ≼ > <A, \preccurlyeq> <A,≼> , x , y x, y x,y 是 A A A 集…

等价关系偏序关系全序关系

等价关系 , 并且 , 如果 R是自反&#xff0c;对称&#xff0c;传递的&#xff0c;称R为A上的等价关系。 偏序关系 &#xff0c;并且 , 如果 R是自反: (每个元素都和自身有关系)&#xff1b; 反对称&#xff1a;如果有&#xff0c;则,否则&#xff0c;不能同时存在 &#xf…

如何从哈斯图判断一个偏序集是不是格?

离散数学中&#xff0c;格的定义如下&#xff1a; 设 < S , ≼ > < S, \preccurlyeq> <S,≼>是偏序集&#xff0c;如果 ∀ x , y ∈ S , { x , y } \forall x,y\in S, \{x,y\} ∀x,y∈S,{x,y}都有最小上界和最大下界&#xff0c;则称 S S S关于偏序 ≼ \pre…

对接阿里云的短信接口发送手机验证码

最近做的项目涉及到对接阿里云的短信接口实现用户注册时发送验证码&#xff0c;我们在一个网站进行注册时要用到手机号获取验证码&#xff0c;这是很常见的操作。本篇博客记录如何对接阿里云的短信接口用手机号获取验证码&#xff0c;步骤如下&#xff1a; 1、对接阿里云短信接…

用Python模拟识别图片验证码并发送手机验证码

1、导语 大家好&#xff0c;好久不见。又到每日分享Python小技能的时候了。最近因为疫情影响&#xff0c;所以更新内容比较慢…今天周一&#xff0c;就来更新一波&#xff0c;心血来潮&#xff0c;是时候上线经营了。其实也没想到有啥好分享的&#xff0c;不如分享一些干货给大…

springboot发送短信验证码

学习目标&#xff1a; 阿里云短信服务 准备工作&#xff1a; 注册阿里云账户开通短信服务申请签名和模板拿到AccessKey 大概说一下测试和申请流程&#xff0c;输入https://www.aliyun.com/进入官网&#xff0c;然后注册账号&#xff0c;直接在搜索框输入短信服务就能找到&…