0

我一直有一个程序,只要有人点击输入,而不输入任何内容,程序就会停止输入。

#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()

问题是输入空白消息会破坏程序。

4

1 回答 1

0

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

代码中的其他问题:

如果您在服务器设置中检测到错误,您应该退出而不是仅仅打印一条消息并继续,因为后续操作取决于前面操作的结果。

同样,如果您确实在服务器中遇到异常,您应该从循环中中断而不是继续,因为如果您继续尝试在断开连接状态下对套接字进行操作,通常只会在异常之后得到异常。

如果recv返回一个空字符串,这意味着对方已经关闭(或shutdown)连接,所以您应该立即退出循环,而不是尝试sendall在字符串上执行 a,因为(即使字符串为空,如上所述)这可能产生异常。

于 2016-10-03T16:18:56.407 回答