python线程在打印之前等待输入

时间:2016-08-29 12:11:11

标签: python multithreading sockets

我正在编写套接字通信程序,我有一个主线程,另一个线程试图sock.recv()

当它收到字节时,它按需要工作,它转到正确的函数,最后打印,然后线程再次监听字节(如所需)。

问题是程序不会打印,直到我按下回车...

如果重要的是我在主线程中同时获得输入,但这不重要。

注意 - 字节的发送方式如下:

int(4字节) - msg类型(要打印的字符串为2)

int(4字节) - 要打印的文本长度

string(bytes) - 实际文本

完整代码:

import socket
import time
import struct
import threading
import sys

PORT = 54321

def try_to_connect(ip):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM,
                                      socket.IPPROTO_TCP)
    sock.settimeout(1)
    try:
        sock.connect((ip, PORT))
        return sock
    except:
        return False

def text_parse(text, msg_id):
    byte_text = bytes(text, "utf-8")
    return struct.pack("II%ds" % len(byte_text), msg_id, len(byte_text), byte_text)


def main(sock):
    global file_name
    print("connected succefuly. to run a command, write $<command> (no space)\nto request a file, enter file path.\nto exit this program enter exit.") 
    inputed_text = ''
    while True:
        inputed_text = input()
        if inputed_text == '':
            pass
        elif inputed_text == "exit":
            return
        elif inputed_text[0] == "$":
            sock.send(text_parse(inputed_text[1:], 0))
        else:
            file_name = inputed_text
            sock.send(text_parse(inputed_text, 1))


def print_string(message, msg_len):
    text = struct.unpack("%ds" % msg_len, message)[0].decode("utf-8")
    sys.stdout.write(text)
    sys.stdout.flush()


def copy_file(message):
    global file_name
    final_file = open(file_name, "wb")
    final_file.write(message)
    final_file.close()    

def recieve_loop(sock):
    while True:
        try:
            header = sock.recv(8)
            if not header: break
            msg_type = struct.unpack("I", header[:4])[0]
            msg_len = struct.unpack("I", header[4:8])[0]
            print(msg_type)
            print(msg_len)
            message = sock.recv(msg_len)
            if msg_type == 2:
                print_string(message, msg_len)
            elif msg_type == 3:
                copy_file(message)
        except socket.timeout:
            pass


if __name__ == "__main__":
    print("welcome to remote desktop program.\nto connect to your computer, enter it's ip.\nto exit enter exit")
    text_input = "b,kjhkf"
    while True:
        text_input = input()
        if text_input == "exit":
            exit()
        else:
            sock = try_to_connect(text_input)
            if sock:
                socket_recieve_thread = threading.Thread(target = recieve_loop, args = [sock])
                socket_recieve_thread.start()
                main(sock)
                socket_recieve_thread.join()
            else:
                print("the computer is not online")

0 个答案:

没有答案