文章目录
一、什么是Socket套接字?
所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。
——百度百科
Socket套接字是一块位于内存区域中的数据,将“套接字”“套接”即是数据交换,程序通过“套接字”交换信息。
形象地可以将Socket比作插头,Port端口比作电缆,通过Socket和Port数据能够在网络传输。
二、Socket套接字类型
套接字表示为(IP:端口号)或是(IP,端口号)
其主要类型有三种:流套接字、数据报套接字、原始套接字。前两者一般称为标准套接字
类型 | 描述 |
---|---|
流套接字 SOCK_STREAM |
使用TCP协议,按顺序无差错连接交换数据,只能读取TCP协议的数据 |
数据报套接字 SOCK_DGRAM |
使用UDP协议,不连接无保障传输交换数据,只能读取UDP协议的数据 |
原始套接字 SOCK_RAW |
可处理未处理的数据包,跨协议交换数据使用 |
三、Socket in Python
Ⅰ、创建Socket
Python通过socket()函数创建套接字
import socket
socket.socket(family,type,proto)
参数 | 描述 |
---|---|
family | 家族 常用socket.AF_UNIX(本地)或socket.AF_INET(ipv4)或socket.AF_INET6(ipv6) |
type | 套接字类型 三种类型 |
proto | 一般省略 0 |
全省略默认使用ipv4和TCP协议
Ⅱ、Socket对象方法
①、Server服务器端专用方法
方法 | 描述 |
---|---|
s_obj.bind((“serverhost”,port)) | 套接字绑定本服务器地址 (ipv4) host置空为本地 |
s_obj.listen(int) | 设置监听数开始监听 建议为5,至少为1 |
s_obj.accept() | 开始等待TCP连接 返回值是数据包与来源地址和端口元组的 元组 |
②、Client客户端专用方法
方法 | 描述 |
---|---|
s_obj.connect((“serverhost”,port)) | 连接TCP服务器 报错抛出异常 |
s_obj.connect_ex() | 连接TCP服务器 报错返回错误码 |
③、常用公共方法
传输建议使用.encode()与.decode()
1、发送数据:
方法 | 描述 |
---|---|
s_obj.send(str) | 发送TCP数据 返回发送的字节数 |
s_obj.sendall(str) | 完整发送TCP数据 成功返回None,失败抛异常 |
s_obj.sendto(str,(“serverhost”,port)) | 发送UDP数据 返回发送的字节数 |
2、接收数据:
方法 | 描述 |
---|---|
s_obj.recv(int) | 接收TCP数据 int指定最大数据量 返回接收的字符串 |
s_obj.recvfrom(int) | 接收UDP数据 int指定最大数据量 返回接收字符串与发送地址的元组 |
3、其他
方法 | 描述 |
---|---|
s_obj.close() | 关闭套接字 |
s_obj.getpeername() | 返回连接套接字的远程地址与端口的元组 |
s_obj.getsockname() | 返回套接字自己的地址与端口的元组 |
四、举个栗子
Ⅰ、TCP
①、Server服务器端
import socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serveraddr = ("",14444)
server.bind(serveraddr)
server.listen(5)
print("TCP On...")
while True:
packet,clientaddr = server.accept()
print("From {}".format(clientaddr))
data = packet.recv(1024)
print(data.decode())
②、Client客户端
import socket
client =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
serveraddr = ("127.0.0.1",14444)
client.connect(serveraddr)
client.send("HelloWorld!".encode())
client.close()
Ⅱ、UDP
①、Server服务器端
import socket
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
serveraddr = ("",14444)
server.bind(serveraddr)
print("UDP On...")
while True:
data,clientaddr = server.recvfrom(1024)
print("From {}, {}".format(clientaddr,data.decode()))
②、Client客户端
import socket
client =socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
serveraddr = ("localhost",14444)
client.sendto("HelloWorld!".encode(),serveraddr)
client.close()
完
欢迎在评论区留言
感谢浏览