newbie: write content in a file (server-side)

T

Thomas Kaufmann

Hi,

I send from a client file content to my server (as bytes). So far so good.
The server receives this content complete. Ok. Then I want to write this content to a new file. It works too. But in the new file are only the first part of the whole content.

What's the problem.

o-o

Thomas

Here's my server code:



import socketserver

class MyTCPServer(socketserver.BaseRequestHandler):

def handle(self):

s = ''
li = []
addr = self.client_address[0]
print("[{}] Connected! ".format(addr))
while True:

bytes = self.request.recv(4096)
if bytes:
s = bytes.decode("utf8")
print(s)
li = s.split("~")
with open(li[0], 'w') as fp:
fp.write(li[1])

#... main ......................................................

if __name__ == "__main__":

server = socketserver.ThreadingTCPServer(("", 12345), MyTCPServer)
server.serve_forever()
 
P

Peter Otten

Thomas said:
I send from a client file content to my server (as bytes). So far so good.
The server receives this content complete. Ok. Then I want to write this
content to a new file. It works too. But in the new file are only the
first part of the whole content.

What's the problem.
Here's my server code:
while True:
bytes = self.request.recv(4096)
if bytes:
s = bytes.decode("utf8")
print(s)
li = s.split("~")
with open(li[0], 'w') as fp:
fp.write(li[1])

- Do you ever want to leave the loop?

- You calculate a new filename on every iteration of the while loop --
probably not what you intended to do.

- The "w" argument tells Python to overwrite the file if it exists. You
either need to keep the file open (move the with... out of the loop) or open
it with "a".

- You may not receive the complete file name on the first iteration of the
while loop.

- The bytes buffer can contain incomplete characters, e. g.:
data = b"\xc3\xa4"
data.decode("utf-8") 'ä'
data[:1].decode("utf-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 0:
unexpected end of data
 
T

Thomas Kaufmann

Am Sonntag, 29. Juli 2012 17:16:11 UTC+2 schrieb Peter Otten:
Thomas Kaufmann wrote:


I send from a client file content to my server (as bytes). So far so good.
The server receives this content complete. Ok. Then I want to write this
content to a new file. It works too. But in the new file are only the
first part of the whole content.

What's the problem.


Here's my server code:


while True:
bytes = self.request.recv(4096)
if bytes:
s = bytes.decode("utf8")

li = s.split("~")
with open(li[0], 'w') as fp:
fp.write(li[1])



- Do you ever want to leave the loop?



- You calculate a new filename on every iteration of the while loop --

probably not what you intended to do.



- The "w" argument tells Python to overwrite the file if it exists. You

either need to keep the file open (move the with... out of the loop) or open

it with "a".



- You may not receive the complete file name on the first iteration of the

while loop.



- The bytes buffer can contain incomplete characters, e. g.:


data = b"\xc3\xa4"
data.decode("utf-8")
'ä'
data[:1].decode("utf-8")

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 0:

unexpected end of data


Thanks Peter. It helps;-).
 
T

Thomas Kaufmann

Am Sonntag, 29. Juli 2012 17:16:11 UTC+2 schrieb Peter Otten:
Thomas Kaufmann wrote:


I send from a client file content to my server (as bytes). So far so good.
The server receives this content complete. Ok. Then I want to write this
content to a new file. It works too. But in the new file are only the
first part of the whole content.

What's the problem.


Here's my server code:


while True:
bytes = self.request.recv(4096)
if bytes:
s = bytes.decode("utf8")

li = s.split("~")
with open(li[0], 'w') as fp:
fp.write(li[1])



- Do you ever want to leave the loop?



- You calculate a new filename on every iteration of the while loop --

probably not what you intended to do.



- The "w" argument tells Python to overwrite the file if it exists. You

either need to keep the file open (move the with... out of the loop) or open

it with "a".



- You may not receive the complete file name on the first iteration of the

while loop.



- The bytes buffer can contain incomplete characters, e. g.:


data = b"\xc3\xa4"
data.decode("utf-8")
'ä'
data[:1].decode("utf-8")

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 0:

unexpected end of data


Thanks Peter. It helps;-).
 
T

Thomas Kaufmann

Am Sonntag, 29. Juli 2012 16:16:01 UTC+2 schrieb Thomas Kaufmann:
Hi,



I send from a client file content to my server (as bytes). So far so good.

The server receives this content complete. Ok. Then I want to write this content to a new file. It works too. But in the new file are only the first part of the whole content.



What's the problem.



o-o



Thomas



Here's my server code:







import socketserver



class MyTCPServer(socketserver.BaseRequestHandler):



def handle(self):



s = ''

li = []

addr = self.client_address[0]

print("[{}] Connected! ".format(addr))

while True:



bytes = self.request.recv(4096)

if bytes:

s = bytes.decode("utf8")

print(s)

li = s.split("~")

with open(li[0], 'w') as fp:

fp.write(li[1])



#... main ......................................................



if __name__ == "__main__":



server = socketserver.ThreadingTCPServer(("", 12345), MyTCPServer)

server.serve_forever()


Thanks a lot. It helps.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,906
Latest member
SkinfixSkintag

Latest Threads

Top