2016-09-22 46 views
0

所以,當我打開了CMD,並創建一個telnet連接:Python的3插槽 - 接收更多的則1個字符

遠程登錄本地主機5555

它將apear「歡迎」,因爲你可以看到下面的屏幕。 之後,我輸入CMD的每個字符都會立即打印出來/發送。 我的問題是:是的,如果是的話,怎麼可能輸入消息,然後發送它們,所以我收到他們作爲一個句子,而不是字符char。 enter image description here

import socket 
import sys 
from _thread import * 

host = "" 
port = 5555 
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 

try: 
    s.bind((host,port)) 
except socket.error as e: 
    print(str(e)) 

s.listen(5) #Enable a server to accept connections. 
print("Waiting for a connection...") 

def threaded_client(conn): 
    conn.send(str.encode("Welcome\n")) 

    while True: 
    # for m in range (0,20): #Disconnects after x chars 
     data = conn.recv(2048) #Receive data from the socket. 
     reply = "Server output: "+ data.decode("utf-8") 
     print(data) 
     if not data: 
      break 
     conn.sendall(str.encode(reply)) 
    conn.close() 

while True: 
    conn, addr = s.accept() 
    print("connected to: "+addr[0]+":"+str(addr[1])) 
    start_new_thread(threaded_client,(conn,)) 
+0

設置Telnet應該讓事情變得更容易。 – Flint

回答

1

你需要保持讀數,直到流結束:

string = "" 

while True: 
# for m in range (0,20): #Disconnects after x chars 
    data = conn.recv(1) #Receive data from the socket. 

    if not data: 
     reply = "Server output: "+ string 
     conn.sendall(str.encode(reply)) 
     break 
    else: 
     string += data.decode("utf-8") 

conn.close() 

順便說一句,使用該方法,你會一次讀取一個字符。您可以根據您的服務器發送數據的方式進行調整。

+0

謝謝,它工作正常,但是當我錯誤輸入時,如何從「字符串」中刪除某些內容,因爲Python會將它作爲我嘗試發送給他的新字符? – freedome97

+0

我想你想在客戶端按退格鍵時從字符串中刪除一個字符。是對的嗎?一個python套接字服務器可以處理擊鍵,所以我不認爲這是可能的。 –

+0

是的,退格。是不是可以查看最後輸入的字符是否是退格,然後將其從「字符串」中刪除? 不存在任何刪除變量最後一個字符的函數嗎? – freedome97

0

你可以嘗試類似:(僞代碼)

temp = conn.recv(2048) 
data.concatenate(temp) # maybe data = data + temp ???? little rusty 
if data[-1] == '\n': 
    print 'message: ' + data 
etc... 
+0

我的壞事沒有看到以前的答案。這個比較好。 – nephi12

0

這取決於如果你想在字符模式或線模式下運行。 目前你的代碼很好,但你的windows telnet客戶端在字符模式下運行。您可以使用putty在線模式下嘗試,或者如果您確實需要在char模式下運行,則請繼續讀取緩衝區,直到發送換行符。

這裏是服務器的說,當我運行代碼:

Waiting for a connection... 
connected to: 127.0.0.1:46738 
b'Hello\r\n' 

的telnet會話beeing:在`^]模式line`

telnet 127.0.0.1 5555 
Trying 127.0.0.1... 
Connected to 127.0.0.1. 
Escape character is '^]'. 
Welcome 
Hello 
Server output: Hello 
+0

所以它實際上是一個Windows Telnet客戶端的問題,或者你是什麼意思? – freedome97

+0

這不是一個真正的問題,而是它配置的方式。在telnet會話中嘗試'ctrl altgr]''mode?'。它應該輸出'^]模式?,並給出一些解釋。 – Flint

相關問題