Python核心编程第2章习题选

2016-11-29  本文已影响0人  罗佳晨

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()

效果图

客户端
服务端
上一篇下一篇

猜你喜欢

热点阅读