假设我们已经有了客户/服务器,套接字和网络方面的基础,我们把这些概念带到python中来,我们用python中的socket模块来实现网络通信。
一,socket()模块函数
我们用socket()函数来创建套接字。
Socket(socket_family, socket_type,
protocol=0)
套接字家族可以使AF_UNIX或者AF_INET,套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
,protocol一般不填默认为0.
比如一个TCP的套接字:
tcpSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
同样UDP的:
udpSock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
假如我们导入模块时用from socket import *
则可简化上面的代码。
二,套接字对象内建方法
三,建立TCP连接
首先建立服务器程序。
创建套接字,绑定套接字,开始监听,就是一个while循环一直监听有没有消息连接。
客户端程序。
创建套接字,连接,等待输入,发送,
结果我们在两个shell中演示。
下面是在Linux下的实现,就贴截图了。
四 建立UDP连接
服务器端程序:
# C:/Python26/code/socket_Userv.py
from socket import *
from time import ctime
HOST = ''
PORT = 21568
BUFSIZ = 1024
ADDR = (HOST,PORT)
udpSerSock = socket(AF_INET,SOCK_DGRAM)
udpSerSock.bind(ADDR)
while True:
'waiting for message...'
data,addr
= udpSerSock.recvfrom(BUFSIZ)
udpSerSock.sendto('[%s] %s' % (ctime(),data),addr)
'...received from and returned to :',addr
udpSerSock.close()
客户端程序:
# C:/Python26/code/socket_Uclnt.py
from socket import *
HOST = ''
PORT = 21568
BUFSIZ = 1024
ADDR = (HOST,PORT)
udpCliSock = socket(AF_INET,SOCK_DGRAM)
while True:
data =
raw_input('>')
if not
data:
break
udpCliSock.sendto(data,ADDR)
data,ADDR
= udpCliSock.recvfrom(BUFSIZ)
if not
data:
break
data
udpCliSock.close()
五,SocketServer模块
下面看看用SocketServer模块来实现TCP的服务器和客户端。
服务器端:
from SocketServer import (TCPServer as TCP,StreamRequestHandler
as SRH)
from time import ctime
HOST = ''
PORT = 21567
ADDR = (HOST,PORT)
class MyRequestHandler(SRH):
def
handle(self):
print '...connected from:',self.client_address
self.wfile.write('[%s] %s ' % (ctime(),self.rfile.readline()))
tcpServ= TCP(ADDR,MyRequestHandler)
print 'waiting for connection...'
tcpServ.serve_forever()
客户端:
from socket import *
HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
while True:
tcpCliSock=socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
data=raw_input('>')
if not
data:
break
tcpCliSock.send('%s\r\n' % data)
data=tcpCliSock.recv(BUFSIZ)
if not
data:
break
data.strip()
tcpCliSock.close()