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

Python简单套接字聊天用户连接和消息输出

傅元章
2023-03-14

我正在使用socket在Python3中创建一个简单的聊天

这是密码

客户

#!/bin/python

import socket
import threading
import time

tLock = threading.Lock()
poweroff = False

def receving(name, sock):
    while not poweroff:
        try:
            tLock.acquire()
            while True:
                data, addr = sock.recvfrom(1024)
                print (str(data))
        except:
            pass
        finally:
            tLock.release()

host = '127.0.0.1'
port = 0

server = ('127.0.0.1', 5000)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host, port))
s.setblocking(0)
rT = threading.Thread(target=receving, args=("RecvThread", s))
rT.start()

alias = input("Username: ")
time.sleep(0.2)

message = input(alias + ">>> ")
while message != 'q':
    if message != "":
        s.sendto(str(alias + ": " + message).encode('utf-8'), server)
    tLock.acquire()
    message = input(alias + ">>> ")
    tLock.release()
    time.sleep(0.2)

poweroff = True
rT.join()
s.close()

服务器

#!/bin/python

import socket
import time

hostname = '127.0.0.1'
port = 5000

clients = []

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((hostname, port))
s.setblocking(0)

iQuit = False
print ("Server Started.")

while not iQuit:
    try:
        data, addr = s.recvfrom(1024)
        if addr not in clients:
            clients.append(addr)

        print (time.ctime(time.time()) + str(addr) + ": :" + str(data))
        for client in clients:
            s.sendto(data, client)
    except:
        pass
s.close()

当用户连接时,如何向服务器打印字符串?

在您插入名称后,我尝试添加此字符串

s.sendto(str(alias + " Connected").encode('utf-8'), server)

但对我来说,输出是不可靠的

另一个问题:为什么我在发送消息时会得到这样的东西?

Username: User_A
User_A>>> Hello
User_A>>> How Are you?
b'User:A: Hello'
User_A>>> 
b'User_A: How Are you?'
b'User_B: Hi'

共有2个答案

华章横
2023-03-14

我必须按回车键看看user_B给我发东西。

您通过在消息的输入期间锁定接收线程来强制执行此行为。你必须下定决心,是想在打字时打印这个还是想打印输入的数据
您可能希望为基于网络的消息程序同时输入和输出。

慕凌龙
2023-03-14

关于第二个问题:您正在打印二进制字符串,请参阅此处以了解更多信息。

在服务器或客户端上打印消息时,使用str(data.decode('utf-8'))代替str(data)

关于第一个问题:如果您在询问用户名后发送“连接”字符串,这应该是可行的。如果您包含decode('utf-8'),字符串的解码方式与普通消息相同,并且在我看来很正常。

 类似资料:
  • 我一直在努力通过Smack和Openfire服务器与XMPP聊天。我的问题如下: 每当一个用户向另一个用户发送消息时,该消息就会在另一个用户处正确接收。但是任何回复都不会出现在第一条消息的发件人处。因此,用户1成功地发送给用户2。然后,用户2无法向用户1发送任何回复。另一方面,如果我重新启动并让用户再次登录,则用户2可以发送给用户1,但反之亦然。 我想说的是,只有聊天的发起者才能发送消息,接收者不

  • 我尝试用Java套接字API制作基本的Java聊天应用程序。但是当客户端终止时,它会引发以下异常, socketException:套接字关闭 我认为即使套接字已经关闭,BufferedReader流仍然尝试读取行消息。 但我不知道当客户端终止时,何时以及如何关闭BufferedReader流和套接字连接。 我完全被这部分卡住了。有什么想法吗?

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

  • 当我尝试执行此操作时,我在Python中得到以下错误: 我做错了什么?

  • 为此他必须加入由用户A1创建的相同twilio通道,然后才能加载消息。 这就是我被困住的地方。 用户A2如何发现用户A1或任何其他用户是否给他发送了一些消息,并且他还需要知道他需要加入哪个通道来加载发送的消息。 https://github.com/philnash/twilio-chat-kendo-react 更新: 使用这个- 这就是我面临的问题。

  • 服务器和客户端使用我自己的协议进行通信,看起来像XMPP。我应该实现聊天应用。因此,当一个用户编写String时,它应该立即通过服务器发送给其他客户端。我在服务器上有sendToAll方法。但用户只有在按下回车键时才能看到其他用户的消息。用户如何在不按回车键的情况下接收消息? 这是我的客户: 以及带有ServerThread的服务器。 服务器线程。