#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
?