计算机网络:套接字(Socket)| Python socket实现服务器端与客户端通信,使用TCP socket阿里云ECS服务器与本机通信

所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。

1.套接字的功能

传输层真正连接的是套接字,通过套接字将数据发送给特定的进程。套接字位于传输层及应用层之间,是一个应用编程接口,应用程序通过调用此接口进行传输接收数据。

传输层如何标识套接字:通过ip地址+端口号标识套接字,套接字绑定了主机端口号,ip地址对应相应的主机,进程监控相应端口

注意:一台主机上一个端口号只能对应一个进程,一个进程可以监控多个端口

所以网上给的定义:套接字=ip地址+端口号,ip地址及端口号会封装到传输层的数据(报文)中

2.调用套接字API的过程

基于TCP传输层协议

在这里插入图片描述

譬如Python的socket库,服务端

 1 # -*- coding: utf-8 -*-
 2 import socket
 3 import sys
 4 def socket_service_data():
 5     name = socket.gethostname()
 6     HOST = socket.gethostbyname(name)  # 获取阿里云服务器私网IP,使用ifconfig可查询
 7     PORT = 60000 #安全组中设置
 8     try:
 9         s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
10         s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
11         # s.bind(('127.0.0.1', 6666))  # 在同一台主机的ip下使用测试ip进行通信
12         s.bind((HOST, PORT))  #在不同主机或者同一主机的不同系统下使用实际ip
13         s.listen(10)
14     except socket.error as msg:
15         print(msg)
16         sys.exit(1)
17 
18     print("Wait for Connection..................")
19 
20     while True:
21         sock, addr = s.accept()
22         buf = sock.recv(1024)  #接收数据
23         buf = buf.decode()  #解码
24         print("The data from " + str(addr[0]) + " is " + str(buf))
25         print("Successfully")
26         # return buf
27         sock.close()
28 if __name__ == '__main__':
29     socket_service_data()

客户端

 1 import socket
 2 import sys
 3 def sock_client_data():
 4     while True:
 5         try:
 6             s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 7             s.connect(('192.168.112.8', 60000))  #服务器和客户端在不同的系统或不同的主机下时使用的ip和端口,首先要查看服务器所在的系统网卡的ip
 8             # s.connect(('127.0.0.1', 6666))  #服务器和客户端都在一个系统下时使用的ip和端口
 9         except socket.error as msg:
10             print(msg)
11             print(sys.exit(1))
12         data = input("input data:")   #输入要传输的数据
13         s.send(data.encode())  #将要传输的数据编码发送,如果是字符数据就必须要编码发送
14         s.close()
15 if __name__ == '__main__':
16     sock_client_data()

基于UDP传输层协议

在这里插入图片描述

常用的Socket API函数

  1. scoket():创建并返回套接字
  2. bind():套接字绑定本地端口

3.套接字的分类

主要是根据传输层两个协议划分的:

1.流式套接字。基于TCP,TCP协议是将数据看作无记录无边界的字节流,实现数据无差错、无重复的传输。所以称接受此类数据的套接字为流式套接字,内设流量控制。

2.数据报套接字。基于UDP,数据包以独立的形式发送传输过程数据可能被丢失。所以称接收此类数据的套接字为数据报套接字。

3.原始套接字。该套接字允许对较低层协议(如IP或ICMP)进行直接访问。基本上很少用。

参考:https://blog.csdn.net/shang_0122/article/details/104273944

Python库官方文档

原文地址:https://www.cnblogs.com/cai-zi/p/14875538.html