【网络套接字】
一、使用 TCP协议
1)客户端/Client
二、使用 UDP协议
1)客户端/Client
一、使用 TCP协议
1)客户端/Client
# 模块 socket 提供了创建网络套接字的函数
# 创建 socket 时需要指明 IP层协议 和 传输层协议
# 使用 socket 进行连接时要以 元组 的形式指明目标的 URL 和 端口号
import socket
recBuffer = []
act = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 使用 IPv4 和 TCP
act.connect(('10.62.36.88', 12345)) # 目标URL 和 端口号 以 元组 的形式指明
print 'Waiting for response...'
while True: # 使用循环保证数据全部被接收
data = act.recv(1) # 阻塞式接收数据,每次最多接收 1Byte
if data != '^':
recBuffer.append(data)
else: # 如果接收到的数据为空说明数据接收完毕,跳出循环
break
data = ''.join(recBuffer)
print data
act.send('Python脚本编程之套接字')
print 'Message been sent.'
act.send('^')
print 'Terminate signal been sent.'
act.close() # 关闭socket,千万别忘了
2)服务器端/Server
# 服务器端程序应该以多线程方式编写,并发处理来自多处的请求
# 服务器端运行在本地网络,监听 127.0.0.1
# 服务器端运行在本机所有网卡,监听 0.0.0.0
# 服务器端运行在指定网卡,监听该网卡IP xxx.xxx.xxx.xxx
import socket, threading
def newConnection(newSocket, newAddress): # 负责处理连接请求的子线程所调用的函数
recBuffer = []
print 'new connection request detected, IP is %s port %s' %(newAddress)
newSocket.send('Server is dealing with your request. Your IP is %s port %s\nPlease standby...' %(newAddress))
print 'Message been sent. Waiting for response...'
newSocket.send('^')
print 'Terminate signal been sent.'
while True:
data = newSocket.recv(1)
if not data or data == '^': # 如果接收到的数据为空,或客户端发送了 '^' 则停止接收数据
break
else:
recBuffer.append(data)
data = ''.join(recBuffer)
print data
print 'link going down, target IP is %s port %s' %(newAddress)
newSocket.close() # 一定不要忘了关闭 socket
act = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 使用 IPv4 和 TCP
act.bind(('10.62.36.88', 12345)) # 绑定主机上 IP 为 10.62.36.88 的网卡,打开端口 12345 等待连接
print 'Listening on port 12345, max number of link is 10...'
act.listen(10) # 开始监听 12345 端口,并设置最大连接数为 10
while True:
newSocket, newAddress = act.accept() # 阻塞式接受连接请求,返回值是一个 (sock, addr)元组
thr = threading.Thread(target = newConnection, args = (newSocket, newAddress)) # 新建线程去处理请求
thr.start() # 启动线程
二、使用 UDP协议
1)客户端/Client
import socket
act = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print 'Ready to send UDP data to 10.62.36.88...'
while True:
data = raw_input('data to send: ')
if data != 'disconnect':
act.sendto(data, ('10.62.36.88', 12345))
data = act.recv(512)
print data
else:
break
act.close()
2)服务器端/Server
# UDP是 面向无连接 的协议,传输速度比 TCP协议快,但不如 TCP协议可靠
# UDP协议 与 TCP协议 可以同时使用一个端口
# 因为 UDP协议监听所有发到指定端口的数据,所以在本示例的情形下不使用多线程也可以接收多个客户端数据
import socket
act = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 使用 IPv4 和 UDP
print 'Waiting UDP data on port 12345...'
act.bind(('10.62.36.88', 12345))
while True:
newData, newAddress = act.recvfrom(512)
print newAddress, newData
act.sendto('-- Reply from server: data recieved! --', newAddress)