当前位置: 首页 > 知识库问答 >
问题:

同时发送/接收消息套接字python

康鹏云
2023-03-14

我一直在开发一个简单的python套接字聊天室,客户端和服务器可以在其中相互发送消息。我遇到的问题是服务器和客户端一次只能发送一条消息。我希望它能像任何其他聊天室一样工作,在那里我可以在发送消息时收到消息,任何帮助都会有很大帮助

import socket
import sys

s = socket.socket()
host = socket.gethostname()
print(" server will start on host : ", host)
port = 8080
s.bind((host,port))
name = input(str("Please enter your username: "))
print("")
print("Server is waiting for incoming connections")
print("")
s.listen(1)
conn, addr = s.accept()
print("Recieved connection")
print("")
s_name = conn.recv(1024)
s_name = s_name.decode()
print(s_name, "has joined the chat room")
conn.send(name.encode())

while 1:
    message = input(str("Please enter your message: "))
    conn.send(message.encode())
    print("Sent")
    print("")
    message = conn.recv(1024)
    message = message.decode()
    print(s_name, ":" ,message)
    print("")
import socket
import sys

s = socket.socket()
host = input(str("Please enter the hostname of the server : "))
port = 8080
s.connect((host,port))
name = input(str("Please enter your username : "))
print(" Connected to chat server")

s.send(name.encode())
s_name = s.recv(1024)
s_name = s_name.decode()
print("")
print(s_name, "has joined the chat room ")

while 1:
    message = s.recv(1024)
    message = message.decode()
    print(s_name, ":" ,message)
    print("")
    message = input(str("Please enter your message: "))
    message = message.encode()
    s.send(message)
    print("Sent")
    print("")

共有3个答案

郭通
2023-03-14

这是服务器

import socket
import threading as th

def accept_client():
    while True:
        # ACCEPTING    
        cli_sock, cli_add = ser_sock.accept()
        uname = cli_sock.recv(1024)
        CONN_LIST.append((uname, cli_sock))
        print('%s is now connected' %uname)

def broadcast_usr():
    while True:
        for i in range(len(CONN_LIST)):
            try:
                data = CONN_LIST[i][1].recv(1024)
                if data:
                    b_usr(CONN_LIST[i][1], CONN_LIST[i][0], data)
            except Exception as x:
                print(x.message)
                break

def b_usr(cs_sock, sen_name, msg):
    for i in range(len(CONNECTION_LIST)):
        if (CONN_LIST[i][1] != cs_sock):
            CONN_LIST[i][1].send(sen_name)
            CONN_LIST[i][1].send(msg)


if __name__ == "__main__":    
    CONN_LIST = []

    # SOCKET
    ser_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # BINDING
    host = '192.168.x.x' #LOCAL HOST
    port = 4444
    ser_sock.bind((host, port))

    # LISTENING    
    ser_sock.listen(1)
    print('Chat server started on port : ' + str(port))

    thread_ac = th.Thread(target = accept_client)
    thread_ac.start()

    thread_bs = th.Thread(target = broadcast_usr)
    thread_bs.start()
夏侯阳
2023-03-14

您是否尝试使用线程模块或时间模块。这是因为两个脚本同时发送消息。尝试Ex(首先从服务器发送客户端等待消息,然后客户端向服务器发送消息)。

阚元白
2023-03-14

CaSper 给了我服务器代码,多个客户端可以连接到服务器,但现在的问题是客户端无法相互通信......

这主要是因为您的客户端想要s_name=s.recv(1024),而CaSper的服务器不发送其名称。这是您的客户端的变体(期望主机和端口作为命令参数),它与CaSper的服务器一起使用,并且通过使用单独的线程解决了您最初的问题(客户端一次只能发送一条消息):

import socket
import sys

s = socket.socket()
s.connect((sys.argv[1], int(sys.argv[2])))
name = input(str("Please enter your username : "))
print(" Connected to chat server")
s.send(name.encode())

