Socket
一、通信
(一)本地进程间的通信
同台机器不同进程之间的提高方式有多种如:
1.队列
2.同步(互斥锁、条件变量等)
(二)网络进程之间的通信
1.如何唯一标识一个进程(本地PID、网络IP+传输协议+端口) 2.socket(套接字)是实现不同主机进程之间的通讯方式
二、Socket编程
语法
socket.socket(AddressFamily,Type)
- Address Family(常用):可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程 间通信)
- Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)
import socket
s1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s2 = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
print(s1)
三、客户端Socket
- (1)使用socket(),生成套接字描述符;
- (2)通过host_post 结构设置服务器地址和监听端口;
- (3)向服务器发送数据,sendto() ;
- (4)关闭套接字,close() ;
注意:传输协议选择的是UDP协议,无法保证数据的完整性和成功发送
from socket import *
client_socket = socket(AF_INET,SOCK_DGRAM)
server_host_port = ('127.0.0.1',8090)
datas = input('请输入:').encode('utf-8')
client_socket.sendto(datas,server_host_port)
print('发送完成')
client_socket.close()
四、服务端Socket
- (1)使用函数socket(),生成套接字描述符;
- (2)通过host_post 结构设置服务器地址和监听端口;
- (3)使用bind() 函数绑定监听端口,将套接字文件描述符和地址类型变量(host_post)进行绑定;
- (4)接收客户端的数据,使用recvfrom() 函数接收客户端的网络数据;
- (5)关闭套接字,使用close() 函数释放资源;
查看本机IP地址:CMD→ipconfig
from socket import *
scoket_server = socket(AF_INET,SOCK_DGRAM)
host_port = ('127.0.0.1',8090)
scoket_server.bind(host_port)
data = scoket_server.recvfrom(1024)
print(data[0].decode('utf-8'))
print(data)
scoket_server.close()
运行顺序:先开启服务器端,再运行客户端
客户端
服务器端
五、UDP的echo代码
echo服务是一种非常有用的用于调试和检测的工具。该协议接收到什么原样发回,类似于日常生活中的“回声”,即存在回显
(一)客户端的echo代码
from socket import *
'''
需求:
- 1.客户端可以发送多条数据
- 2.客户端如果发送一个“exit”则客户端退出,释放资源
- 3.服务器端收到什么就返回什么
'''
flag = True
client_socket = socket(AF_INET,SOCK_DGRAM)
while flag:
server_host_port = ('127.0.0.1',8090)
datas = input('请输入:').encode('utf-8')
client_socket.sendto(datas,server_host_port)
print("返回的数值是:",client_socket.recvfrom(1024)[0].decode('utf-8'))
if (datas.decode('utf-8')) == "exit":
flag = False
client_socket.close()
服务器端的echo代码
from socket import *
scoket_server = socket(AF_INET,SOCK_DGRAM)
host_port = ('',8090)
scoket_server.bind(host_port)
while True:
data = scoket_server.recvfrom(1024)
scoket_server.sendto(data[0],data[1])
print(data[0].decode('utf-8'))
scoket_server.close()
六、UDP客户端和服务器端的区分
- udp的服务器和客户端的区分:往往是通过
请求服务 和提供服务 来进行区分 - 请求服务的一方称为:客户端
- 提供服务的一方称为:服务器
- 一般情况下,服务器端,需要绑定端口,目的是为了让其他的客户端能够正确发送到此进程
- 客户端,一般不需要绑定,而是让操作系统随机分配,这样就不会因为需要绑定的端口被占用而导致程序无法运行的情况
|