2016-04-23 108 views
0

我正在工作和一个简单的套接字程序,并需要测试客户端发送到服务器的值。我在一个地步,我可以打印服务器上的客户端输入,但任何数据发送,则返回true,当我用“startswith”测试在python3 startswith似乎总是返回True

代码:

''' 
    Simple socket server using threads 
''' 

import socket 
import sys 
from _thread import * 

HOST = '' 
PORT = 127 # Arbitrary non-privileged port 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
print("Socket created") 

#Bind socket to local host and port 
try: 
    s.bind((HOST, PORT)) 
except socket.error as msg: 
    print("Bind failed. Error Code : " + str(msg[0]) + " Message " + msg[1]) 
    sys.exit() 

print("Socket bind complete") 

#Start listening on socket 
s.listen(10) 
print("Socket now listening") 

#Function for handling connections. This will be used to create threads 
def clientthread(conn): 

    #Sending message to connected client 
    #conn.send("Welcome to the server. Type something and hit enter") #send only takes string 

    #infinite loop so that function do not terminate and thread do not end. 
    commandz = "" 
    while True: 


     #Receiving from client 
     data = conn.recv(1024) 
     commandz += data.decode() 
     #reply = "OK..." + commandz 
     print(commandz) 
     if commandz.startswith('F'):  
      print("Forwardmove") 
     else: 
      print("Not forward") 
     if not data: 
      break 

     #conn.sendall("heard you") 

    #came out of loop 
    conn.close() 

#now keep talking with the client 
while 1: 
    #wait to accept a connection - blocking call 
    conn, addr = s.accept() 
    print("Connected with " + addr[0] + ":" + str(addr[1])) 

    #start new thread takes 1st argument as a function name to be run, second is the tuple of arguments to the function. 
    start_new_thread(clientthread ,(conn,)) 

s.close() 
+0

不要使用'进口*'第一个数据并打印。另外,你确定你想要低层'_thread'而不是其中一个高层模块吗? – ThiefMaster

+0

'127'不是非特权端口。你需要一个大于1024的。 – ThiefMaster

+0

你能详细说明导入*有什么问题吗?对此语言不熟悉,欢迎所有反馈。 – WillMc

回答

3

每次接收数据的时间,你可以用下面的命令将它追加到变量commandz中:

commandz += data.decode() 

看起来你从来没有重新初始化commmandz。所以,它总是从您第一次收到的第一批数据开始。

我假设print(commandz)行代码中的输出,你是这样的:

FirstData 
FirstDataSecondData 
FirstDataSecondDataThirdDataAndEtcEtc 

您可能会注意到,所有这些字符串以“F”开头。

+0

这样做了。我是python的新手,所以我错过了+ =正在拼接。感谢您的快速回复。 – WillMc

0

您需要重新初始化commandz否则你总是会得到一个输出以F起它只是新数据追加到