【问题标题】:Python simple socket chat User connection and output of messagePython简单套接字聊天用户连接和消息输出
【发布时间】:2015-12-13 14:25:26
【问题描述】:

我正在使用套接字在 python 3 中创建一个简单的聊天

这里是代码

客户

#!/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'

【问题讨论】:

    标签: python sockets


    【解决方案1】:

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

    在服务器或客户端打印消息时使用str(data.decode('utf-8')) 而不是str(data)

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

    【讨论】:

    • 在服务器上正常是正常的,但是当新用户连接时,他会得到类似Username: b'127.0.0.1 Connected' 的信息。这里的问题有两个,1] 我必须按 Enter 键才能查看 user_B 是否向我发送了一些东西。 2]当新用户连接时,他会获得所有以前的数据。如何过滤数据以将其发送给正确的用户?我想使用 addr[2] 这是用户的唯一编号
    【解决方案2】:

    我必须按回车键才能查看 user_B 是否向我发送了一些东西。

    您通过在消息的input 期间锁定接收线程来强制执行此行为。您必须决定是否要在键入时打印输入数据。
    你可能想cf。 Simultaneous input and output for network based messaging program.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 2018-03-22
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 2016-11-10
      相关资源
      最近更新 更多