1.服务端(即pc)
import socket import time HOST = '#.#.#.#' #连接本地服务器,可通过ipconfig/all看IPV4的地址 PORT = 8001 #设置端口号,自己设置即可 # socket.AF_INET用于服务器与服务器之间的网络通信 # socket.SOCK_STREAM代表基于TCP的流式socket通信 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind((HOST, PORT)) #绑定端口,告诉别人,这个端口我使用了,其他人别用了 sock.listen(5) #监听这个端口,可连接最多5个设备 while True: #死循环,服务器端一直提供服务。 connection,address = sock.accept() #接收客户端的连接请求 try: connection.settimeout(10) #设置10s时限 buf = connection.recv(1024)#接收数据实例化 if buf: #接收成功 connection.send(b'welcome to server!') #发送消息,b表示bytes类型 print('Connection success!') else: #接收失败 connection.send(b'Please go out!') except socket.timeout: #超时 print('time out!') connection.close() #关闭连接
2.客户端(即树莓派端)
import socket import time HOST = '#.#.#.#' #指服务端IP地址 PORT = 8001 #端口号 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOST,PORT)) #注意,在客户端是连接connect,而在服务端是bind time.sleep(2) sock.send(b'1') #发送信息 print(sock.recv(1024).decode()) #打印接收消息,并且译码 sock.close() #关闭连接
3. socket的基本通信原理
socket是在应用层和传输层之间的一个抽象层,socket本质是编程接口(API),它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。TCP/IP只是一个协议栈,必须要具体实现,同时还要提供对外的操作接口(API),这就是Socket接口。通过Socket,我们才能使用TCP/IP协议。
在Client和Server建立连接成功后,两端都会产生一个Socket实例,操作这个实例,完成所需的会话,而我们就通过这些API进行网络编程,不需要去关心底层的实现了。 Socket连接过程分为三个步骤:服务器监听,客户端请求,连接确认。