socket网络编程那篇文章说过,udp是面向无连接的,使用数据报,socket type使用sock_DGRAME,由于面向无连接因此涉及到的设置较少,主要代码如下:
ss = socket() #创建服务器套接字
ss.bind() #帮定监听地址
inf_loop: #服务器无限循环
cs = ss.recvrom() or ss.sendto() #接收/发送数据
ss.close() #关闭套接字
具体实现代码如下:
!/usr/bin/env python
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUFSIZE=1024
ADDR = (HOST, PORT)
udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR)
while True:
print 'waiting for message...'
data, addr = udpSerSock.recvfrom(BUFSIZE)
udpSerSock.sendto('time is %s you input string===>%s' % (ctime(), data))
print 'shou dao client falai de neirong wei:%s' % addr
udpSerSock.close()
udp客户创建较简单主要代码如下:
cs = sockte() #创建套接字
comm_loop: #通信循环
cs.sendto()/cs.recvfrom() #发送数据/接收数据
cs.close() #关闭连接
详细代码如下:
!/usr/bin/python
from socket import *
HOST='127.0.0.1'
PORT=21567
BUFSIZE=1024
ADDR = (HOST, PORT)
udpCliSock = socket(AF_INET, SOCK_DGRAM)
while True:
data = raw_input('please input==>')
if not data:
break
print '-'30
udpCliSock.sendto(data, ADDR)
print '-'10
data, addr = udpCliSock.recvfrom(BUFSIZE)
print '-'*30
print data, addr
if not data:
break
print data, addr
print dataudpclisock.close()
udpCliSock.close()
socket模块除了socket()函数之外还有其他几个常用的函数。
socket模块属性:
数据属性:AF_unix,AF_INET,AF_INET6 python支持的套接字地址家族
SO——STREAM,SO_DGRAM 套接字类型 tcp=STREAM,udp=DGRAM
has_ipv6 是否支持IPv6标志。
异常 error 套接字相关错误,herror 主机和地址相关错误,gaierr 地址相关错误
timeout 超时
函数:socket指定的地址家族,套接字类型和协议类型创建一个套接字对象。
socketpar 用指定的家族、套接字类型和协议创建一对套接字对象。
fromfd()用一个已经代开的文件描述符创建一个套接字对象
ssl()在套接字基础上发起一个安全套接字成曾层ssl不做证书验证
getaddrinfo 得到地址信息
getfqdn()返回完整的域名
gethostname()得到当前主机的名字
gethostbyname()由主机名字得到对应的IP
gethostbyname_ex()gethostbyname的扩展返回主机所有别名和IP
内置模块socketServer
模块调用示例代码如下:
!/usr/bin/env python
from SocketServer import (TCPServer as TCP, StreamRequestHandler as SRH)
from time import ctime
HOST = ''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST, PORT)
class MyRequestHandler(SRH):
"""docstring for MyRequestHandler"""
#def init(self, arg):
# super(MyRequestHandler, self).init()
# self.arg = arg
def handle(self):
print '....connected from:', self.client_address
self.wfile.write('%s %s' % (ctime(), self.rfile.readline()
tcpServer = TCP(ADDR,MyRequestHandler)
print 'WATING FOR CONNECTION...'
TCPServer.serve_forever()
客户端有数据传输时调用handle函数,StreamRequestHandler类支持像操作文件对象那样操作输入输出套接字,使用readline()函数获取客户端消息,使用write(把字符窜发送给客户端),为了保持一致性,我们重用了在客户端传过来的回车与换行符,其他代码与服务器是一样的。
使用之前方法编写客户端代码进行连接即可。