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
原文地址:https://www.cnblogs.com/xuanxuanlove/p/9741820.html