• 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
  • 相关阅读:
    Mahout机器学习平台之聚类算法具体剖析(含实例分析)
    算法导论 动态规划 钢条分割问题的自底向上解法
    玩转Linux网络namespace-单机自环測试与策略路由
    Unity KillCount
    android 项目中使用到的网络请求框架以及怎样配置好接口URL
    Gradle 1.12 翻译——第十四章. 教程
    MySQL 性能优化
    Git教程
    Eclipse常用小知识汇总
    自定义全局异常捕获
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9741820.html
Copyright © 2020-2023  润新知