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

本篇内容包括: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://www.mzph.cn/news/535478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络协议:透彻解析HTTP协议

本篇内容包括:HTTP 协议定义及其特点概述、关于 URL 定义及分类概述、Request 请求、Response 响应 以及 浏览器访问一个网站的全过程 等内容… 一、HTTP 协议概述 HTTP(HyperText Transfer Protocol) 即 超文本传输协议,它是一种…

Redis系列:Redis的概述与安装

Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。 本篇内容包括:Redis 简介(为什么快?为什么单线程?优…

Redis系列:Redis持久化机制与Redis事务

Redis 是个基于内存的数据库。那服务一旦宕机,内存中数据必将全部丢失。所以丢失数据的恢复对于 Redis 是十分重要的,我们首先想到是可以从数据库中恢复,但是在由 Redis 宕机时(说明相关工作正在运行)且数据量很大情况…

TCP连接的建立与终止

TCP连接的建立与终止 1.三次握手 TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方…

13 张图带你学懂 Kubernetes Service(转载)

在 Kubernetes 中 Service 主要有4种不同的类型,其中的 ClusterIP 是最基础的,如下图所示: 当我们创建一个 NodePort 的 Service 时,它也会创建一个 ClusterIP,而如果你创建一个 LoadBalancer,它就会创建一…

DOCKERFILE参数注解

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。 一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。 Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为…

Zookeeper:分布式过程协同技术

Zookeeper 是一个高性能的分布式一致系统,在分布式系统中有着广泛的应用。基于它,可以实现诸如“分布式同步”、“配置管理”、“命名空间管理”等众多功能,是分布式系统中常见的基础系统。Zookeeper 主要用来解决分布式集群中应用系统的一致…

Linux namespace概述

操作系统通过虚拟内存技术,使得每个用户进程都认为自己拥有所有的物理内存,这是操作系统对内存的虚拟化。操作系统通过分时调度系统,每个进程都能被【公平地】调度执行,即每个进程都能获取到CPU,使得每个进程都认为自己…

Zookeeper:Zookeeper的主从选举机制

ZAB 协议,全称 Zookeeper Atomic Broadcast(Zookeeper 原子广播协议),是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的一致性协议。基于该协议,ZooKeeper 实现了一种主从模式的系统架构来保持集群中各个副…

Linux namespace之:uts namespace

理解uts namespace uts(UNIX Time-Sharing System) namespace可隔离hostname和NIS Domain name资源,使得一个宿主机可拥有多个主机名或Domain Name。换句话说,可让不同namespace中的进程看到不同的主机名。 例如,使用unshare命令(较新版本L…

Kubernetes 的原理

kubernetes 已经成为容器编排领域的王者,它是基于容器的集群编排引擎,具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。 本文将带着大家快速了解 kubernetes ,了解我们谈论 kubernetes 都是在谈论什么。 kuberne…

CPU 是如何执行任务的

前言 你清楚下面这几个问题吗? 有了内存,为什么还需要 CPU Cache? CPU 是怎么读写数据的? 如何让 CPU 能读取数据更快一些? CPU 伪共享是如何发生的?又该如何避免? CPU 是如何调度任务的&a…

Ansible 的自动化运维

1、Ansible 特点 Ansible 自 2012 年发布以来,很快在全球流行,其特点如下: Ansible 基于 Python 开发,运维工程师对其二次开发相对比较容易; Ansible 丰富的内置模块,几乎可以满足一切要求; …

图文并茂 VLAN 详解,让你看一遍就理解 VLAN

一、为什么需要VLAN 1.1、什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——也就是广播域。 在此让我们先复习…

认识VLAN,并学会VLAN的划分和网络配置实例

VLAN的划分和网络的配置实例 1、VLAN基础知识 VLAN(Virtual Local Area Network)的中文名为:“虚拟局域网”,注意和VPN(虚拟专用网)进行区分。 VLAN是一种将局域网设备从逻辑上划分(不是从物…

VLAN划分及配置注意事项

VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。VLAN内的主机间可以直接通信,而VLAN间不能直接通信,从而将广播报文限制在一个VLAN内。VLAN之间的通信是通过第3…

Docker原理剖析

一、简介 1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中&#…

Docker容器网络解析

Docker 容器网络的发展历史 在 Dokcer 发布之初,Docker 是将网络、管理、安全等集成在一起的,其中网络模块可以为容器提供桥接网络、主机网络等简单的网络功能。 从 1.7 版本开始,Docker正是把网络和存储这两部分的功能都以插件化形式剥离出来…

Docker 数据管理介绍

默认容器的数据是保存在容器的可读写层,当容器被删除时其上的数据也会丢失,所以为了实现数据的持久性则需要选择一种数据持久技术来保存数据。官方提供了三种存储方式:Volumes、Bind mounts和tmpfs。前面还介绍了:Docker 服务终端…

Docker 数据持久化的三种方案

容器中的数据可以存储在容器层。但是将数据存放在容器层存在以下问题: 数据不是持久化。意思是如果容器删除了,这些数据也就没了 主机上的其它进程不方便访问这些数据 对这些数据的I/O会经过存储驱动,然后到达主机,引入了一层间…