Mayuyu学习Python很久了,今天就开始学习Python的网络编程。
其实说到网络编程,就必须提到一个关键词---“套接字”,即Socket。网络化的应用程序在开始任何通讯之前都需
要创建套接字,就像电话插口一样,没有它就没有办法进行通讯。对于套接字来说,一般分为两种:基于文件型和基
于网络型。套接字实质上就是一个通信端点。当然,我们可以创建面向连接的套接字或者面向无连接的套接字,分别
对应TCP协议和UDP协议。
在网络编程中,都是基于C/S模式的,所以分为客户端和服务端。接下来学习利用Python编写最简单的Socket。
先来看基于TCP的Socket:
服务端
#Server
from socket import*
from time import ctime
HOST = '222.27.174.90'
PORT = 21511
BUFSIZE = 1024
ADDR = (HOST,PORT)
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while True:
tcpCliSock, addr = tcpSerSock.accept()
while True:
data = tcpCliSock.recv(BUFSIZE)
if not data:
break
print '%s' %(ctime())
print data
tcpCliSock.send('[%s]\n %s' %(ctime(), data))
tcpSerSock.close()
客户端
from socket import *
HOST = '222.27.174.90'
PORT = 21511
BUFSIZE = 1024
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = raw_input('>')
if not data:
continue
tcpCliSock.send(data)
data = tcpCliSock.recv(BUFSIZE)
print data
tcpCliSock.close()
服务端和客户端的HOST与PORT一定要相同才行。
基于UDP的Socket:
服务端:
#Server
from socket import*
from time import ctime
HOST = '222.27.174.90'
PORT = 21512
BUFSIZE = 1024
ADDR = (HOST,PORT)
udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR)
while True:
data, addr = udpSerSock.recvfrom(BUFSIZE)
print '%s' %(ctime())
print data
udpSerSock.sendto('[%s]\n %s' %(ctime(), data), addr)
udpSerSock.close()
客户端:
from socket import *
HOST = '222.27.174.90'
PORT = 21512
BUFSIZE = 1024
ADDR = (HOST, PORT)
udpCliSock = socket(AF_INET,SOCK_DGRAM)
while True:
data = raw_input('>')
if not data:
continue
udpCliSock.sendto(data, ADDR)
data, ADDR = udpCliSock.recvfrom(BUFSIZE)
print data
udpCliSock.close()
接下来学习一些套接字对象的常用函数。。。
(1)服务端套接字函数
s.bind() 绑定地址(主机名,端口)到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户端连接,(阻塞式等待连接的到来)
(2)客户端套接字函数
s.connect() 主动初始化TCP服务器连接
s.connect_ex() connect)()函数的扩展版本,出错时返回出错码,而不是抛出异常
(3)公共用途的套接字函数
s.recv() 接收TCP数据
s.send() 发送TCP数据
s.sendall() 完整发送TCP数据
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据