Как вы подключаете TCP-клиент к серверу и отправляете на сервер? Получение ошибок и невозможность успешного запуска кода.

Я изучаю TCP и пробовал программу клиент/сервер. Моя серверная часть работает, но на моей клиентской стороне я не могу успешно подключиться к серверной части.

Коды ошибок на моей стороне клиента

Первая ошибка:

Трассировка (последний последний вызов): файл «tcpclient.py», строка 13, в clientSocket.connect((serverName, serverPort)) TypeError: ожидаемая строка, байты или байтовый массив, а не список

Вторая ошибка:

Трассировка (последний последний вызов): файл «tcpclient.py», строка 34, в clientSocket.send(clientSentence.encode(), serverAddress) TypeError: требуется целое число (получен кортеж типа)

Код сервера: этот код работает успешно.

import sys
from socket import*

serverSocket = socket(AF_INET, SOCK_STREAM)
serversys = sys.argv

if len(serversys) == 1: 
    serverPort = 9999
else:
    serverPort = serversys[1]
    serverPort = int(serverPort)

serverSocket.bind(('', serverPort)) 
serverSocket.listen(1)
print ("The server is ready to receive.")

while True:
    connectionSocket, addr = serverSocket.accept()
    print ("Connection accepted from: ", addr)

    clientSentence = connectionSocket.recv(1024).decode()


    clientSentence, clientAddress = serverSockset.recv(1024)
    clientSentence.decode()
    connectionSocket.close()

    if clientSentence[0].decode() == 'U':
        serverSentence = clientSentence.upper()
        connectionSocket.send(serverSentence[1:].encode(), clientAddress)
        connectionSocket.close()
    elif clientSentence[0].decode() == 'L':
        serverSentence = clientSentence.lower()
        connectionSocket.send(serverSentence[1:].encode(), clientAddress)
        connectionSocket.close()
    elif clientSentence[0].decode() == 'I':
        serverSentence = clientSentence.title()          
        connectionSocket.send(serverSentence[1:].encode(), clientAddress)
        connectionSocket.close()

Клиент: здесь возникают две ошибки.

import sys
from socket import*

clientSocket = socket(AF_INET, SOCK_STREAM)

clientsys = sys.argv
serverName = clientsys[1:]
serverPort = clientsys[2:]

clientSocket.connect((serverName, serverPort)) #First Error

serverPort = [int(serverPort) for serverPort in serverPort]
serverAddress = (serverName, serverPort)

sentenceChoice = input("Enter U for UPPERCASE SENTENCE, L for lowercase sentence, \nor I for Initial Caps Sentence: ")
sentence = input("Enter sentence: ")

clientSentence = sentenceChoice+sentence

clientSocket.send(clientSentence.encode(), serverAddress) #Second Error
serverSentence = clientSocket.recv(1024)
print('From Server: ', serverSentence.decode())
clientSocket.close()

person anonymous_s    schedule 25.10.2018    source источник
comment
Распечатайте clientsys[1:] и посмотрите, что это на самом деле!   -  person Klaus D.    schedule 25.10.2018
comment
@Клаус Д. Выводит: []   -  person anonymous_s    schedule 25.10.2018
comment
Не похоже на имя сервера.   -  person Klaus D.    schedule 25.10.2018
comment
Нет, это не так. Я попробую установить имя сервера равным локальному хосту   -  person anonymous_s    schedule 25.10.2018


Ответы (3)


Ваша первая ошибка вызвана тем, что вы используете фрагмент списка для имени сервера и порта. Измените на это:

serverName = clientsys[1]
serverPort = clientsys[2]

Ваша вторая ошибка связана с тем, что socket.send() не принимает параметр кортежа serverAddress (где вы думаете о socket.sendto()? В любом случае, вы можете исправить это, просто удалив параметр:

clientSocket.send(clientSentence.encode())

Ссылка на socket.send документы: https://docs.python.org/3/library/socket.html#socket.socket.send

person Tyler Zeller    schedule 25.10.2018
comment
Для первой ошибки я изменил его, но все еще получаю сообщение об ошибке: IndexError: list index out of range - person anonymous_s; 25.10.2018
comment
Вы запускаете свою команду python с аргументами? Например, если ваш скрипт называется sock.py, вы должны запустить python sock.py <serverName> <serverPort> - person Tyler Zeller; 25.10.2018
comment
Итак, я исправил это, и при запуске клиента я ввожу pthyon3 tcpclient.py localhost 9999, и он работает, но затем я получаю сообщение об ошибке из окна терминала сервера об ошибке подключения: Файл tcpserver.py, строка 29, в ‹module› clientSentence , clientAddress = serverSocket.recv(1024) OSError: [Errno 57] Сокет не подключен - person anonymous_s; 26.10.2018
comment
@anonymous_s Я думаю, вам нужно удалить эту строку clientSentence, clientAddress = serverSocket.recv(1024). В большинстве случаев вы должны вызывать только .bind(), .listen() или .accept() для вашего сокета сервера. Этот сокет принимает только соединения и не будет содержать никаких данных для чтения. - person Tyler Zeller; 26.10.2018

Вы уверены, что это должны быть clientsys[2:] не clientsys[2] ?

person Sumanto Dinar    schedule 25.10.2018
comment
Когда я убираю двоеточие, я получаю сообщение об ошибке вне индекса. То же самое касается клиентской sys[1:]. Файл tcpclient.py, строка 11, в ‹module› serverPort = clientsys[2] IndexError: индекс списка вне допустимого диапазона - person anonymous_s; 25.10.2018
comment
Вы указали аргументы при запуске client.py? - person Sumanto Dinar; 25.10.2018
comment
Я не думаю, что у меня есть. Когда я запускаю client sys[1:], он выводит: [] - person anonymous_s; 25.10.2018

Причина возникновения ошибки заключается в том, что вы используете нарезку списка для поиска сервера и порта из sys.argv:

clientsys[1:]
clientsys[2:]

Результатом операции нарезки списка всегда является список:

l = [1, 2, 3]
>>>l[1:]
[2, 3]
>>>print(l[2:])
>>>[3]

Вместо этого используйте индексацию:

serverName = clientsys[0]
serverPort = clientsys[1]
person Ajax1234    schedule 25.10.2018
comment
Должен ли я полностью удалить sys.argv? - person anonymous_s; 25.10.2018