目 录
有些基础知识,请参看:Python 网络编程-创建 TCP 服务器和客户端相互通讯
1.创建 UDP 服务器和客户端相互通讯
1.1 服务器端代码实现
from socket import *
from time import ctime
HOST=''
PORT=22222
BUFSIZE=1024
ADDR=(HOST,PORT)
udpSerSocket=socket(AF_INET,SOCK_DGRAM)
udpSerSocket.bind(ADDR) #只需要绑定,不需要 connec
while True:
print("waiting for connection....")
data,addr=udpSerSocket.recvfrom(BUFSIZE)
print("connecting from client:",addr)
udpSerSocket.sendto(bytes("Current time is {0},data is {1}".format(ctime(),data.decode("utf-8")),'utf-8'),addr)
udpSerSocket.close()
1.2 客户端代码实现
from socket import *
HOST="localhost"
PORT=22222
BUFSIZE=1024
ADDR=(HOST,PORT)
udpClientSocket=socket(AF_INET,SOCK_DGRAM)
while True:
data=input("Please input your words!\n")
if not data:
break
udpClientSocket.sendto(bytes(data,"utf-8"),ADDR)
data,ADDR=udpClientSocket.recvfrom(BUFSIZE)
if not data:
break
print(data.decode("utf-8"))
udpClientSocket.close()
1.3 代码运行结果
服务器端运行良好
客户端运行良好
2. socket 模块常见函数和Socket 类用法
服务器端操作 | 客户端操作 |
tcpSerSocket=socket(AF_INET, SOCK_STREAM) 创建服务器端 TCP 套接字 | tcpClientSocket=socket(AF_INET, SOCK_STREAM) 创建客户端 TCP 套接字 |
tcpSerSocket.bind(ADDR) 服务器端套接字绑定地址 | tcpClientSocket.connect(ADDR) 客户端必须连接服务器地址 |
tcpSerSocket.listen(5) 设置并且启动 TCP监听 | |
tcpClientSock,addr=tcpSerSocket.accept() tcpSerSocket.accept,接收到两个变量,一个是 tcpClientSock 用于后续给客户端发送消息,addr 是客户端地址 | |
data=tcpClientSock.recv(BUFSIZE) 服务器端使用 accept 得到的 tcpClientSock 接受 TCP 数据 | data=tcpClientSocket.recv(BUFSIZE) 客户端从服务器端接受TCP 数据 |
tcpClientSock.recv_into(BUF) 服务器端使用 accept 得到的 tcpClientSock 接受 TCP 数据到指定的缓冲区 | tcpClientSock.recv_into(BUF) 客户端从服务器端接受TCP 数据到指定的缓冲区 |
tcpClientSock.send(bytes("Current time is {0}".format(ctime()),'utf-8')) 服务器端使用 accept 得到的 tcpClientSock 发送 TCP 数据,因为是面向连接的,所以不需要地址 | tcpClientSocket.send(bytes(data,"utf-8")) 客户端使用套接字发送 TCP 数据给服务器端 |
tcpClientSock.sendall(data) 服务器端使用 accept 得到的 tcpClientSock 发送完整的 TCP 数据 | tcpClientSocket.sendall(data) 客户端使用套接字发送 TCP 数据给服务器端 |
tcpClientSock.close() 服务器关闭客户端的套接字 | tcpClientSock.close() 客户端关闭客户端的套接字 |
tcpSerSocket.close() 服务器端关闭服务器端的套接字 |
服务器端操作 | 客户端操作 |
udpSerSocket=socket(AF_INET, SOCK_DGRAM) 创建服务器端 UDP 套接字 | udpClientSocket=socket(AF_INET, SOCK_DGRAM) 创建客户端 UDP 套接字 |
udpSerSocket.bind(ADDR) 服务器端套接字绑定地址 | 客户端不需要连接服务器端地址 |
UDP服务器 不需要监听 | |
data,addr=udpSerSocket.recvfrom(BUFSIZE),接收到两个变量,一个是数据,一个是客户端地址 | |
udpSerSocket.sendto(bytes(data),addr) 服务器端使用自己的套接字直接发送 UDP 数据到 addr 指定的地址 | udpClientSocket.sendto(bytes(data),addr) 客户端使用自己的套接字直接发送 UDP 数据到 addr 指定的地址 |
udpSerSocket.close() 服务器关闭客户端的套接字 | udpClientSock.close() 客户端关闭客户端的套接字 |