python之网络编程学习笔记

python之网络编程学习笔记

套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
首先介绍一下socket()函数,socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)使用给定的地址族、套接字类型和协议号创建一个新的套接字。
family指地址家族,参数可选AF_INET(默认)AF_INET6AF_UNIXAF_CANAF_PACKETAF_RDS。其中AFadress family的缩写,代表地址家族,INET为因特网,是目前使用最广泛的。AF_INET6使用IPv6寻址
type指套接字类型,参数可选SOCK_STREAM(默认)SOCK_DGRAMSOCK_RAW其他SOCK_常量。其中常用的SOCK_STREAM是面向连接的TCP套接字,SOCK_DGRAM是无连接的UDP套接字。
proto指协议号,通常为零,可以省略。
如果指定fileno,则忽略其他参数,导致具有指定文件描述符的套接字返回
特定套接字对象所需的地址格式将根据创建套接字对象时指定的地址族自动选择。(host, port)用于AF_INET地址家族,其中host是一个字符串,在Internet域表示法中表示主机名,如'daring.cwi.nl',或IPv4地址,如' 100.50.2005 'port为一个整数。
下面是一个简单的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)                       #套接字与地址绑定
tcpSerSock.listen(5)                        #监听连接

while True:                                 #服务器无限循环
    print('waiting for connection...')
    tcpCliSock, addr = tcpSerSock.accept()  #接收客户端连接
    print('...connected from:', addr)
    
    while True:                             #通信循环
        data = tcpCliSock.recv(BUFSIZ)      #接收
        if not data:
            break
        tcpCliSock.send('[%s] %s' % (ctime(), data))    #发送
    tcpCliSock.close()                      #关闭客户端套接字
tcpSerSock.close                            #关闭服务器套接字

上面的脚本运行在服务器端,首先用socket()创建了一个TCP套接字,然后用bind()绑定了地址,host为 ‘’ ,表示INADDR_ANY,用于绑定到所有接口。然后用listen()监听连接,accept()被动接受TCP客户端连接,套接字必须绑定到一个地址并侦听连接,返回值是(conn, address),其中conn是一个新的套接字对象,用于在连接上发送和接收数据,address是绑定到连接另一端套接字的地址。用recv()接收来自TCP客户端的数据,参数为指定要接收的最大数据量,数据以字符串形式返回。send() 发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。最后用close()关闭套接字。
下面是TCP客户端的脚本:


from socket import *

HOST = 'localhost'
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.encode())                   #发送数据
   data = tcpClisock.recv(BUFSIZ)          #接收数据
   if not data:
       break
   print(data)

tcpClisock.close()                          #关闭客户端套接字

这个脚本是TCP客服端上运行的,首先也是用socket()创建一个套接字,然后用socket.connect(hosname, port ) 方法打开一个 TCP 连接到主机为 hostname端口为 port 的服务商。连接后我们就可以从服务端获取数据,记住,操作完成后需要关闭连接。
运行的结果如下


UDP服务器脚本

from socket import *
from time import ctime

HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

udpSersock = socket(AF_INET, SOCK_DGRAM)
udpSersock.bind(ADDR)

while True:
    print('waiting for message...')
    data,addr = udpSersock.recvfrom(BUFSIZ)
    udpSersock.sendto('[%s]  %s' % (ctime(), data),addr)
    print('...received from and returned to :', addr)

udpSersock.close()

UDP客户端脚本

from socket import *

HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

udpCliSock = socket(AF_INET, SOCK_DGRAM)

while True:
    data = input('> ')
    if not data:
        break
    udpCliSock.sendto(data.encode(), ADDR)
    data, ADDR = udpCliSock.recvfrom(BUFSIZ)
    if not data:
        break
    print(data)
    
udpCliSock.close()

TCP套接字和UDP套接字发送/接收数据的函数有一些细微的差别,记住即可,TCP为send()recv(),UDP为sendto()recvfrom()
UDP 和 TCP 服务器之间的一个显著差异是,因为数据报套接字是无连接的,所以就
没有为了成功通信而使一个客户端连接到一个独立的套接字“转换”的操作。这些服务器仅仅接受消息并有可能回复数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值