Client server implementation

r0g aioe.org at technicalbloke.com
Wed Sep 17 19:12:29 CEST 2008


Babloo wrote:
> On Sep 16, 7:38 am, Benjamin <musiccomposit... at gmail.com> wrote:
>> On Sep 15, 5:15 am, Babloo <pruthviraj... at gmail.com> wrote:
>>
>>> Hi everyone,
>>>                   i wanted to implement a client- server connection
>>> and transfer a file over the network. i was able to implement a normal
>>> set up where in i was able to send chat messages and small chunks of
>>> data.
>>> I want to implement the file transfer with out using the FTP library
>>> available in python .
>>>                   So can anyone suggest a piece of code by which i can
>>> do that.
>> I don't know what you really want, but look at Twisted.http://twistedmatrix.com
>>
>>
>>
>>> Thanks
>>> Pruthvi
>>
> I am beginner at using python language.
> I mean i am implementing that in a  windows based machine and wanted
> to transfer files over the LAN. I have written down two files as
> client.py and server.py . I ran these files at two different Computers
> in the LAN and  I was able to send small chunks of messages( like
> chat).
> 
> I was successful in establishing connection and sending small
> messages. But now i want to transfer a complete file with out using
> the ftplib(FTP LIBRARY) in python.
> 
> 
> The files look like this.i hope this would help.
> 
> ______________________________________________
> # Server program
> 
> from socket import *
> 
> # Set the socket parameters
> host = "117.105.224.94"
> port = 21567
> buf = 1024
> addr = (host,port)
> 
> # Create socket and bind to address
> UDPSock = socket(AF_INET,SOCK_DGRAM)
> UDPSock.bind(addr)
> 
> # Receive messages
> while 1:
> 		 data,addr = UDPSock.recvfrom(buf)
> 		 if not data:
> 		 		 print "Client has exited!"
> 		 		 break
> 		 else:
> 		 		 print "\nReceived message '", data,"'"
> 
> # Close socket
> UDPSock.close()
> __________________________________________________
> 
> # Client program
> 
> from socket import *
> 
> # Set the socket parameters
> host = "117.105.224.94"
> port = 21567
> buf = 1024
> addr = (host,port)
> 
> # Create socket
> UDPSock = socket(AF_INET,SOCK_DGRAM)
> 
> def_msg = "===Enter message to send to server===";
> print "\n",def_msg
> 
> # Send messages
> while (1):
> 	data = raw_input('>> ')
> 	if not data:
> 		break
> 	else:
> 		if(UDPSock.sendto(data,addr)):
> 			print "Sending message '",data,"'....."
> 
> # Close socket
> UDPSock.close()
> 
> _____________________________________________________________
> 


You're really not far away then, you basically need to come up with a
simple protocol that can transmit

1) The file name
2) The file length
3) The file data itself

You could also transmit the files metadata: datestamps, permissions etc
if you wanted to make it better. Also, there might be security issues to
consider too if you're running this on anything other than your own home
network.

So anyway, for a simple solution howabout you send:

filename + "\n"
filesize + "\n" (make sure you use str() to send this as text)

Then loop through your filedata
  send a chunk
  wait for an OK back from the other side
  loop

At the receiving end as the chunks arrive:

Get the filename
Open a file for writing
Get the filesize
Setup a loop to receive the file data
  Send OK
  Get chunk from socket
  Write data to file
  Break (stop) if filesize reached
  Loop
Close file

This, of course has no error correction and will probably die if you
have any packet loss on your network, a more robust solution would be to
use TCP sockets rather than UDP sockets.

Hope this helps :-)


Roger Heathcote

http://www.technicalbloke.com
http://movingtoubuntu.technicalbloke.co.uk



More information about the Python-list mailing list