zoukankan      html  css  js  c++  java
  • python学习笔记 day31 基于TCP的socket连接

    1. 简单版本---同一主机上的不同程序之间的通信

    # server.py
    import socket
    sk=socket.socket()  # 拿到一个socket对象
    sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    sk.bind(('127.0.0.1',8080))  # 绑定一个IP地址 和一个端口号
    sk.listen()  # 服务器端开始监听
    
    conn,addr=sk.accept()  # 拿到一个客户端的连接和一个地址(走的TCP协议,这时候已经完成三次握手,已经建立连接了)
                           # 阻塞,等待客户端的连接,会一直等待,直到客户端来连接
    print(addr)
    while True:
        ret=conn.recv(1024).decode('utf-8')   # 阻塞,直到接收到客户端发来一个消息,只要连接conn recv接收消息就会阻塞,等待消息,拿不到一直等
        print(ret)
        if ret=='bye':
            break
        info=input(">>>")
        conn.send(bytes(info.encode('utf-8')))  # 不阻塞,消息直接发出去
    
    conn.close()  # 关闭连接,说明TCP之间的连接断开了,
    sk.close()    # 关闭socket对象,如果不关闭还可以使用sk.accept()再次建立连接,跟客户端收发消息
    # client.py
    import socket
    sk=socket.socket()
    sk.connect(('127.0.0.1',8080))
    while True:
        info=input(">>>")
        sk.send(bytes(info.encode('utf-8')))  # 客户端不需要启服务,sk.connect(('ip',port))直接就会拿到一个连接sk
        ret=sk.recv(1024).decode('utf-8')
        print(ret)
        if ret=='bye':
            sk.send(bytes('bye'.encode('utf-8')))
            break
    sk.close()

    2. 一个server端,多个client端

    由于基于TCP的连接都是长连接,也就是当server和一个client建立连接之后,在两者不断开之前,就会一直连着,即使有i其他的client来连server端,这个新来的client端会先一直等着,直到前面的client端和server断开连接,也就是说多个client端和一个server端相连时,同一时间server端之和一个client通话,但是和一个client端断开连接后还可以继续和其他的client继续建立连接;

    # server.py
    import socket
    sk=socket.socket()
    sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    sk.bind(('127.0.0.1',8080))
    sk.listen()
    while True:
        conn, addr = sk.accept()
        while True:
            ret=conn.recv(1024).decode('utf-8')
            print(ret)
            if ret=='bye':
                break
            info=input(">>>")
            conn.send(bytes(info.encode('utf-8')))
        conn.close()
    sk.close()
    # client1.py
    import socket
    sk=socket.socket()
    sk.connect(('127.0.0.1',8080))
    
    while True:
        info=input("client1>>>")
        sk.send(bytes(('client1:'+info).encode('utf-8')))
        ret=sk.recv(1024).decode("utf-8")
        print(ret)
        if ret=='bye':
            sk.send(bytes('bye'.encode('utf-8')))
            break
    sk.close()
    # client2.py
    import socket
    sk=socket.socket()
    sk.connect(('127.0.0.1',8080))
    
    while True:
        info=input("client2>>>")
        sk.send(bytes(('client2:'+info).encode('utf-8')))
        ret=sk.recv(1024).decode("utf-8")
        print(ret)
        if ret=='bye':
            sk.send(bytes('bye'.encode('utf-8')))
            break
    sk.close()

    运行结果:

     

     

    talk is cheap,show me the code
  • 相关阅读:
    第三发
    第二发
    第一发
    要看的算法
    haxe坑
    TCP/IP协议三次握手与四次握手流程解析(转)
    Android动态类生成预加载-dexmaker使用
    Java中ArrayList 、LinkList区别
    Java解析YAML和Android解析YAML
    Java sax、dom、pull解析xml
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9741820.html
Copyright © 2011-2022 走看看