【Python】socket编程——使用TCP协议实现智能聊天机器人

题目

使用TCP协议实现智能聊天机器人。编写聊天程序的服务端代码和客户端代码。

完成后,先启动服务端代码,然后启动客户端程序用输入问题,服务端可以返回相应的答案。

要求服务端代码具有一定的智能,能够根据不完整的问题识别客户端真正要问的问题。

(问题和答案是预先定义好的)

相关知识

TCP协议适用于对效率要求相对较低而准确性要求很高的场合,例如文件传输、电子邮件等等,需要建立连接、数据连接、断开连接三个步骤。

socket模块常用于TCP编程的方法有:

  • connect(address):连接远程计算机,注意这里的address依旧是一个元组
  • send(bytes[,flags]):发送数据
  • recv(bufsize[,flags]):接收数据
  • bind(address):绑定地址,通常用于服务端
  • listen(backlog):开始监听,等待客户端连接
  • accept():响应客户端的请求

代码示例

服务端:

#coding:utf-8
#author:Mitchell
from posixpath import split
import socket
from os.path import commonprefix
#建立聊天回复字典
words={'which team is the champion?':'UATH JAZZ',
        'how are you?':'Fine,thank you!',
        'how old are you?':'18 forever',
        'what is your name?':'Mitchell',
        'which team do you like?':'UATH JAZZ!',
        'bye':'Bye!'}
#服务端主机IP地址和端口号,空字符串表示本机任何可用IP地址
HOST=""
PORT=50007
#使用IPV4协议,使用tcp协议传输数据
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定端口和端口号
s.bind((HOST,PORT))
#开始监听,规定最多支持1个客户端连接
s.listen(1)
print('目前监听的端口号是:',PORT)
conn,addr=s.accept()
print('目前连接的IP地址是:',addr)
#开始聊天
while True:
    #最多可以接收1024比特大小的内容,并解码
    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()

客户端:

#coding:utf-8
#author:Mitchell
import socket
import sys

#服务端主机IP地址和端口号
HOST="127.0.0.1"
PORT=50007
#使用IPV4协议,使用tcp协议传输数据
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('请输入你想发送的消息:')
    #发送数据,使用UTF-8编码成字节码
    s.sendall(c.encode())
    #从服务端接收数据,大小最多为1024比特
    data=s.recv(1024)
    #解码
    data=data.decode()
    print('收到回复:',data)
    if c.lower()=='bye':
        break
#关闭连接
s.close()

注意事项

先运行服务端,再运行客户端即可,都可以在控制台完成所有操作。

有问题欢迎私信讨论

你可能感兴趣的:(Python,python,tcp/ip,开发语言)