添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
绅士的剪刀  ·  oracle interval type_不 ...·  1 年前    · 
稳重的煎饼  ·  rstudio导入txt文件-掘金·  1 年前    · 
global g_socket_server g_socket_server = socket . socket ( socket . AF_INET , socket . SOCK_STREAM ) g_socket_server . bind ( ADDRESS ) g_socket_server . listen ( 5 ) # 最大等待数(有很多人理解为最大连接数,其实是错误的) print ( "server start,wait for client connecting..." ) def accept_client ( ) : 接收新连接 while True : client , info = g_socket_server . accept ( ) # 阻塞,等待客户端连接 # 给每个客户端创建一个独立的线程进行管理 thread = Thread ( target = message_handle , args = ( client , info ) ) # 设置成守护线程 thread . setDaemon ( True ) thread . start ( ) def message_handle ( client , info ) : client . sendall ( "connect server successfully!" . encode ( encoding = 'utf8' ) ) while True : try : bytes = client . recv ( 1024 ) msg = bytes . decode ( encoding = 'utf8' ) jd = json . loads ( msg ) cmd = jd [ 'COMMAND' ] client_type = jd [ 'client_type' ] if 'CONNECT' == cmd : g_conn_pool [ client_type ] = client print ( 'on client connect: ' + client_type , info ) elif 'SEND_DATA' == cmd : print ( 'recv client msg: ' + client_type , jd [ 'data' ] ) except Exception as e : print ( e ) remove_client ( client_type ) break def remove_client ( client_type ) : client = g_conn_pool [ client_type ] if None != client : client . close ( ) g_conn_pool . pop ( client_type ) print ( "client offline: " + client_type ) if __name__ == '__main__' : init ( ) # 新开一个线程,用于接收新连接 thread = Thread ( target = accept_client ) thread . setDaemon ( True ) thread . start ( ) # 主线程逻辑 while True : time . sleep ( 0.1 )

四、client.py代码

import socket  
import json
ADDRESS = ('127.0.0.1', 8712)
# 如果开多个客户端,这个client_type设置不同的值,比如客户端1为linxinfa,客户端2为linxinfa2
client_type ='linxinfa'
def send_data(client, cmd, **kv):
    global client_type
    jd = {}
    jd['COMMAND'] = cmd
    jd['client_type'] = client_type
    jd['data'] = kv
    jsonstr = json.dumps(jd)
    print('send: ' + jsonstr)
    client.sendall(jsonstr.encode('utf8'))
def input_client_type():
    return input("注册客户端,请输入名字 :")
if '__main__' == __name__:
    client_type = input_client_type()
    client = socket.socket() 
    client.connect(ADDRESS)
    print(client.recv(1024).decode(encoding='utf8'))
    send_data(client, 'CONNECT')
    while True:
        a=input("请输入要发送的信息:")
        send_data(client, 'SEND_DATA', data=a)
                    server.py代码import socket  # 导入 socket 模块from threading import Threadimport timeimport jsonADDRESS = ('127.0.0.1', 8712)  # 绑定地址 g_socket_server = None  # 负责监听的socket g_conn_pool = {}  # 连接池...
一、socket()里的四个参数
sk = socket(family = AF_INET,type = SOCK_STREAM,proto = 0,fileno = None)
二、socket模块的其他方法
1、...
    # 处理客户端连接
    request = client_socket.recv(1024)
    print(f"Received from client: {request.decode('utf-8')}")
    # 发送响应
    response = "Hello from server"
    client_socket.send(response.encode('utf-8'))
    # 关闭连接
    client_socket.close()
if __name__ == '__main__':
    # 创建一个TCP socket
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 绑定到本地端口
    server_socket.bind(('127.0.0.1', 8888))
    # 监听端口
    server_socket.listen(5)
    print("Listening on port 8888...")
    # 循环等待连接
    while True:
        client_socket, address = server_socket.accept()
        print(f"Accepted connection from {address[0]}:{address[1]}")
        # 创建一个新的线程来处理连接
        client_thread = threading.Thread(target=handle_client, args=(client_socket,))
        client_thread.start()
这个程序创建一个TCP socket并绑定到本地端口8888。然后,它进入一个循环,等待客户端连接。当有客户端连接时,程序会创建一个新的线程来处理连接,这样服务器就可以同时处理多个客户端请求。在这个例子中,handle_client() 函数用于处理连接,它接收客户端发送的消息并发送一个简单的响应,然后关闭连接