(每本书都有不同的说法,这里选用百度词条给出的理解):源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()
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u014245881/article/details/46685541