美文网首页程序员
Python TCP编程

Python TCP编程

作者: PythonMaO | 来源:发表于2017-06-15 22:17 被阅读410次

    1. TCP简介

    TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。

    1. udp通信模型
      udp通信模型中,在通信开始之前,不需要建立相关的链接,只需要发送数据即可,类似于生活中,"写信”
    UDP
    1. tcp通信模型
      tcp通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话"
    TCP

    2. tcp服务器

    生活中的电话机

    1. 如果想让别人能更够打通咱们的电话获取相应服务的话,需要做一下几件事情:
      1.买个手机
      2.插上手机卡
      3.设计手机为正常接听状态(即能够响铃)
      4.静静的等着别人拨打
    2. 如同上面的电话机过程一样,在程序中,如果想要完成一个tcp服务器的功能,需要的流程如下:
      1.socket创建一个套接字
      2.bind绑定ip和port
      3.listen使套接字变为可以被动链接
      4.accept等待客户端的链接
      5.recv/send接收发送数据

    做一个简单的TCP服务器

    import socket
    import time
    
    # 买个手机
    serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 插卡
    serverSocket.bind(('', 10086))
    # 由飞行模式到接听模式
    serverSocket.listen(10)
    
    print('1......')
    
    # 等待电话打入
    newSocket, clientAddr = serverSocket.accept()
    print('2......')
    print(newSocket)
    print(clientAddr)
    
    # time.sleep(100)
    # 关
    newSocket.close()  # 关闭之后,客户端也会被关闭
    
    serverSocket.close()  # 项目运行中服务器一直运行,不会关闭
    

    等待客户端连接

    G:\tools\python3.5\python.exe E:/课件/day28/demo/01_tcp服务端.py
    1......
    

    客户端收发消息

    import socket
    import time
    
    
    clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    clientSocket.connect(('192.168.11.74',10086))
    
    #发
    sendData = input('>>')
    clientSocket.send(sendData.encode('gbk'))
    #收
    recvData = clientSocket.recv(1024)
    print(recvData.decode('gbk'))
    

    服务端收发消息

    import socket
    import time
    '''
    serverSocket是用来接收新的客户端的
    以后与这个连接的客户端的收发消息就不能用serverSocket了,
    而是用返回来的新的newSocket
    '''
    serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serverSocket.bind(('', 10086))
    serverSocket.listen(10)
    newSocket, clientAddr = serverSocket.accept()
    #发
    sendData = input('>>')
    newSocket.send(sendData.encode('gbk'))
    #收
    '''
        此时的recv会导致阻塞。
        一旦对应客户端断开了,不阻塞,并返回''的字符串
    '''
    recvData = newSocket.recv(1024)
    print(recvData)
    
    ewSocket.close()
    serverSocket.close()
    

    服务端收发消息多线程

    import socket
    import time
    import threading
    
    
    def socketState(newSocket, clientAddr):
        while True:
            recvDate = newSocket.recv(1024)
            recvDate = recvDate.decode('gbk')
            if recvDate == '':
                print('客户端%s:%s退出......'%(clientAddr[0],clientAddr[1]))
                newSocket.close()
                break
            else:
                sendDate = 'echo:%s' % recvDate
                newSocket.send(sendDate.encode('gbk'))
                print('来自%s:%s的消息(%s)' % (clientAddr[0], clientAddr[1], time.strftime('%Y-%m-%d %H:%M:%S')) + recvDate)
    
    
    def main():
        serveSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        serveSocket.bind(('', 10086))
        serveSocket.listen(5)
        while True:
            newSocket, clientAddr = serveSocket.accept()
            threading.Thread(target=socketState, args=(newSocket, clientAddr)).start()
    
    
    if __name__ == '__main__':
        main()
    
    

    用网络调试助手模拟客户端

    Paste_Image.png

    服务端收到结果

    G:\tools\python3.5\python.exe E:/workspace/day28/03服务端收发消息多线程.py
    来自192.168.11.67:62945的消息(2017-06-15 22:13:28)hello
    来自192.168.11.67:62946的消息(2017-06-15 22:13:29)你好
    来自192.168.11.67:62945的消息(2017-06-15 22:13:31)hello
    来自192.168.11.67:62946的消息(2017-06-15 22:13:33)你好
    客户端192.168.11.67:62945退出......
    来自192.168.11.67:62946的消息(2017-06-15 22:13:37)你好
    客户端192.168.11.67:62946退出......
    

    相关文章

      网友评论

        本文标题:Python TCP编程

        本文链接:https://www.haomeiwen.com/subject/jjiuqxtx.html