编写程序分别实现服务端和客户端要求功能 服务器能够使用TCP协议同时为多台客户端主机提供部分电影的演员信息查询服务(基于多线程或者异步通信): 服务端启动后,需先建立数据结构来存储从movieResult.csv文件中读入的电影数据,并建立socket对象监听客户端的TCP连接请求,如有请求便同意与客户端建立tcp连接 客户端运行时能够提示并接收用户输入的电影名称,并将电影名称数据传递给服务器(需与服务器建立tcp连接) 服务器接收到客户端传递的电影名称后,查询读入的电影数据,如果没有该电影的演员信息则返回没有该电影数据!,如果有该电影的演员信息则返回该电影的主演信息 客户端接收到返回的查询结果后在屏幕上输出相应的结果 服务器为同一客户端提供连续查询服务的时间间隔为5秒
import socket
ADDR = ('127.0.0.1', 1060)
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.connect(ADDR)
print ('connect to ', ADDR)
# username = input("用户名:")
# sk.send(username.encode('utf-8'))
while True:
com = input("输入查询内容:")
sk.send(com.encode('utf-8'))
data = sk.recv(2048)
print(data.decode('utf-8'))
# #判断是否真正接收完成
# if data != b'success':
# break
# #给服务端发送结束信号
# print("文件已经传输完毕。")
sk.send('quit'.encode())
# 导入模块
import socket
import threading
import csv
import datetime
usernames = {}
movieDict = {}
with open("MovieResult.csv") as f:
readers = csv.reader(f)
for reader in readers:
movieDict[reader[1]] = reader[2]
print(movieDict)
# 接收消息
def recv(client_socket, ip_port):
while True:
client_text = client_socket.recv(1024)
msg = client_text.decode('utf-8')
starttime = usernames[ip_port]
endtime = datetime.datetime.now()
du_time = (endtime - starttime).seconds
if du_time > 5 :
usernames[ip_port] = datetime.datetime.now()
if msg in movieDict.keys():
client_socket.send((movieDict[client_text.decode('utf-8')]).encode())
else:
client_socket.send("无查询内容".encode())
else:
client_socket.send("重复查询,请5秒以后再试。".encode())
# 如果接收的消息长度不为0,则将其解码输出
if client_text:
print("[客户端消息]", ip_port, ":", client_text.decode("utf-8"))
# 当客户端断开连接时,会一直发送''空字符串,所以长度为0已下线
else:
print("客户端", ip_port, "已下线")
del usernames[ip_port]
client_socket.close()
break
# 程序主入口
def main():
# 创建TCP套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口
tcp_socket.bind(("127.0.0.1", 1060))
# 设置为被动监听状态,128表示最大连接数
tcp_socket.listen(128)
while True:
# 等待客户端连接
client_socket, ip_port = tcp_socket.accept()
usernames[ip_port] = datetime.datetime.now()
print("[新客户端]:", ip_port, "已连接")
client_socket.send("初始化5秒钟请等待......".encode())
# 有客户端连接后,创建一个线程将客户端套接字,IP端口传入recv函数,
t1 = threading.Thread(target=recv, args=(client_socket, ip_port))
# 设置线程守护
t1.setDaemon(True)
# 启动线程
t1.start()
if __name__ == '__main__':
main()
资源已上传至资源库