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()