socket()编程
由于socket模块中用到的属性很多,简化代码先使用
from socket import *
#正常不要使用*,依次导入需要的属性和方法
创建一个TCP/IP的套接字
tcpsock = socket(AF_INET,SOCK_STREAM)
创建一个UDP/IP的套接字
udpsock = socket(AF_INET,SOCK_DGRAM)
列举套接字内建方法
server: | client: |
bind()
绑定地址(ip/port)
listen()
开始监听
accept()
被动接受tcp客户端连接(阻塞式)
|
connect()
主动连接tcp服务器
connect_ex()
connect()的扩展版本,出错返回错误码,而不是抛出异常
|
公共使用 | 面向模块的函数 | 面向文件 |
recv() 接受tcp数据 send() 发送tcp数据 sendall() 完整发送tcp数据 sendto() 接收udp数据 sendto() 发送udp数据 getpeername() 接收到当前套接字远端的地址(tcp连接) getsockname() 当前套接字地址 getsockopt() 返回指定套接字的参数 setsockopt() 设置指定套接字的参数 close() 关闭 | setblocking() 设置套接字的阻塞与非阻塞模式 settimeout() 设置超时时间 gettimeout() 得到超时时间 | fileno() 套接字文件描述符 makefile() 创建一个与该套接字关联的文件对象 |
普遍的socket编程流程
伪代码:
ss = socket() #创建
ss.bind() #绑定地址
ss.listen() #监听
loop:
cs = ss.accept() #接收client连接
talk_loop:
cs.recv()/cs.send() #对话
cs.close() #关闭客户端socket
ss.close() #关闭server socket
来个简单的示例
功能,server 接收client的消息,在接收的消息上加上时间戳返回tcp
#!/usr/bin/python
from socket import *
from socket import ctime
HOST = ''
PORT = 5000
BUFSIZE = 1024
ADDR = (HOST,PORT)
server = socket(AF_INET,SOCK_STREAM)
server.bind(ADDR)
server.listen(5)
while True:
print 'waiting for client to connect'
conn,addr = server.accept()
print '....connected from',addr
while True:
data = conn.recv(BUFSIZE)
if not data:
break
conn.send('[%s] %s' % (ctime(),data))
conn.close()
server.close()
tcp客户端
伪代码(很容易理解):
cs = socket()
cs.connect()
loop:
cs.send()/cs.recv()
cs.close
TCP客户端
#!/usr/bin/python
from socket import *
HOST = '127.0.0.1'
PORT = 5000
BUFSIZE = 1024
ADDR = (HOST,PORT)
client = socket(AF_INET,SOCK_STREAM)
client.connect(ADDR)
while True:
data = raw_input('>')
if not data:
break
client.send(data)
data = client.recv(BUFSIZE)
if not data:
break
print data
client.close()
运行
server:
client:
udp不是面向连接的设置比tcp少
udpserver:
先是伪代码:
ss = socket()
ss.bind()
loop:
cs = ss.recvfrom()/ss.sendto()
ss.close()
udpserver.py:
#!/usr/bin/python
from socket import *
from time import ctime
HOST = ''
PORT = 5001
BUFSIZE = 1024
ADDR = (HOST,PORT)
server = socket(AF_INET,SOCK_DGRAM)
server.bind(ADDR)
while True:
print 'waiting for message...'
data,addr = server.recvfrom(BUFSIZE)
server.sendto('[%s] %s' % (ctime(),data),addr)
print '....received from and returned to :' , addr
server.close()
创建客户端就更简单了:
cs = socket()
loop:
cs.sendto()/cs.recvfrom()
cs.close()
本来不打算写了,还是写一下。。
#!/usr/bin/python
from socket import *
HOST = '127.0.0.1'
PORT = 5001
BUFSIZE = 1024
ADDR = (HOST,PORT)
client = socket(AF_INET,SOCK_DGRAM)
while True:
data = raw_input('>')
if not data:
break
client.sendto(data,ADDR)
data = client.recvfrom(BUFSIZE)
if not data:
break
print data
client.close()