Python 网络编程
Python提供两个基本的Socket模块:
- Socket,提供了标准的BSD Sockets API
- SocketServer, 提供了服务器中心类,可以简化网络服务器的开发
1、Socket类型
套接字格式为: socket(family, type[,protocall]),使用给定的地址族、套接字类型、协议类型(默认为0)创建套接字。
TCP编程
服务端
- 创建Socket,绑定Socket到本地IP和端口
- 开始监听连接
- 进入循环,不断接收客户端的连接请求
- 接收传来的数据,并发送给对方数据、
- 传输完毕后,关闭Socket
# coding=utf8
"""
1. 创建Socket,绑定Socket到本地IP和端口
2. 开始监听连接
3. 进入循环,不断接收客户端的连接请求
4. 接收传来的数据,并发送给对方数据
5. 传输完毕后,关闭Socket
"""
import socket
import threading
import time
def dealClient(sock, addr):
# 4. 接收传来的数据,并发送给对方数据
print \'Accept new connection from %s:%s...\' % addr
sock.send(b\'Hello, I am server!\')
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode(\'utf-8\') == \'exit\':
break
print \'-->>%s!\' % data.decode(\'utf-8\')
sock.send(\'Loop_Msg: %s!\' % data.decode(\'utf-8\').encode(\'utf-8\'))
# 5. 传输完毕后,关闭Socket
sock.close()
print \'Connection from %s:%s closed.\' % addr
if __name__ == \'__main__\':
# 1. 创建Socket,绑定Socket到本地IP和端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((\'127.0.0.1\',9999))
# 2. 开始监听连接
s.listen(5) # listen(n)传入的值, n表示的是服务器拒绝(超过限制数量的)连接之前,操作系统可以挂起的最大连接数量。n也可以看作是"排队的数量"
print \'Waiting for connection...\'
# 3. 进入循环,不断接收客户端的连接请求
while True:
sock, addr = s.accept()
t = threading.Thread(target=dealClient, args=(sock, addr))
t.start()
客户端
- 创建Socket,连接远端地址
- 连接后发送数据和接收数据
- 传输完毕后,关闭Socket
# coding=utf8
"""
1. 创建Socket,连接远端地址
2. 连接后发送数据和接收数据
3. 传输完毕后,关闭Socket
"""
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((\'127.0.0.1\', 9999))
print \'-->>\'+s.recv(1024).decode(\'utf-8\')
s.send(b\'Hello I am a client\')
print \'-->>\'+s.recv(1024).decode(\'utf-8\')
s.send(b\'exit\')
s.close()
UDP 编程
服务端
- 创建Socket,绑定指定的IP和端口
- 直接发送数据和接收数据
- 关闭Socket
# coding=utf8
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((\'127.0.0.1\',9999))
print \'Bind UDP on 9999...\'
while True:
data, addr = s.recvfrom(1024)
print \'Received from %s:%s\' % addr
s.sendto(b\'Hello, %s!\' % data, addr)
客户端
与TCP不同,UDP客户端不需要建立连接,创建Socket后可以直接后服务端进行数据交换
# coding=utf8
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b\'Hello\',b\'World\']:
s.sendto(data,(\'127.0.0.1\',9999))
print s.recv(1024).decode(\'utf-8\')
s.close()