Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- # Foundations of Python Network Programming, Third Edition
- # https://github.com/brandon-rhodes/fopnp/blob/m/py3/chapter03/tcp_sixteen.py
- # Simple TCP client and server that send and receive 16 octets
- import argparse, socket
- import sys
- import glob
- import time
- def recvall(sock, length):
- data = b''
- while len(data) < length:
- more = sock.recv(length - len(data))
- if not more:
- raise EOFError('was expecting %d bytes but only received'
- ' %d bytes before the socket closed'
- % (length, len(data)))
- data += more
- return data
- def server(interface, port):
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- sock.bind((interface, port))
- sock.listen(1)
- print('Listening at', sock.getsockname())
- print('Waiting to accept a new connection')
- sc, sockname = sock.accept()
- print('We have accepted a connection from', sockname)
- print(' Socket name:', sc.getsockname())
- print(' Socket peer:', sc.getpeername())
- #message = recvall(sc, 16)
- while True:
- len_msg = recvall(sc, 3)
- message = recvall(sc, int(len_msg)).decode()
- pesan = message.split()
- if(pesan[0]=="ping"):
- msgPing = pesan[1:]
- msgPHasil = " ".join(msgPing)
- print("Terima : ", msgPHasil)
- elif(pesan[0]=="ls"):
- List=""
- if(len(pesan)==1):
- listFile=glob.glob("./*")
- else:
- msgL = " ".join(pesan[1:])
- print(msgL)
- listFile = glob.glob(msgL)
- for i in listFile:
- List += i +"\n"
- print(List)
- List = List.encode()
- len_List = b"%03d" % (len(List),)
- listFix = len_List + List
- sc.sendall(listFix)
- elif(pesan[0]=="get"):
- pesan2 = " ".join(pesan[1:-1])
- pesanGet = pesan2 + '/' + pesan[-1]
- f = open(pesanGet, "rb")
- b = f.read()
- #print(len(b))
- f.close()
- print("fetch:", pesan2, "size: ", len(b), "lokal:", pesan[-1])
- elif(pesan[0]=="quit"):
- sc.sendall(b"client shutdown...")
- sc.close()
- print("server shutdown..")
- sys.exit(0)
- def client(host, port):
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect((host, port))
- print('Client has been assigned socket name', sock.getsockname())
- # msg = " "
- while True:
- msg = input("> ")
- pesan = msg.encode()
- len_msgE = b"%03d" % (len(pesan),)
- pesan = len_msgE + pesan
- sock.sendall(pesan)
- msg=msg.split()
- if(msg[0]=="ping"):
- pesan = msg[1:]
- pesanPing = " ".join(pesan)
- print("Terima :", pesanPing)
- elif(msg[0] =="ls"):
- reply = recvall(sock, 3)
- listFile = recvall(sock, int(reply)).decode()
- print(listFile)
- elif(msg[0]=="get"):
- pesan = " ".join(msg[1:-1])
- pesanGet = pesan+"/"+msg[-1]
- f = open(pesanGet, "rb")
- b = f.read()
- # print(len(b))
- f.close()
- print("fetch",pesan,"size :" ,len(b), "lokal",msg[-1])
- elif (msg[0] == "quit"):
- reply = recvall(sock, 16)
- print('The server said', repr(reply))
- time.sleep(1)
- sock.close()
- break
- else:
- print("unknown command...")
- if __name__ == '__main__':
- choices = {'client': client, 'server': server}
- parser = argparse.ArgumentParser(description='Send and receive over TCP')
- parser.add_argument('role', choices=choices, help='which role to play')
- parser.add_argument('host', help='interface the server listens at;'
- ' host the client sends to')
- parser.add_argument('-p', metavar='PORT', type=int, default=1060,
- help='TCP port (default 1060)')
- args = parser.parse_args()
- function = choices[args.role]
- function(args.host, args.p)
Add Comment
Please, Sign In to add comment