程序说明:7-1 编写一个简单的echo多线程服务器(含客户程序),将用户发送的内容回送给客户程序。
在本程序中,用户发送的内容是Good morning.Nice to meetyou.My old sport.
先运行服务器端,在运行客户端,为展示多线程,我们可以同时启动两个客户端并通过查看服务器端看出
多线程的工程特点。其中服务器端演示如下
Accept new connection from 127 .0.0.1:54609. . .
Accept new connection from 127 .0.0.1:54612. . .
Connection from 127 .0.0.1: 54609 closed .
Connection from 127 .0.0.1:54612 closed .
运行方式:在cmd命令行下执行:
python 7-1.py server
python 7-1.py client
import socket,threading, time, argparse
def tcplink(sock, addr):
print('Accept new connection from %s:%s...' % addr)
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8') == 'exit':
break
sock.send(('client just say:, %s.' % data.decode('utf-8')).encode('utf-8'))
sock.close()
print('Connection from %s:%s closed.' % addr)
def server(address,port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #建立一个socket
s.bind((address, port)) #监听端口
#紧接着,调用listen()方法开始监听端口,传入的参数指定等待连接的最大数量
s.listen(5)
print('Waiting for connection...')
while True:
# 接受一个新连接: 返回的sock用来通信,addr是客户机的地址
sock, addr = s.accept()
t = threading.Thread(target=tcplink, args=(sock, addr)) # 创建新线程来处理TCP连接:
t.start()
def client(address,port):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立连接:
s.connect((address, port))
for data in [b'Good morning', b'Nice to meetyou', b'My old sport']:
s.send(data) # 发送数据:
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()
if __name__ == '__main__':
choices = {'client': client, 'server': server}
parser = argparse.ArgumentParser(description='echo多线程服务器(含客户程序),将用户发送的内容回送给客户程序')
parser.add_argument('role', choices=choices, help='选择服务器或客户端启动')
parser.add_argument('-host',default='127.0.0.1',help='the server listens at (default 127.0.0.1);'
' host the client sends to ')
parser.add_argument('-p', metavar='PORT', type=int, default=6666,help='UDP port (default 6666)')
args = parser.parse_args()
function = choices[args.role]
function(args.host, args.p)
实验结果: