《Python核心编程》练习题之2-6:编写一个应用程序,使该应用程序能够通过网络向daytime服务器发送一条虚拟消息,然后等待daytime服务器回复,一旦收到服务器回复,就将其显示到屏幕上。

题目很长,因为CSDN的文章标题最多100字,所以我就缩减了。题目的意思是指定使用socket.getservbyname()确定使用UDP协议的daytime服务的端口号,然后给服务器发消息,显示服务器回复的消息。
找了一圈,没有在网络上找到提供daytime服务,且为udp协议的服务器,无奈,只能自己写一个udp的服务器咯。

这里首先要说明一下这个socket.getservbyname()函数是个什么东西,在源码里,这个函数是这么写的:

def getservbyname(servicename, protocolname=None): # real signature unknown; restored from __doc__
    """
    getservbyname(servicename[, protocolname]) -> integer
    
    Return a port number from a service name and protocol name.
    The optional protocol name, if given, should be 'tcp' or 'udp',
    otherwise any protocol will match.
    """
    return 0

前面这个servicename就是服务的名字,能写的没几个,比如ftp、http、daytime,这里不能天马行空自己写,只能写英特网上存在的服务。后面那个protocolname只能写’tcp‘或者’udp’,没有第三个值。
所以,在这道题目的要求下,只能写port = socket.getservbyname(‘daytime’,‘udp’),这个port的值必定等于13. 百度了一下13端口,就是固定的提供daytime服务的端口,就像21端口是提供ftp服务,80端口是提供http服务一样。

由于没有找到网络上已知的提供daytime服务的UDP服务器,所以就在本地写了一个提供daytime服务的UDP服务器,代码如下:

from socket import *
import  time
HOST = ''
PORT = 13 #这里的端口号必须是13
BUFFSIZE = 1024
ADDR = (HOST, PORT)

with socket(AF_INET, SOCK_DGRAM) as udpServerSocket:
    udpServerSocket.bind(ADDR)
    while True:
        data, addr = udpServerSocket.recvfrom(BUFFSIZE)
        udpServerSocket.sendto(time.ctime().encode('utf-8'), addr)

再自己写了一个客户端,代码如下:

from socket import *

HOST = '127.0.0.1'
BUFFSIZE = 1024

with socket(AF_INET, SOCK_DGRAM) as udpClientSocket:
    PORT = getservbyname('daytime', 'udp')
    udpClientSocket.sendto('data'.encode('utf-8'), (HOST, PORT))
    data, ADDR = udpClientSocket.recvfrom(BUFFSIZE)
    print(data.decode('utf-8'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值