您可以在recv上调用函数吗?

时间:2020-03-31 23:13:25

标签: python sockets tkinter

我正在尝试使用tkinter作为GUI来创建消息传递应用程序。我想在接收一条消息时调用一个函数,该函数实际上会显示一条消息,但是使用while循环有时会崩溃或破坏我的GUI上的更新。

连接到服务器后,我尝试调用子程序...

const dueDateOrdering = item => item.status === 'OPEN' && item.dueDate ? 0 : 1;
const byOpenDueDate = (a, b) => dueDateOrdering(a) - dueDateOrdering(b);

const statusOrdering = {
  OPEN: 0,
  COMPLETED: 1,
  CANCELLED: 2
};
const byStatus = (a, b) => statusOrdering[a.status] - statusOrdering[b.status];

const byCreateDate = (a, b) => a.createdDate.localeCompare(b.createdDate);

this.items = this.items.sort((a, b) => 
  byOpenDueDate(a, b)
  || byStatus(a, b)
  || byCreateDate(a, b)
);

这没有用,我认为这是因为while循环(因为连接后我会崩溃)

现在,我只想在收到消息时尝试调用子程序。

这是我的server.py脚本

def get_msg(): # This will run code that will get messages
    while True:
        Crecv = clientsocket.recv(1024).decode() # Waits for a message
        print(Crecv) # Prints whatever the server has sent into console
        messages.insert(END, Crecv) # Insets the message into the message Listbox  

这是我稍后会更新的内容,这就是为什么有一些未使用的列表等的原因。

这个想法是...。客户端连接到服务器->客户端发送一条消息-> server.py将解码该消息,然后将其发送给所有连接的人-> OP客户端将重新接收该消息并进行它会显示出来,其他客户只会收到消息并显示出来。

这是我在项目结束时想要实现的目标,但是当我的客户端在连接后崩溃时,我什至无法连接到服务器。

我从名为client.py的项目的非GUI版本复制了所有套接字代码

from socket import *
import socket
import select

## -- Server (Rooms) -- ##
users = []
addresses = []

host_name = socket.gethostname()

HOST = socket.gethostbyname(host_name) 
PORT = 12345

print(f"Server Info\nHOST: {HOST}\nPORT: {PORT}")


serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind((HOST, PORT))
serversocket.listen(5)
clientsocket, address = serversocket.accept()

def user_join():
    # Append username to users[]
    # Append user address to adresses[]
    print(f"{address} connecting (nicked {username})")
    clientsocket.send(f"{username} joined the room!").encode()

print(address)
with clientsocket:
    while True:
        Srecv = clientsocket.recv(1024).decode()
        print(f"{address}: {Srecv}")
        # Add server time to message before sending
        clientsocket.sendall(Srecv.encode())

0 个答案:

没有答案