Ошибка Socket recv () в python3.7

#python #sockets #send #recv

#python #сокеты #Отправить #recv

Вопрос:

Клиент:

 #The program should send two strings and the server should return the interclassed string back

import socket
import time
import sys


HEADERSIZE=10
firstString = input("First string: ")
secondString = input("Second string: ")
host = "127.0.0.1"
port = 8888
firstString = f'{len(firstString):<{HEADERSIZE}}' firstString
secondString = f'{len(secondString):<{HEADERSIZE}}' secondString

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
s.send(bytes(firstString, 'utf-8'))
s.send(bytes(secondString, 'utf-8'))
fullMsg=''
while 1:
    msg = s.recv(8)
    if len(msg)<=0:
        break
    fullMsg  = msg.decode('utf-8')
print(fullMsg)
s.close()
  

Сервер:

 #trebuie trimisa si dimensiunea
import socket


def interclass(firstString , secondString):
    i =0 
    j =0
    interString=''
    while i < len(firstString) and j < len(secondString):
        if firstString[i] < secondString[j]:
            interString =firstString[i]
            i=i 1
        else: 
            interString =secondString[j]
            j=j 1
    while i < len(firstString):
        interString  = firstString[i]
        i=i 1
    while j < len(secondString):
        interString =secondString[j]
        j=j 1
    return interString

host = "127.0.0.1"
port = 8888;
HEADERSIZE=10

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
while True:
    conn, addr = s.accept()
    messages=[]
    newMsg = True
    fullMsg = ''
    msgLength = -1
    while True:
        msg = conn.recv(16)
        if len(msg)<=0:
            break
        msg = msg.decode('utf-8')
        fullMsg  = msg
        if len(fullMsg)>=HEADERSIZE and newMsg == True:
            newMsg = False
            msgLength = int(fullMsg[:HEADERSIZE-1])
            fullMsg = fullMsg[HEADERSIZE:HEADERSIZE 1 msgLength]
        if not newMsg and len(fullMsg)>=msgLength:
            messages.append(fullMsg[:msgLength])
            fullMsg = fullMsg[msgLength:]
            newMsg = True
    interString = interclass(messages[0], messages[1])
    conn.sendall(bytes(interString,'utf-8'))
conn.close()
  

Приложение работает до тех пор, пока я не попробую ту часть, где я пытаюсь отправить данные с сервера. Все это блокируется командой recv() в клиенте. Я обыскал весь Интернет в поисках решения и попытался сделать его неблокируемым сокетом и разобраться с исключением… Все еще не работает. Я был бы признателен за некоторую помощь. Спасибо!!

Комментарии:

1. Ваш сервер блокируется при conn.recv(16) ожидании дополнительных входных данных. Я думаю, вы можете заставить этот пример работать, явно отключив сторону записи сокета в клиенте после отправки последнего сообщения s.shutdown(socket. SHUT_WR) , но даже для немного более сложного примера вам нужно будет реализовать свой собственный протокол поверх TCP. И нет, здесь нет ошибки recv() .

2. Сервер не блокируется. Клиент выполняет. Как я уже сказал, все работает, пока я не попытаюсь отправить что-либо с сервера. Находится в клиентском msg.recv(), где он застрял. И, да, я, возможно, выразился неправильно. В любом случае, спасибо !! =)

3. Клиент блокирует получение, поскольку сервер не отправил никаких данных. Сервер не отправил никаких данных, потому что он блокирует там, где я сказал, что это было.

4. И почему сервер не блокирует conn.recv(), пока я не помещу recv() в клиент? Это то, что мне нужно выяснить.

5. Почему вы считаете, что сервер когда-либо выйдет из цикла while? Какое условие приведет conn.recv(16) к возврату нулевой длины msg ?