python-socket模块初识
1.socket简介
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
2.socket模块基本方法
初步认识socket模块,学习了其中的基本方法,能在服务端(server),客户端(client)进行简单的相互通信。以下为基本方法简介:
socket(AF_INET,SOCK_STREAM)#函数来创建套接字。 AF_INET #使用IPv4地址进行通信
SOCK_STREAM # TCP套接字类型
setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #设置给定套接字选项的值
#SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的socket,允许重复绑定使用。server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。
bind((self.__ip,self.__port)#绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址
listen(self.__connectSize) #开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1。
s.accept()#被动接受TCP客户端连接,(阻塞式)等待连接的到来
s.connect()# 主动初始化TCP服务器连接,。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误
s.recv()#接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略
s.send() #发送TCP数据,将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
3.socket初体验
简单的问答机器人(机器人是一个线程,等待用户提问):
要求:定义一组问题和答案以列表存储,10个以上,key为问题,value为标准回答,例如如下:
[{‘你好’:’你好’}, {‘我爱你’:‘我也爱你‘}]
#server端
from socket import *
import threading
#问题库:
questionDict={'苹果':'一种水果,很好吃','小姐姐':'是对女孩的一种描述','猪':'是一种动物',
'佩奇':'是一只粉色的小猪','你好':'你好','你是谁':'我是你的朋友','我是谁':'你是我最亲爱的朋友',
'你知道百科全书吗':'当然知道','老虎':'百兽之王呀','喜欢是什么':'我也不知道'}
#智能问答机器人服务器
class RobotServer():
def __init__(self,ip='10.0.14.200',port=9090,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()
#定义独立的线程,处理每一个用户请求
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=''
a = []
a1=[]
for temp in questionDict.keys():
a.append(temp)
b=receiveMsg.count(temp)
a1.append(b)
pass
b=a1.index(max(a1))
answer=questionDict[a[b]]
if not answer:
answer='你说啥'
self.__connection.send(answer.encode('utf-8'))
self.__connection.close()
pass
pass
if __name__=="__main__":
rs=RobotServer()
rs.startServer()
pass
#clientduan
import socket
from socket import *
class RobotClient():
def __init__(self,ip='10.0.14.222',port=9090,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