套接字编程:客户端向服务器发送3条消息后停止响应

时间:2020-02-28 07:20:44

标签: python sockets python-3.6

我对套接字编程还很陌生,我想知道为什么客户端在向服务器发送3条消息后会停止响应。基本上,我发送了两次消息,服务器响应了客户端。第三次,客户端无限运行,服务器什么也没收到。

它与过载有关吗?如何运作,尤其是使用socket.listen()

以下是参考代码:

client.py

# Import socket module 
import socket                

# Create a socket object 
s = socket.socket()          

# Define the port on which you want to connect 
port = 12345                

# connect to the server on local computer 
s.connect(('127.0.0.1', port)) 

while True:

    msg = input("Enter your message: ")

    if msg != "quit":
        s.send((msg).encode())

    else:
        # close the connection 
        s.close()      

    # receive data from the server 
    new_msg = (s.recv(1024).decode())
    print ("[CLIENT]: ", new_msg) 

server.py

# first of all import the socket library 
import socket                

# next create a socket object 
s = socket.socket()          
print ("Socket successfully created")

# reserve a port on your computer in our 
# case it is 12345 but it can be anything 
port = 12345                

# Next bind to the port 
# we have not typed any ip in the ip field 
# instead we have inputted an empty string 
# this makes the server listen to requests  
# coming from other computers on the network 
s.bind(('', port))         
print ("socket binded to %s" %(port)) 


# a forever loop until we interrupt it or  
# an error occurs 
while True: 

    # put the socket into listening mode 
    s.listen(20)      
    print ("socket is listening")

    # Establish connection with client. 
    c, addr = s.accept()      
    print('Got connection from', addr) 

    msg = c.recv(1024).decode()

    if msg == "quit":
        # Close the connection with the client 
        c.close() 
    else:
        print ("[SERVER]: Recieved data: ", msg)

    print ("[SERVER]: sending", msg)

    c.send((msg).encode())

1 个答案:

答案 0 :(得分:0)

您仍然需要更好地了解侦听套接字的工作方式:

  • 它只听一次
  • 每个连接仅接受一次
  • 它可以读取和发送所需数量的数据包,直到双方关闭连接为止
  • 此时,
  • (对于单线程服务器)可以接受新连接

您的server.py应该成为:

...
s.bind(('', port))         
print ("socket binded to %s" %(port)) 

# put the socket into listening mode 
s.listen(20)      
print ("socket is listening")

# a forever loop until we interrupt it or  
# an error occurs 
while True: 

    # Establish connection with client. 
    c, addr = s.accept()      
    print('Got connection from', addr) 

    while True:
        msg = c.recv(1024).decode()

        if len(msg) == 0:          # the client does not send anything but just closes its side


            # Close the connection with the client 
            c.close()
            print('Client disconnected')
            break
        else:
            print ("[SERVER]: Recieved data: ", msg)

        print ("[SERVER]: sending", msg)

        c.send((msg).encode())

针对客户端的小补丁:

    ...
    if msg != "quit":
        s.send((msg).encode())

    else:
        # close the connection 
        s.close()
        break           # break out of the loop after closing connection

但这还不是全部:TCP是一种流协议。您应该准备好从一侧发送的数据包在到达另一侧之前被拆分或重新组装。唯一的保证是字节的发送顺序与发送顺序相同,但不一定在相同的数据包中。