Search code examples
pythonsockets

How do you connect the TCP client to the server and send to the server side? Getting errors and cannot successfully run code.


I'm learning TCP and was trying out a client/server program. My server side is working, but on my client side, I can't connect successfully to the server side.

Error Codes on my Client Side

First Error:

Traceback (most recent call last): File "tcpclient.py", line 13, in clientSocket.connect((serverName, serverPort)) TypeError: str, bytes or bytearray expected, not list

Second Error:

Traceback (most recent call last): File "tcpclient.py", line 34, in clientSocket.send(clientSentence.encode(), serverAddress) TypeError: an integer is required (got type tuple)

Server Code: This code runs successfully.

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()

Client: This is where the two errors occur.

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()

Solution

  • Your first error is caused by you using a list slice for the server name and port. Change to this:

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

    Your second error is because socket.send() doesn't accept the serverAddress tuple parameter (where you thinking of socket.sendto()? Either way, you can fix by simply removing the parameter:

    clientSocket.send(clientSentence.encode())
    

    Link to socket.send docs: https://docs.python.org/3/library/socket.html#socket.socket.send