Python核心编程第2章习题选

2-5 网络互连和套接字

先运行服务器,然后启动客户端,客户端可输入任意指令,若输入了dateosls之一,则会相应从服务器返回时间戳、当前操作系统信息,当前目录文件清单

echoserv.py

# coding=utf-8
# TCP服务器程序
import socket
from time import ctime
import os
HOST = ''
PORT = 50007

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST,PORT))
    s.listen(1)
    conn, addr = s.accept()
    msg = b''
    with conn:
        print('Connected by',addr)
        while True:
            data = conn.recv(1024)
            if not data:break
            print('Received ',data)
            if data == b'date':
                msg = bytes('[%s]' % ctime(), 'utf-8')
            elif data == b'os':
                msg = bytes('[%s]' % os.name,'utf-8')
            elif data == b'ls':
                msg = bytes('[%s]' % os.listdir(),'utf-8')
            else:
                msg = data
            conn.sendall(msg)
            

echoclnt.py

# coding=utf-8
# TCP客户端程序
import socket
HOST = 'localhost'
PORT = 50007

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST,PORT))
    data=input('> ')
    s.sendall(bytes(data,'utf-8'))
    data = s.recv(1024)
print('Received',data.decode('utf-8'))

2-6 Daytime服务

得到端口号应该是13
getservbyname("daytime","udp")

udpserv.py

# coding=utf-8
# UDP服务器程序
from socket import *
from time import ctime

HOST = ''
# 确定使用UDP协议的“daytime”服务的端口号
PORT=getservbyname("daytime","udp")
print('使用UDP协议的“daytime”服务的端口号为%s' % PORT)
BUFSIZ = 1024
ADDR = (HOST, PORT)

# udpSerSock = socket(AF_INET, SOCK_STREAM)
udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR)

try:
    while True:
        print('waiting for message...')
        data, addr = udpSerSock.recvfrom(BUFSIZ)
        if not data:
            break
        udpSerSock.sendto(bytes('[%s] %s' % (ctime(),data.decode('utf-8')),'utf-8'),addr)
        print('...received from and returned to:', addr)
except Exception as err:
    print("[UDP_SERVE_ERROR] " + str(err))
finally:
    udpSerSock.close()

udpclnt.py

# coding=utf-8
# UDP客户端
from socket import *

HOST = 'localhost'
# 确定使用UDP协议的“daytime”服务的端口号
PORT=getservbyname("daytime","udp")
print('使用UDP协议的“daytime”服务的端口号为%s' % PORT)
BUFSIZ = 1024
ADDR = (HOST, PORT)

udpCliSock = socket(AF_INET,SOCK_DGRAM)
try:
    while True:
        data = input('> ')
        if not data:
            break
        udpCliSock.sendto(bytes(data,'utf-8'),ADDR)
        data,ADDR = udpCliSock.recvfrom(BUFSIZ)
        print(data.decode('utf-8'))
except EOFError as err:
    print("[UDP_CLIENT_ERROR] " + str(err))
finally:
    udpCliSock.close()

2-7 半双工聊天

tcpserv.py

# coding=utf-8
# 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:
    tcpCliSock, addr = tcpSerSock.accept()
    while True:
        #接收消息
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        print('client> ',data.decode('utf-8'))

        #发送消息
        msg = input('server> ')
        tcpCliSock.send(bytes(msg, 'utf-8'))

    tcpCliSock.close()

tcpSerSock.close()

tcpclnt.py

# coding=utf-8
# TCP半双工聊天客户端程序
from socket import *

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

tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)

while True:
    # 发送消息
    data = input('client> ')
    if not data:
        break
    tcpCliSock.send(bytes(data, 'utf-8'))

    # 接收消息
    data = tcpCliSock.recv(BUFSIZ)
    if not data:
        break
    print('server> ',data.decode('utf-8'))

tcpCliSock.close()

效果图

客户端

服务端
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 面向连接的套接字和无连接的套接字之间的区别是什么? 套接字是计算机网络数据结构,套接字最初是为同一主机上的应...
    小奚有话说阅读 634评论 0 0
  • 1. 网络编程概述 1.1 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接...
    JackChen1024阅读 1,048评论 0 3
  • 客户端/服务器架构 服务器是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。它存在的唯一目的...
    捂不暖的石头阅读 510评论 0 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,837评论 18 139
  • 前端需要注意哪些SEO 合理的title、description、keywords:搜索对着三项的权重逐个减小,t...
    纹小艾阅读 184评论 0 0