简单的TCP应用程序

1.服务端

import socket

# 创建一个ipv4的 tcp/ip协议的套接字,‘AF_INET’, 表示IPv4地址类型,‘SOCK_STREAM’, 表示TCP传输协议类型
tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 开始绑定地址端口,参数数元组,(ip地址, 端口号)
tcpSocket.bind(('', 12345))
# 设置监听,最大等待建立连接的个数
tcpSocket.listen(5)

while True:
    print("服务器等待连接。。。。。")
    # 等待接受客户端的连接请求,返回套接字和客户端ip端口
    clientSocket, client_addr = tcpSocket.accept()
    print(f"已经连接到客户端,地址为:{client_addr}")
    try:
        while True:
            # 接收客户端的数据并解码
            recv_data = clientSocket.recv(1024).decode('utf-8')
            print(f"接收客户端的数据为:{recv_data}")
            if recv_data.lower() == "exit":
                print(f"断开与客户端{client_addr}的连接!")
                break
            # 数据编码后发给客户端
            clientSocket.send(f"客户端{client_addr},接收到你的数据数据为:{recv_data}".encode('utf-8'))
    except Exception as e:
        print(e)
    finally:
        # 断开与客户端连接
        clientSocket.close()

上述服务端同一时间只能和一个客户端进行通信,当前连接的客户端关闭后下一个客户端才能与服务器通信。

要想同时和多个客户端保持通信,可使用多线程,代码如下:

import threading, socket

def conn_client(server_client_socket, ipaddr):
    print(f"客户端{ipaddr}成功连接!")
    while True:
        # 接收客户端的数据并解码,参数表示每次最大接收多少数据,单位是字节
        recv_data = server_client_socket.recv(1024).decode('utf-8')
        print(f"接收到客户端{ipaddr}的数据:{recv_data}")
        # 往客户端发送数据
        server_client_socket.send(f"你好,{ipaddr},成功接收到:{recv_data}".encode('utf-8'), )
        if not recv_data or recv_data.lower() == 'exit':
            break
    server_client_socket.close()
    print(f"{ipaddr}连接关闭!")

if __name__ == '__main__':
    # 创建服务端socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定地址和端口
    server_socket.bind(('', 12345))
    server_socket.listen(5)
    while True:
        # 连接客户端的套接字和ip端口
        server_client_socket, ipaddr = server_socket.accept()
        sub_thread = threading.Thread(target=conn_client, args=(server_client_socket, ipaddr))
        # 设置守护进程
        sub_thread.daemon = True
        sub_thread.start()

 

2.客户端

import socket

# 创建一个tcp/ip协议的套接字
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 开始连接服务器地址
clientSocket.connect(("localhost", 12345))

while True:
    data = input("发送数据到服务器(exit退出):")
    if data.lower() == "exit":
        clientSocket.send("exit".encode('utf-8'))
        # 关闭当前的客户端
        clientSocket.close()
        break
    clientSocket.send(data.encode("utf-8"))
    # 接收服务器发送的数据
    data = clientSocket.recv(1024).decode('utf-8')
    # 打印接收的数据
    print(f"接收服务器的数据为:{data}")

 分别运行服务端和客户端程序后,就可以进行客户端与服务器的通信。

posted on 2023-05-01 12:26  木去  阅读(145)  评论(0)    收藏  举报