socketローカルエリアネットワークチャット実装

1896 ワード

サービス側プロセス:socketを作成し、ポートをバインドし、ポートを傍受し、クライアント接続を受信し、マルチスレッドを利用してマルチクライアント接続を実現する
import socket,threading

soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
soc.bind(("192.168.100.112", 30000))
#          
clientList = []
#    
def server_target(server_socket):
    while True:
        content = server_socket.recv(2048).decode('utf-8')
        if content is not None:
            print(content)
            
            if content=='exit':
                server_socket.send(''.encode('utf-8'))                
                clientList.remove(server_socket)

            #           
            for c in clientList:
                c.send(content.encode('utf-8'))

            if content=='exit':
                server_socket.close()  
                break    

soc.listen()
while True:
#accept       ,   
    clientSoc,addr = soc.accept()
    print(addr)
    clientList.append(clientSoc)
#    
    threading.Thread(target=server_target, args=(clientSoc,)).start()

クライアント・プロセス:socketを作成し、サービス・エンド・ポートに接続します.
import socket,threading
done = 0

def recv_server(socket_client):
    while True:
    
        print('done=',done)
        if done==1:
            break
        content = socket_client.recv(2048).decode('utf-8')
        if content is not None:
            print(content)
        else:
            client_socket.close()

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client_socket.connect(("192.168.100.112", 30000))

threading.Thread(target=recv_server, args=(client_socket,)).start()
while True:
    line = input('')
    if line is None or line == 'exit':
        client_socket.send(line.encode('utf-8'))
        done = 1 
        break
    client_socket.send(line.encode('utf-8'))