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

时间:2015-12-13 14:25:26

标签: python sockets

我正在使用socket

在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()

SERVER

#!/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 个答案:

答案 0 :(得分:1)

关于您的第二个问题:您正在打印二进制字符串,有关详细信息,请参阅here

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

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

答案 1 :(得分:0)

  

我必须按Enter键以查看user_B是否向我发送了一些内容。

您通过在邮件的input期间锁定接收线程来强制执行此行为。无论您是想要这个还是想要在打字时打印输入数据,您都必须下定决心 你可能想参考。 Simultaneous input and output for network based messaging program