2016-09-18 14 views
0

私はちょうどPythonを学び始めました。良い解決法を実装することはできません。TCP/IPサーバでのメッセージ送信、ctrl + c int処理、Python3

Ctrl + C割り込みを押すまでサーバにメッセージ(テキスト入力、入力、テキスト入力など)を送信できるクライアント/サーバを作成したいと考えています。このintはサーバとクライアント。

私の非常に基本的な、そしておそらく、Pythonのクライアント/サーバーの例がよくありますが、このペアはシングルショット用であり、プログラムは終了しています。

client.py

import socket 

TCP_IP = '127.0.0.1' 
TCP_PORT = 5005 
BUFFERSIZE = 1024 

sock = socket.socket() 
sock.connect((TCP_IP, TCP_PORT)) 

msg = input('Enter your text: ') 
sock.send(msg.encode()) 
data = sock.recv(BUFFERSIZE).decode() 
sock.close() 

print('Recieved data: ',data) 

server.py

import socket 
import sys 

TCP_IP = '127.0.0.1' 
TCP_PORT = 5005 
BUFFER_SIZE = 1024 

sock = socket.socket() 
sock.bind((TCP_IP, TCP_PORT)) 
sock.listen(1) 

conn, addr = sock.accept() 
print('Connection address:\nIP:',addr[0]) 
print('Port:',addr[1]) 
while 1: 
    data = conn.recv(BUFFER_SIZE) 
    if not data: break 
    msg = data.decode() 
    print('Recieved data: ', msg) 
    conn.send(data) 
conn.close() 

任意の提案ですか?

+0

あなたの質問は何ですか? –

+0

Control-Cはスクリプトを終了し、自動的にソケットを閉じます。 – Barmar

+0

@ Jean-FrançoisFabre質問は、チャットのようなサーバー上でのメッセージのスタックを送信する方法と、割り込みによってメッセージを処理した後で(トレースバックなどなしに)クライアント側がクローズした後もサーバを稼働させることができますが、今は必要ありません)。私のコードは** **メッセージを1つだけ送ることができ、結局は閉じます。 – genesi5

答えて

2

そうのような底部にtry...finallyを追加します。

try: 
    while 1: 
     data = conn.recv(BUFFER_SIZE) 
     if not data: break 
     msg = data.decode() 
     print('Recieved data: ', msg) 
     conn.send(data) 
finally: 
    conn.close() 

はCtrl + CはKeyboardInterrupt例外が発生します。そうなると、finallyが呼び出され、ソケットを安全に閉じます。

同じはそれをクライアント側を閉鎖するために、クライアントに行うことができます。

try: 
    msg = input('Enter your text: ') 
    sock.send(msg.encode()) 
    data = sock.recv(BUFFERSIZE).decode() 
finally: 
    sock.close() 
+0

さて、中断処理が行われましたが、それは本当に必要なものではありません。私はサーバー上でメッセージを送信する必要があります:テキスト、押された入力、テキスト、押された入力。そして、メッセージを打ち切り、ソケットを閉じてcmdに戻るために中断が必要です – genesi5

関連する問題