我正在使用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'
答案 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