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

被折叠的 条评论
为什么被折叠?



