🌴 2022.6.10 下午 实验八
实验八 网络程序设计
题目
使用基于TCP或UDP套接字编写一个智能聊天机器人程序
问题分析
TCP工作需要建立连接、数据连接、断开连接三个步骤。利用socket模块,设计服务端与客户端,通过设置IP和端口号将二者连接。在服务端建立词库,客户端给服务端发送消息,服务端与词库做匹配后返回给客户端并输出
socket模块常用于TCP编程的方法:
socket.socket:创建套接字
serverSocket.bind((IP, Port)) :绑定套接字
connect(address):连接远程计算机
send(bytes[,flags]):发送数据
recv(bufsize[,flags]):接收数据
bind(address):绑定地址,通常用于服务端
listen(backlog):开始监听,等待客户端连接
accept():响应客户端的请求
代码
简易版
'''先运行服务端再运行客户端''' """ @Author:张时贰 @Date:2022年06月15日 @CSDN:张时贰 @Blog:zhsher.cn """ import socket serverSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) serverSocket.bind(('127.0.0.1',12345)) print("在12345端口绑定UDP...") answers = ["伽利略, 哥白尼","爱迪生, 特斯拉","诺贝尔, 门捷列夫"] i = 0 while True: question,addr = serverSocket.recvfrom(1024) print("客户端问:",question.decode()) serverSocket.sendto(bytes("服务器答:" + answers[i],encoding='utf8'),addr) i = i + 1 serverSocket.close()
|
""" @Author:张时贰 @Date:2022年06月15日 @CSDN:张时贰 @Blog:zhsher.cn """ import socket clientSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) questions = ['世界上最伟大的天文学家是谁?','世界上最伟大的发明家是谁?', '世界上最伟大的化学家是谁?']
for question in questions: clientSocket.sendto(bytes(question,encoding='utf8'),('127.0.0.1',12345)) print("客户端问:" + question) answer,addr = clientSocket.recvfrom(1024) print(str(answer.decode())) clientSocket.close()
|
略加优化,可以粗略判断回复相近消息
""" @Author:张时贰 @Date:2022年06月08日 @CSDN:张时贰 @Blog:zhsher.cn """ '''优化非原创,链接:http://t.csdn.cn/DOI0V''' '''先运行服务端代码,然后运行客户端'''
import socket from os.path import commonprefix
words = {'What is your name': 'Zhangshier', 'how are you?': 'Fine,thank you!', 'how old are you?': '18 forever', 'bye': 'Bye!'}
HOST = "192.168.43.214" PORT = 50007
s = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
s.bind ( (HOST, PORT) )
s.listen ( 1 ) print ( '目前监听的端口号是:', PORT ) conn, addr = s.accept () print ( '目前连接的IP地址是:', addr )
while True: data = conn.recv ( 1024 ).decode () if not data: break print ( '接收到的内容:', data ) m = 0 key = '' for k in words.keys (): data = ' '.join ( data.split () ) if len ( commonprefix ( [ k, data ] ) ) > len ( k )*0.7: key = k break length = len ( set ( data.split () ) & set ( k.split () ) ) if length > m: m = length key = k conn.sendall ( words.get ( key, 'Sorry,can\'t find your problem! ' ).encode () ) conn.close ()
|
import socket import sys
HOST = "192.168.43.214" PORT = 50007
s = socket.socket ( socket.AF_INET, socket.SOCK_STREAM ) try: s.connect ( (HOST, PORT) ) except Exception as e: print ( '找不到服务器,请稍后重试!' ) sys.exit () while True: c = input ( '请输入你想发送的消息:' ) s.sendall ( c.encode () ) data = s.recv ( 1024 ) data = data.decode () print ( '收到回复:', data ) if c.lower () == 'bye': break
s.close ()
|
结果