def receive_and_print():
    for message in iter(lambda: s.recv(1024).decode(), ''):
        print(":", message)
        print("")
import threading
background_thread = threading.Thread(target=receive_and_print)
background_thread.daemon = True
background_thread.start()

while 1:
    s.send(input("Please enter your message: ").encode())
    print("Sent")
    print("")

请注意,CaSper的服务器有一系列缺陷:

  1. 即使现在您的客户端可以随时发送消息,服务器也会逐个等待来自客户端的消息,即。e.当它等待客户端A时,客户端B可以发送消息,但服务器只有在客户端A发送了一些东西后才会接收和广播它。
  2. 它不处理客户端断开连接。
  3. 当所有客户端断开连接时,它会进入忙碌循环。

有关更好的服务器示例,请参阅问题使用 select 处理多个请求。

…你能不能改变我的服务器,让它工作…

这是与此客户端一起使用的服务器的变体,也使用单独的线程进行输入和接收:

import socket
import sys

s = socket.socket()
host = socket.gethostname()
print(" server will start on host : ", host)
port = 8080
s.bind((host,port))
name = input(str("Please enter your username: "))
print("")
print("Server is waiting for incoming connections")
print("")
s.listen(1)
conn, addr = s.accept()
print("Recieved connection")
print("")
s_name = conn.recv(1024)
s_name = s_name.decode()
print(s_name, "has joined the chat room")

def input_and_send():
    while 1:
        message = name+" : "+input(str("Please enter your message: "))
        conn.send(message.encode())
        print("Sent")
        print("")
import threading
background_thread = threading.Thread(target=input_and_send)
background_thread.daemon = True
background_thread.start()

for message in iter(lambda: conn.recv(1024).decode(), ''):
    print(s_name, ":", message)
    print("")
 类似资料:
  • 我正在尝试创建一个仅在共享内存中具有文件的小文件服务器。客户端应该向服务器发送命令,如 CREATE、DELETE 等。但是,我还没有到那个阶段。 我已经准备了一个服务器和一个客户端。服务器接受套接字,并为每个客户端连接创建一个新线程(要求)。 当我启动客户端时,我可以成功连接到服务器并发送将被接收的消息。但是,这只能工作一次。发送我的命令后,服务器将不会收到任何其他命令。 我尝试使用换行符捕获消

  • 我在询问之前搜索了这个问题,但我找不到类似的东西。我开发了一个客户端/服务器解决方案来发送/接收HL7消息。我使用套接字将客户端连接到服务器,从这个连接中,我只能使用OutputSteam对象发送1条HL7消息。我如何在同一个套接字连接中发送多个HL7?我尝试了不同的方法,但它们不能正常工作。 以下是我的客户端代码: 从服务器端 如何在同一套接字连接中发送更多HL7消息?

  • 我最近开始学习php套接字。我想在服务器和客户端之间创建一个永久传输控制协议!但是我的PHP套接字客户端只发送和接收一条消息。我想无限期地发送和接收消息,通过一个连接。 服务器php: 客户php:

  • 我有套接字服务器(java桌面应用程序)正在等待从java webapp(套接字客户端)连接。通信看起来还可以,我在客户端看到来自服务器的消息,但是当我发送消息时,我在服务器端没有收到任何消息。会有什么问题呢?当我检查服务器与telnet,一切正常。下面是我的代码: 服务器: 客户: 谢谢帮忙!

  • 通常在服务器发送一些数据时发生Message事件。服务器发送到客户端的消息可以包括纯文本消息,二进制数据或图像。无论何时发送数据,都会触发函数。 此事件充当客户端对服务器的耳朵。每当服务器发送数据时,都会触发事件。 以下代码段描述了打开Web Socket协议的连接。 还需要考虑使用Web套接字可以传输哪些类型的数据。Web套接字协议支持文本和二进制数据。就Javascript而言,文本指的是字符

  • 我有1个活动和1个普通类,其中活动1接收消息,普通类发送消息。如何实施: 在活动一中。班 在Ordinary.class 如何发送空消息(1)的代码?