python-socket模块初识

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值