您的位置:首页 > 理论基础 > 计算机网络

Python 网络套接字编程

2016-06-06 19:45 330 查看
【网络套接字】

一、使用 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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: