Python Forum
command line input (arg parse) and data exchange
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
command line input (arg parse) and data exchange
#1
Hi guys hope you are all keeping cool.
i am having an issue with my python program that I was writing. I am trying to make small server & client program for high school students to motivate them to learn coding. but i am running into difficulties.
i was trying to get the user input from the command line (ubuntu to be precise) so like when a student enters the command to run the program with arguments (port number, buffer length & IP address) the program runs the client part of it. client then takes the length of buffer, takes the port number and ip from command line and assigns to the variables. it then generates a random number between 1 and 100 and sends to the port entered. Then when they enter the command to run the server side code with argument (port number only), the server listen to the port and receives the data and sends it back to the client.
the buffer length is to specify how much data the client will transmit to server.

the commands that student put are as follows.

./clientServer.py –t –p 5001 –l 1000 –ip 127.0.0.1
where -t to run the client part of code
-p to indicate port number
-l for buffer length
-IP for loop back address. (in real environment the same code will run on 2 different machines, one will run the client part of code and one will run the server part of code)

./clientServer.py –r –p 5001
where -r to run the server part of code
-p for the port number



but i am having issues in parsing data and running the file.

so if you guys can help me i would really appreciate that and will be really thankful to you guys.

here is the code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import socket
import time
import argparse
from random import randint
 
 
def main():
 
 
    clientSock= socket.socket(socket.AF_INET, socket. SOCK_STREAM)
 
    #here is the argv parses
 
    parser = argparse.ArgumentParser(description = 'sending data to server and back to client')
    parser.add_argument('-t', '--transmit', action='store_true', help='transmission')
    parser.add_argument('-r', '--receive', action='store_true', help='receiving')
    parser.add_argument('-ip', '--serveripAddr', default=('127.0.0.1'), required = True, help='this is ip address')
    parser.add_argument('-p', '--serverport', type=int, default=5001, required = True, help='this is port number')
    parser.add_argument('-l', '--bufferSize', type=int, default=8192, required  = True, help='this is buffer size')
 
 
    args = parser.parse_args()
 
    serverAddr = args.ip
    port = args.p
    buffersize = args.l
 
 
    if args.t:
 
        clientSock.connect(port, serverAddr, buffersize)
        number = randint(1,100)
 
 
        dataOutStr= bin(number).replace("0b", "") # converts the numbers into binary before sending
 
        dataOutBytes= dataOutStr.encode()
        start = time.time()                       #start timer
        clientSock.sendall(dataOutBytes)           # sending data
     
        numBytes= len(dataOutBytes)
#=====================================================================================================
        #loop until all data receivedd
 
        dataInBytes= b''
 
        while len(dataInBytes) < numBytes:
            dataInBytes+= clientSock.recv(numBytes-len(dataInBytes))
 
            if not dataInBytes:
                    break
 
            dataInStr= dataInBytes.decode()
            remoteAddr= clientSock.getpeername()
            print( "received", dataInStr, "back from server", remoteAddr)
            print ("it took ", time.time()-start)
 
        clientSock.close()
 
 
    elif args.r:
 
        serverSock= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        serverSock.bind(('', 5001))
        serverSock.listen()
 
        while True:
 
            connectSock, clientAddr= serverSock.accept()
            print( "Connection from", clientAddr)
            while True:   # keep receiving until client close
                message = connectSock.recv()       
             
                if not message:
                    break
                 
            connectSock.sendall(message)
 
        connectSock.close()
 
    else :
        print("something went wrong")
 
 
if __name__== '__main__':
       main()

The program is not Running and also not assigning the values to the variables.

can anyone help me please.
Reply
#2
check out: https://pymotw.com/3/argparse/
It's a very good tutorial for Argparse
Reply
#3
ok so,i have managed to sort out few things but the code is not functional. it is running, but its doing nothing.
seems like stuck in a non stop loop
can anyone help please....

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import socket
import time
import argparse
from random import randint
 
clientSock= socket.socket(socket.AF_INET, socket. SOCK_STREAM)
 
#here is the argv pasrse
 
parser = argparse.ArgumentParser(description = 'sending data to server and back to client')
parser.add_argument('-t', action='store_true', help='transmission')
parser.add_argument('-r', action='store_true', help='recieving')
parser.add_argument('-ip', default=('127.0.0.1'), help='this is ip address')
parser.add_argument('-p', type=int, default=5001, help='this is port number')
parser.add_argument('-l', type=int, default=8192, help='this is buffer size')
 
 
args = parser.parse_args()
 
hostAddr = args.ip
port = args.p
bufferLenght = args.l
 
 
if args.t:
        clientSock.connect((hostAddr, port))
        buffcounter = 0
        dataOutBytes = ''
        for x in range (bufferLenght):
                number = randint(1,9)
                dataOutStr= bin(number).replace("0b", "")
                dataOutBytes+= dataOutStr
                         
        dataOutBytes = dataOutStr.encode()      
        numBytes= len(dataOutBytes)
        start = time.time()
        clientSock.sendall(dataOutBytes)
 
#============================================================================
        #loop until all data recieved
        dataInBytes= b''
        while len(dataInBytes) < numBytes:
                dataInBytes+= clientSock.recv(numBytes-len(dataInBytes))
 
                if not dataInBytes:
                        break
 
        dataInStr= dataInBytes.decode()
        remoteAddr= clientSock.getpeername()
        print( "received", dataInStr, "back from server", remoteAddr)
        print ("it took ", time.time()-start)
 
        clientSock.close()
       
elif args.r:
 
    serverSock= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    serverSock.bind(('', port))
    serverSock.listen()
 
    print ("The server is ready to receive!")
 
 
    while True:
 
        connectSock, clientAddr= serverSock.accept()
        print( "Connection from", clientAddr)
 
        while True:   # keep receiving until client close
             
            message = connectSock.recv(1024)       
             
            if not message:
                break
                 
        connectSock.sendall(message)
 
    connectSock.close()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
if args.t:
        clientSock.connect((hostAddr, port))
        buffcounter = 0
        dataOutBytes = ''
        for x in range (bufferLenght):
                number = randint(1,9)
                dataOutStr= bin(number).replace("0b", "")
                dataOutBytes+= dataOutStr
                          
        dataOutBytes = dataOutStr.encode()      
        numBytes= len(dataOutBytes)
        start = time.time()
        clientSock.sendall(dataOutBytes)
  
#============================================================================
        #loop until all data recieved
        dataInBytes= b''
        while len(dataInBytes) < numBytes:
                dataInBytes+= clientSock.recv(numBytes-len(dataInBytes))
  
                if not dataInBytes:
                        break
  
        dataInStr= dataInBytes.decode()
        remoteAddr= clientSock.getpeername()
        print( "received", dataInStr, "back from server", remoteAddr)
        print ("it took ", time.time()-start)
  
        clientSock.close()
its defiantly something in this part of the code..
Reply
#4
please do not send PM. Post here to share.
Reply
#5
Can anyone help please?
Reply
#6
Dos the network code work without argparse?
Simba Wrote:The program is not Running and also not assigning the values to the variables.
its defiantly something in this part of the code..
This is't helpful at all to understand the what's going on.
It's good idea to test the core stuff without any abstraction.
Keep it as simple as possible to start with,no argparse only the network code.
Then post that code with if getting errors(the whole Traceback message).
Reply
#7
it is working. and now even the argvparse is working but now the whole issue is that i am trying to run the randint() function to generate the same amount of data as buffer length specified by the user and then store it in the string before encoding and transmitting to the server.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
hostAddr = args.ip
port = args.p
bufferLenght = args.l
 
 
if args.t:
        clientSock.connect((hostAddr, port))
        buffcounter = 0
        dataOutBytes = ''
        while bufferLenght >0:
                number = randint(1,9)
                dataOutStr= bin(number).replace("0b", "")
                dataOutBytes+= dataOutStr
                bufferLenght = bufferLenght - 1
                 
        dataOutBytes = dataOutStr.encode()      
        numBytes= len(dataOutBytes)
        start = time.time()
        clientSock.sendall(dataOutBytes)
like literally this part is having issues.
Reply
#8
can anyone please help me?
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Βad Input on line 12 Azdaghost 5 1,320 Apr-19-2025, 10:22 PM
Last Post: Azdaghost
  Insert command line in script lif 4 1,035 Mar-24-2025, 10:30 PM
Last Post: lif
  How to revert back to a previous line from user input Sharkenn64u 2 1,028 Dec-28-2024, 08:02 AM
Last Post: Pedroski55
  I think I need to delete input data because returning to start fails thelad 2 1,129 Sep-24-2024, 10:12 AM
Last Post: thelad
  Simplest way to run external command line app with parameters? Winfried 2 1,329 Aug-19-2024, 03:11 PM
Last Post: snippsat
  Help with to check an Input list data with a data read from an external source sacharyya 3 1,757 Mar-09-2024, 12:33 PM
Last Post: Pedroski55
  Receive Input on Same Line? johnywhy 8 2,713 Jan-16-2024, 03:45 AM
Last Post: johnywhy
  manually input data jpatierno 0 796 Nov-10-2023, 02:32 AM
Last Post: jpatierno
  problem in using input command akbarza 4 3,394 Oct-19-2023, 03:27 PM
Last Post: popejose
  Input network device connection info from data file edroche3rd 6 2,759 Oct-12-2023, 02:18 AM
Last Post: edroche3rd

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020