0

Whenever the client disconnect, the server will close itself. How can i make the server to run forever ?

What i'm doing

The server let one client to retrieve files with no issues. But the problem is when the client close the program, the server will also closed itself and wouldn't let another client to establish the connection . I had read a few articles about using while loops to make the session alive. Does anyone know how can I do that ?

Server.py

import socket, os, subprocess, shutil, pickle, struct
# Create a Socket ( connect two computers)
def create_socket():
 try:
 global host
 global port
 global s
 host = ""
 port = 9999
 s = socket.socket()
 except socket.error as msg:
 create_socket()
# Binding the socket and listening for connections
def bind_socket():
 try:
 global host
 global port
 global s
 s.bind((host, port))
 s.listen(5)
 except socket.error as msg:
 bind_socket()
# send file list
def flist(conn):
 try:
 arr = pickle.dumps(os.listdir())
 conn.send(arr)
 except:
 conn.send(('Error').encode("utf-8"))
# accept file from server
def fdown(filename, conn):
 try:
 data = conn.recv(1024).decode("utf-8")
 if data[:6] == 'EXISTS':
 filesize = data[6:]
 conn.send("OK".encode("utf-8"))
 f = open(filename, 'wb')
 data = (conn.recv(1024))
 totalRecv = len(data)
 f.write(data)
 while int(totalRecv) < int(filesize):
 data = conn.recv(1024)
 totalRecv += len(data)
 f.write(data)
 f.close()
 except:
 conn.send(('Error').encode("utf-8"))
# send file
def fup(filename, conn):
 if os.path.isfile(filename):
 conn.send(str.encode("EXISTS " + str(os.path.getsize(filename))))
 filesize = int(os.path.getsize(filename))
 userResponse = conn.recv(1024).decode("utf-8")
 if userResponse[:2] == 'OK':
 with open(filename, 'rb') as f:
 bytesToSend = f.read(1024)
 conn.send(bytesToSend)
 totalSend = len(bytesToSend)
 while int(totalSend) < int(filesize):
 bytesToSend = f.read(1024)
 totalSend += len(bytesToSend)
 conn.send(bytesToSend)
 else:
 conn.send("ERROR".encode("utf-8"))
# main
def main(s):
 while True:
 data = (s.recv(1024)).decode("utf-8").split('~')
 if data[0] == 'fdown':
 fup(data[1], s)
 elif data[0] == 'fup':
 fdown(data[1], s)
 elif data[0] == 'flist':
 flist(s)
 else:
 s.send(".".encode('utf-8'))
# Establish connection with a client (socket must be listening)
def socket_accept():
 conn, address = s.accept()
 main(conn)
 conn.close()
create_socket()
bind_socket()
socket_accept()
asked Mar 1, 2021 at 5:57

1 Answer 1

2

You should put accept in the loop, and you may need use a thread to handle read

sample code:

def handle_read(s):
 while True:
 data = s.recv(1024)
 if not data:
 #When the client closed, recv will return an empty data
 s.close()
 break
 data = data.decode("utf-8").split('~')
 if data[0] == 'fdown':
 fup(data[1], s)
 elif data[0] == 'fup':
 fdown(data[1], s)
 elif data[0] == 'flist':
 flist(s)
 else:
 s.send(".".encode('utf-8'))
 
def socket_accept():
 while True:
 conn, address = s.accept()
 t = threading.Thread(target = handle_read, args=(conn, ))
 t.start()
answered Mar 1, 2021 at 6:06
Sign up to request clarification or add additional context in comments.

6 Comments

Thanks. It worked. But is it ok if i dont use thread to handle my read ?
If you don't use threads, then only one client connection can be processed at a time.
If you want to handle multiple sockets in a single thread, then you can use IO multiplexing, such as select.
Ohh thanks for the explanation. Btw if i want my client to have up to date's server files, I also need to use while loop ? For example, when the server add a new files, the client still don't see the new added files. Client need to reopen the application in order to see the new files Image: link
If you want your clients to have the latest server files, you should make a timer to request the files at regular intervals. Server-side while loop is required, otherwise your server-side program will also end after the client connection ends.
|

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.