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