python网络编程

套接字


(每本书都有不同的说法,这里选用百度词条给出的理解):源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()








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值