Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 套接字消息客户端/服务器:客户端不发送消息_Python_Sockets - Fatal编程技术网

Python 套接字消息客户端/服务器:客户端不发送消息

Python 套接字消息客户端/服务器:客户端不发送消息,python,sockets,Python,Sockets,我正在尝试使用Python和Socket创建一个简单的聊天程序。服务器处理两个客户端之间的连接。每当我运行程序时,对于其中一个客户端,第一个客户端之后的每条消息都不会发送。消息甚至没有到达服务器 这是在Windows上,Python3。我集成了线程,因此可以同时发送和接收消息;然而,问题依然存在 Server.py conns = [] # list that stores both connections def accept(sk): while True: co

我正在尝试使用Python和Socket创建一个简单的聊天程序。服务器处理两个客户端之间的连接。每当我运行程序时,对于其中一个客户端,第一个客户端之后的每条消息都不会发送。消息甚至没有到达服务器

这是在Windows上,Python3。我集成了线程,因此可以同时发送和接收消息;然而,问题依然存在

Server.py

conns = [] # list that stores both connections


def accept(sk):
    while True:
        conn, addr = sk.accept()
        conns.append(conn)
        print(addr, "has connected")

    t = threading.Thread(target=accept, args=(sk,))
    t.start() #start accept thread



def send(conn):
    while True:
        message = conn.recv(2048)
        print(message)
        for conn in conns:
            conn.send(message) #sends message to every connection
            print("Sent message")


t = threading.Thread(target=send, args=(conn,))
t.start() #start threading for send
Client.py

def recvMessages(s):
    while True:
        message = s.recv(2048)
        print(message)
        message = message.decode()
        messages.append(message)
        os.system("cls")

        for message in messages:
            print(message)

def sendMessage(s):
    while True:
        message = input()
        message = message.encode()
        s.send(message)

s = socket.socket()
host = socket.gethostname()
port = 8080
s.connect((host, port))
messages = []

print("Connected")
connected = True




threading.Thread(target=sendMessage, args=(s,)).start()
threading.Thread(target=recvMessages, args=(s,)).start()

所有消息都应该从两个客户端发送,但是一个客户端永远不能发送多个消息,另一个可以正常工作。

您的服务器代码缺少套接字,并且在您的示例中没有运行accept,正如James指出的,您还有无效的缩进,下次请提供一个

我还清理了您的文件,因为您遵循了一些不好的做法,特别是将消息广播到所有实际接收的客户端“def send”,避免混淆命名:)

在您的服务器代码中,您也只向一个连接(在您的示例中不存在)发送消息,该连接应在每次收到新消息时运行receive和send

server.py

import socket
import threading

conns = []  # list that stores both connections


def accept(sk):
    while True:
        conn, addr = sk.accept()
        conns.append(conn)
        print(addr, "has connected")

        # receive from new client
        receive_t = threading.Thread(target=receive, args=(conn,))

        receive_t.start()  # start threading for send


def send(s, msg):

        # change message ..
        s.send(msg)  


def broadcast(msg):
    for conn in conns:
        send(conn, msg)


def receive(conn):
    try:
        while True:
            message = conn.recv(2048)

            if not message: # detects if socket is dead, by testing message
                print("client sent Nothing, removing") 
                conns.remove(conn)
                break
            broadcast(message)  # send to all clients
    except ConnectionResetError  as e:
        print('Could not send must be disconnected ')
        conns.remove(conn) # remove dead socket



# added missing socket
sock = socket.socket()
sock.bind(('127.0.0.1', 8080))
sock.listen(1)  # needs to  bind and listen
t = threading.Thread(target=accept, args=(sock,))
t.start()  # start accept thread

import os
import socket
import threading

messages = []


def recvMessages(s):
    while True:
        message = s.recv(2048)

        message = message.decode()
        print('new message= ', message)
        messages.append(message)
        os.system("cls")

        for message in messages:
            print(message)


def send_message(s):
    while True:
        message = input()
        message = message.encode()
        s.send(message)


s = socket.socket()
host = '127.0.0.1'
port = 8080
s.connect((host, port))

print("Connected")
connected = True
# added missing receive

receive = threading.Thread(target=recvMessages, args=(s,)) # missed receive thread in example
receive.start()
send_message(s)

client.py

import socket
import threading

conns = []  # list that stores both connections


def accept(sk):
    while True:
        conn, addr = sk.accept()
        conns.append(conn)
        print(addr, "has connected")

        # receive from new client
        receive_t = threading.Thread(target=receive, args=(conn,))

        receive_t.start()  # start threading for send


def send(s, msg):

        # change message ..
        s.send(msg)  


def broadcast(msg):
    for conn in conns:
        send(conn, msg)


def receive(conn):
    try:
        while True:
            message = conn.recv(2048)

            if not message: # detects if socket is dead, by testing message
                print("client sent Nothing, removing") 
                conns.remove(conn)
                break
            broadcast(message)  # send to all clients
    except ConnectionResetError  as e:
        print('Could not send must be disconnected ')
        conns.remove(conn) # remove dead socket



# added missing socket
sock = socket.socket()
sock.bind(('127.0.0.1', 8080))
sock.listen(1)  # needs to  bind and listen
t = threading.Thread(target=accept, args=(sock,))
t.start()  # start accept thread

import os
import socket
import threading

messages = []


def recvMessages(s):
    while True:
        message = s.recv(2048)

        message = message.decode()
        print('new message= ', message)
        messages.append(message)
        os.system("cls")

        for message in messages:
            print(message)


def send_message(s):
    while True:
        message = input()
        message = message.encode()
        s.send(message)


s = socket.socket()
host = '127.0.0.1'
port = 8080
s.connect((host, port))

print("Connected")
connected = True
# added missing receive

receive = threading.Thread(target=recvMessages, args=(s,)) # missed receive thread in example
receive.start()
send_message(s)


使用名为
send()
的方法接收消息,反之亦然,这是一种糟糕的做法,但您的服务器会将所有传入消息发送到每个客户端,包括发送者,这可能会阻塞系统。@user207421:那么,我将如何实现这一点?什么是更好的实践?因为你的代码格式混乱,我无法理解它。请检查并更正缩进。@JamesKPolk,我很抱歉。它仍然没有意义,因为运行accept的线程似乎在accept的主体中。我想它不应该那样缩进。