сокет - объект 'str' не может быть интерпретирован как целое число - PullRequest
0 голосов
/ 03 февраля 2019

Добрый день, я начинаю с инструмента сокетов в Python и создаю базовый сервер.Однако выдает ошибку: 'str' object can not be interpreted as an integer

Теперь измените код несколько раз, но ошибка продолжает появляться.последнее изменение было client.sendto (msg.encode ('utf-8'))

Это мой код:

сервер:

import socket

ip = "0.0.0.0"
puerto = 8081
dataConection = (ip,puerto)
conexionesMaximas = 10

socketServidor = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socketServidor.bind(dataConection)
socketServidor.listen(conexionesMaximas)

print("Esperando conexiones en: ",ip,puerto)
cliente,direccion = socketServidor.accept()
print("Conexion establecida con: ",direccion[0],direccion[1])

while True:
    datos = cliente.recv(1024)
    print(datos)
    modificado,severAdress = cliente.recvfrom(datos.decode('utf-8'))
    if modificado == "exit":
        cliente.send("exit")
    print("Recibido",data)
    cliente.sendall("---Recibido---")
print("Conexion cerrada")
socketServidor.close()

клиент:

import socket

ipServidor = "192.168.6.1"
puertoServidor = 8081

cliente = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
cliente.connect((ipServidor,puertoServidor))
print("conectado con: ",ipServidor,puertoServidor)

while True:
    msg = input(">: ")
    cliente.sendto(msg.encode("utf-8"),(ipServidor,puertoServidor))
    respuesta = cliente.recv(4096)
    print(respuesta)
    if respuesta == "exit":
        break;

print("----conexion cerrada----")
cliente.close()

этоошибка линии:

Esperando conexiones en:  0.0.0.0 8081
Conexion establecida con:  192.168.8.3 49774
b'k'
Traceback (most recent call last):
  File "C:\Users\Angel\Desktop\server.py", line 19, in <module>
    modificado,severAdress = cliente.recvfrom(datos.decode('utf-8'))
TypeError: 'str' object cannot be interpreted as an integer

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Произошло несколько ошибок, но в основном нет необходимости использовать sendto и recvfrom на подключенном сокете.Ниже приведен код для запуска клиента и сервера на одном компьютере:

server.py

import socket

ip = ""
puerto = 8081
dataConection = (ip,puerto)
conexionesMaximas = 10

socketServidor = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socketServidor.bind(dataConection)
socketServidor.listen(conexionesMaximas)

print("Esperando conexiones en: ",ip,puerto)
cliente,direccion = socketServidor.accept()
print("Conexion establecida con: ",direccion[0],direccion[1])

while True:
    datos = cliente.recv(1024).decode()
    print(datos)
    if datos == "exit":
        cliente.sendall("exit".encode())
        break
    print("Recibido",datos)
    cliente.sendall("---Recibido---".encode())
print("Conexion cerrada")
socketServidor.close()

client.py

import socket

ipServidor = "localhost"
puertoServidor = 8081

cliente = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
cliente.connect((ipServidor,puertoServidor))
print("conectado con: ",ipServidor,puertoServidor)

while True:
    msg = input(">: ")
    cliente.sendall(msg.encode())
    respuesta = cliente.recv(4096).decode()
    print(respuesta)
    if respuesta == "exit":
        break

print("----conexion cerrada----")
cliente.close()

Обратите внимание, что recv(1024) на сокете TCP является потоком байтов без границ сообщения, поэтому нет гарантии, что вы получите все байты сообщения без реализации дополнительного протокола.Например, отправка длины сообщения перед сообщением или для строк-ориентированных сообщений, подобных этой, чтение до получения символа новой строки.для коротких строк, подобных этой, вы можете никогда не увидеть проблему или увидеть ее, только если сеть очень загружена или ненадежна.

0 голосов
/ 03 февраля 2019

Вы звоните recvfrom с аргументом неправильного типа.Метод socket.recvfrom принимает размер буфера в качестве первого аргумента, который определяет максимальное количество байтов для получения.Вы даете ему строку, декодированные байты в datos.

Если вы уверены, что datos содержит целое число в строковой форме, вы можете преобразовать его в целое число, просто вызвав: cliente.recvfrom(int(datos.decode('utf-8'))),

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...