机器人问答问题(用socket解决)

本文介绍Socket作为应用层与TCP/IP协议族通信的中间软件抽象层,其作用和基本原理。通过实例展示基于网络类型的套接字家族AF_INET的使用,包括服务器端和客户端的创建过程,实现简单的问答机器人功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

socket是什么:
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的

1、基于文件类型的套接字家族;套接字家族的名字:AF_UNIX

 2、基于网络类型的套接字家族;套接字家族的名字:AF_INET

机器端:

from socket import *
import threading
#问题库:

questionDict={
'你好':'你好呀','好久不见':'好久不见','最近都干了什么':'除了在这里送水什么也没干','你的伙伴呢':'他们都在充电','你的主人是谁':'这个我不能告诉你',
      '你的主人什么时候会来这里':'我也不确定','他上次来是什么时候':'我的主人昨天来过','你主人的联系方式你有吗?':'没有','你能带我去见见你的主人吗?':'不能',
      '好遗憾不能认识你的主人':'深深地感到对不起我帮不到你','没关系,下次记得想你主人问清楚我问的问题':'好的','再见':'再见'
}
#智能问答机器人服务器
class RobotServer():

    def __init__(self,ip='127.0.0.1',port=8080,connectSize=100):
        '''

        :param port: 服务器的端口号
        :param connectSize:默认的并发数量
        '''
        self.__ip=ip
        self.__port=port
        self.__connectSize=connectSize
        pass

    def startServer(self):
        '''
        服务器启动主程序
        :return:
        '''
        server=socket(AF_INET,SOCK_STREAM)
        server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
        server.bind((self.__ip,self.__port))
        server.listen(self.__connectSize)
        while True:
            clientConn,clientAddr=server.accept()
            #定义独立的线程,处理每一个用户请求   nio
            wt=WorkThread(clientConn,clientAddr)
            wt.start()
            pass
        pass
    pass


class WorkThread(threading.Thread):
    def __init__(self,connection,addr,bufferSize=8096):
        threading.Thread.__init__(self)
        self.__connection=connection
        self.__addr=addr
        self.__bufferSize=bufferSize
    def run(self):
        #while True:    #保持长连接
        receiveMsg=self.__connection.recv(self.__bufferSize)
        receiveMsg=receiveMsg.decode('utf-8')
        answer=''
        for temp in questionDict.keys():
            if temp.count(receiveMsg)>0:
                answer=questionDict[temp]
                break
                pass
            pass
        if not answer:
            answer='你说啥'
        self.__connection.send(answer.encode('utf-8'))
        self.__connection.close()
        pass
    pass

if __name__=="__main__":
    rs=RobotServer()
    rs.startServer()
    pass

 

客户端:

import socket
from socket import *


class RobotClient():
    def __init__(self,ip='10.0.14.204',port=8080,bufferSize=8096):
        self.__ip=ip
        self.__port=port
        self.__bufferSize=8096
        pass

    def startSendMsg(self,msg):
        #msg="index.html"
        client=socket(AF_INET,SOCK_STREAM)
        client.connect((self.__ip,self.__port))
        client.send(msg.encode('utf-8'))
        receive=client.recv(self.__bufferSize)
        print(receive.decode('utf-8'))
        client.close()
        pass

    pass

if __name__=="__main__":
    rc=RobotClient()
    while True:
        msg=input('有什么可以帮助您')
        rc.startSendMsg(msg)
    pass
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值