套接字
(每本书都有不同的说法,这里选用百度词条给出的理解):源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务。套接字有两种分别是基于文件型(Unix套接字,其“家族名”为AF_UNIX)的和基于网络型的(其“家族名”为AF_INET)。
python只支持AF_UNIX,AF_INET,AF_NETLINK(一种Linux套接字)。
最常用的套接字对象方法
套接字的类型
套接字的类型只有两种:面向连接的套接字和无连接的套接字。
面向连接的套接字
即在通讯前一定要建立一条连接,它提供了一种顺序可靠不会重复的数据传输,实现这种连接的主要协议就是传输控制协议(即TCP),要创建这种套接字需要指定套接字类型为SOCK_STREAM,由于这类套接字使用网际协议(IP)来查找网络中的主机,所以一般会用TCO/IP组合来描述。
创建TCP客户端
from socket import *
from time import ctime
#设置主机名与端口
HOST=" "
PORT=21567
#设置缓冲区大小
BUFSIZ=1024
ADDR=(HOST,PORT)
#创建服务器套接字
tcpSerSock=socket(AF_INET,SOCK_STREAM)
#把地址绑定到套接字上面
tcpSerSock.bind(ADDR)
#最多允许5个连接
tcpSerSock.listen(10)
#服务器无限循环
while True:
print ("waiting for connection......")
#接收客户端连接,accept()函数使阻塞式的
tcpCliSock, addr=tcpSerSock.accept()
print('......connected from:',addr)
#通信循环
while True:
data=tcpCliSock.recv(BUFSIZ)#对话,接收
if not data:
break
data=data.decode()
tcpCliSock.send(('[%s]%s'%(ctime(),data)).encode())
tcpCliSock.close()
tcpSerSock.close()
关于套接字的decode() ,encode()问题,参见http://blog.csdn.net/chuanchuan608/article/details/17915959
创建TCP客户端
from socket import *
#创建一个TCP客户端,程序会提示用户输入要传给服务器的信息
#显示服务器返回的加了时间戳的结果
HOST=' '
PORT=21567
BUFSIZ=1024
ADDR=(HOST,PORT)
#创建客户端套接字
tcpCliSock=socket(AF_INET,SOCK_STREAM)
#尝试连接服务器
tcpCliSock.connect(ADDR)
#与服务器对话
while True:
data=input('>')
if not data:#用户没有输入时退出
break
tcpCliSock.send(data)
data=tcpCliSock.rec(BUFSIZ)
if not data:#服务器由于某种原因退出时导致接受失败而退出
break
print (data)
tcpCliSock.close()
无连接的套接字
这意味着无需连接就可以通讯,但是数据到达的顺序和可靠性便无法保证,实现这种连接的主要协议就是用户数据报协议(即UDP),要创建UDP就得在创建的时候指定SOCK_DGRAM,同上,一般会有UDP/IP组合名来描述。
创建一个UDP服务器
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(('[%s] %s'%(ctime(), data)).encode(),addr)
print ('......received from and returned to:',addr)
udpSerSock.close()
创建一个UDP客户端
from socket import *
#不需要和服务器建立链接直接把消息发出去然后等待服务器的回复。
HOST='<span style="font-family:arial,宋体,sans-serif;"> </span>'
PORT=21567
BUFSIZE=1024
ADDR=(HOST,PORT)
udpCliSock=socket(AF_INET,SOCK_DGRAM)
while True:
data=input('> ')
if not data:
break
data=data.encode()
udpCliSock.sendto(data,ADDR)
data,ADDR=udpCliSock.recvfrom(BUFSIZE)
if not data:
break
print (data)
udpCliSock.close()