Программирование сокетов: клиент перестает отвечать после отправки 3 сообщений на сервер - PullRequest
0 голосов
/ 28 февраля 2020

Я довольно новичок в программировании сокетов, и мне было интересно, почему клиент перестает отвечать после того, как я отправил 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 голосов
/ 28 февраля 2020

Вам все еще нужно лучше понять, как работает сокет прослушивания:

  • он слушает только один раз
  • он принимает только один раз на соединение
  • он может читать и отправлять столько пакетов, сколько потребуется, пока одна из сторон не закроет соединение
  • в этой точке (и для однопоточного сервера) он готов принять новое соединение

Ваш 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 является потоковый протокол. Вы должны быть готовы к тому, что пакеты, отправленные с одной стороны, будут разделены или повторно собраны до того, как они достигнут другой стороны. Единственная гарантия состоит в том, что байты поступают в том же порядке, в котором они были отправлены, но не обязательно в тех же пакетах.

...