16-4. 客户。
修改TCP(tsTclnt.py)和UDP(tsUclnt.py)客户端,让服务器的名字不要在代码里写死,要允许用户指定一个主机名和端口,只有在两个值都没有输入的时候,才使用默认值。
# coding=utf-8
__author__ = 'Ibuki Suika'
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUF_SIZE = 1024
ADDRESS = (HOST, PORT)
server = socket(AF_INET, SOCK_STREAM)
server.bind(ADDRESS)
server.listen(5)
while True:
print("waiting for connection...")
sock, address = server.accept()
print("...connected from: (%s, %d)" % address)
while True:
data = sock.recv(BUF_SIZE)
if data == "end":
break
sock.send("[{0:s}] {1:s}".format(ctime(), data))
sock.close()
server.close()
# coding=utf-8
__author__ = 'Ibuki Suika'
from socket import *
BUF_SIZE = 1024
host = raw_input('host: ')
port = raw_input('port: ')
if host == '':
host = '127.0.0.1'
if port == '':
port = '21567'
address = (host, int(port))
client = socket(AF_INET, SOCK_STREAM)
client.connect(address)
while True:
data = raw_input('>')
if not data:
break
client.send(data)
s = client.recv(BUF_SIZE)
if not s:
break
print s
client.close()
# coding=utf-8
__author__ = 'Ibuki Suika'
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUF_SIZE = 1024
ADDRESS = (HOST, PORT)
server = socket(AF_INET, SOCK_DGRAM)
server.bind(ADDRESS)
while True:
print("waiting for message...")
data, address = server.recvfrom(BUF_SIZE)
server.sendto("[%s] %s" % (ctime(), data), address)
print("...receoved from and returned to:(%s, %d)" % address)
server.close()
# coding=utf-8
__author__ = 'Ibuki Suika'
from socket import *
BUF_SIZE = 1024
host = raw_input('host: ')
port = raw_input('port: ')
if host == '':
host = '127.0.0.1'
if port == '':
port = '21567'
address = (host, int(port))
client = socket(AF_INET, SOCK_DGRAM)
while True:
data = raw_input('>')
if not data:
break
client.sendto(data, address)
data, address = client.recvfrom(BUF_SIZE)
if not data:
break
print data
client.close()
16–5. Intenet 网络和套接字。
找到Python Library Reference 中7.2.2 节Guido van Rossum的示例TCP 客户/服务器程序,实现它并让它运行起来。先运行服务器,然后是客户端。源代码的一个在线版本可以在这里找到:
你认为这个服务器太无聊了,决定要修改服务器,让它能识别以下命令:
date 服务器将返回它的当前时间 i.e., time.ctime(time.time())
os 得到操作系统的信息(os.name)
ls 得到当前目录的文件列表 (提示: os.listdir()可以得到目录列表,os.curdir 能得到当前目录)
附加题: 要能接受“ls dir”指令,并返回dir 目录的文件列表。
做这个作业的时候,你不一定要有网络——你的机器可以跟自己通讯。注:在服务器退出后,要清除绑定后才能再次运行。否则,有