0

ファイルとプリンターの共有がオンになっている場合に、LAN 内で機能する小さなチャット プログラムを作成しました。これは、単純なプレーン テキスト ファイルに基づいています。2 つの異なるスクリプトがあります。1 つは送信部分を処理し、もう 1 つは受信部分を処理します。私はそれを 1 つのスクリプトとして配置しようとしましたが、他のユーザーが送信したメッセージを受信するには、メッセージを入力する必要があります。では、それを 1 つのスクリプトとしてどのように配置すればよいでしょうか。

送信スクリプト:

from sys import exit

LAN_NAME = "\\\\ONE-PC"
LAN_MSG_FILE = "%s\\Users\\Public\\me.txt" % LAN_NAME
TCHAT_VER = "1.1.0"

print "TChat - Version %s" % TCHAT_VER
print "Copyright(c) 2013 - Ahnaf Tahmid"
print "--------------------------------"

def send_data(src, msg):
    _file_ = open(src, 'w')
    _file_.truncate()
    _file_.write(msg)
    _file_.close()

msg = raw_input("[You]: ")
print "\n"

while True:
    send_data(LAN_MSG_FILE, msg)
    msg = raw_input("[You]: ")
    print "\n"
    if msg == "[exit]":
        send_data(LAN_MSG_FILE, "[exit]")

raw_input("Press ENTER to exit.")
exit(0)

受信スクリプト:

from sys import exit

CLN = "\\\\TWO-PC"
CLN_MSG_FILE = "%s\\Users\\Public\\me.txt" % CLN
VER = "1.0.0"

def fetch_data(src):
    _file_ = open(src, 'r')
    message = _file_.read()
    _file_.close()
    return message

msg = " "
msg_to_display = "x"

print "TChat Receiver v%s." % VER
print "Copyright(c) 2013 - Ahnaf Tahmid."
print "---------------------------------"
print "\n"

while True:
    msg = fetch_data(CLN_MSG_FILE)
    if msg_to_display == msg:
        pass
    else:
        msg_to_display = msg
        if msg_to_display == "[exit]":
            print "[%s] has disconnected.";
            raw_input("Press ENTER to exit")
            exit(0)
        print "[%s]: %s\n" % (CLN, msg_to_display)

注: これら 2 つのスクリプトは、両方の PC で実行する必要があります。1 つはメッセージを受信して​​表示し、もう 1 つはメッセージを送信します。

これが私の試みです:

from sys import exit

LAN_NAME = "\\\\ONE-PC"
LAN_MSG_FILE = "%s\\Users\\Public\\me.txt" % LAN_NAME
CLN = "\\\\TWO-PC"
CLN_MSG_FILE = "%s\\Users\\Public\\me.txt" % CLN
TCHAT_VER = "1.0.2"

def fetch_data(src):
    file_ = open(src, 'r')
    file_data = file_.read()
    file_.close()
    return file_data

def send_data(src, data):
    file_ = open(src, 'w')
    file_.truncate()
    file_.write(data)
    file_.close()

def clean_cache(src):
    file_ = open(src, 'w')
    file_.truncate()
    file_.close()

print "TChat - Version %s" % TCHAT_VER
print "Copyright(c) 2013 - Ahnaf Tahmid"
print "--------------------------------"
print "\n"
print "To exit anytime, type in [exit]"
print "\n"

msg = raw_input("[You]: ")
msg_lan = " "

while msg != "[exit]":
    send_data(LAN_MSG_FILE, msg)
    print "\n"
    print "Fetching data.."
    msg_lan = fetch_data(CLN_MSG_FILE)
    while len(msg_lan) <= 1:
        msg_lan = fetch_data(CLN_MSG_FILE)
    clean_cache(CLN_MSG_FILE)
    print "\n"
    print "[Friend]: %s" % msg_lan
    print "\n"
    msg = raw_input("[You]: ")

print "\n"
print "Thanks for using TChat."
raw_input("Press ENTER to exit")
exit(0)

どんな助けでも大歓迎です。

4

1 に答える 1

0

送信と受信を同時に実行する必要があるという基本的な問題は既に特定しました。マルチスレッドについて詳しく調べる必要があります。

基本的な設計パターンは次のとおりです。

キャンセル用のフラグを付けて受信側のスレッドを作成します。次の処理を無限にループします。受信データがあるかどうかを確認します。ある場合はそれを受け取り、出力します。タイムアウトをスリープします。キャンセルフラグが設定されている場合は中断します。

メイン スレッドで、レシーバーを作成して開始し、入力ループに入ります。ユーザーがメッセージを入力した場合は、同じスレッドで送信します。ユーザーが「exit」と入力した場合は、レシーバー スレッドにキャンセル フラグを設定し、それを待って終了します。

多かれ少なかれ:

class Receiver (Thread):
    def __init__ (self):
        super (Receiver, self).__init__ ()
        self.cancelled = False

    def run (self):
        while not self.cancelled:
            msg = nonBlockingReceive () # your non-blocking receive function
            if msg: print ('<< {}'.format (msg) )
            self.sleep (2)

receiver = Receiver ()
receiver.start ()
while True:
    msg = input ('>> ')
    if msg == 'exit':
        receiver.cancelled = True
        receiver.wait ()
        break
    sendData (msg) # your send function

(テストされていない疑似コードのみ)

于 2013-08-01T19:51:41.963 に答える