2016-10-02 49 views
0

我一直在有一个程序,无论何时有人按下输入键,不输入内容,程序将停止输入。下面Python 3套接字应用程序停止发送数据

#Client 
import socket 
from time import sleep 
import time 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

host = 'localhost' 
port = 9990 

s.connect((host, port)) 

print('connecting') 

global ab 

try: 
    ab = input('enter input') 
except Exception as eb: 
    ab = 'hello' 
s.sendall(ab.encode()) 

while True: 
    global hi 
    try: 
     hi = input('enter input') 
    except Exception as b: 
     hi = input('enter input') 

    try: 
     dataNew = s.recv(4024) 
     s.sendall(hi.encode()) 

    except Exception as be: 
     print('try again') 

    if dataNew: 
     print(dataNew) 

    if not dataNew: 
     print('error') 
     break 

服务器:

#Server 
import socket 

host = 'localhost' 
port = 9990 

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
except Exception as e: 
    print("Error creating socket") 

try: 
    s.bind((host, port)) 
    print('Binding socket') 
    s.listen(10) 
    print('listening') 
except Exception as e: 
    print('Error creating server') 

def mainInput(): 
    while True: 
     try: 

      dataNew = c.recv(4024) 
      c.sendall(dataNew) 
      if not dataNew: 

       print('waiting or disconnected') 
       break 

      if dataNew: 
       print(dataNew, a) 

     except Exception as b: 
      print('error') 

def mainLoop(): 
    while True: 
     global c 
     global a 
     c, a = s.accept() 
     print('Connected by', a) 
     mainInput() 

mainLoop() 

的问题是,进入一个空白的消息打破了计划。

回答

0

这里的主要问题是,你打电话input()假设你会得到回报。但如果用户只是按下回车键,该函数将返回一个空字符串(input去掉换行符)。一个空字符串中有零个字符。如果您向套接字写入零字符,则不会发送任何内容(TCP是面向流的协议,并且不遵守“消息”边界,因此零字节的send本质上是无操作的[尽管 - 如果连接已知处于关闭或关闭状态 - 仍然可以生成异常])。所以客户端什么都不发送,然后尝试从服务器读取回显的响应。但服务器从来没有收到任何东西,所以服务器仍然在等待recv,并永远不会到达它自己的sendall。所以现在客户也在等待(永远)在recv

在代码中的其他问题:

如果您在服务器设置中检测到错误,你应该退出,而不是仅仅打印消息,并继续进行,因为后续的操作依赖于先前操作的结果。同样,如果您在服务器中遇到异常,您应该从循环中断开而不是继续,因为如果您继续尝试在断开连接的状态下尝试操作套接字,通常只会在异常之后发生异常。

如果recv返回一个空字符串,就意味着对方已经关闭(或shutdown)的连接,所以你应该立即退出循环,而不是试图在字符串sendall,因为(即使字符串是空的如上所述),这可能会产生一个例外。

相关问题