如何结束服务器套接字监听

时间:2017-02-15 07:35:19

标签: python multithreading sockets network-programming

所以我要做的就是创建一个多线程服务器,为每个连接它的客户端创建线程,并回复客户端发送的字符串。

它有点奏效,但我的服务器实际上并没有正常结束。我的KerboardInterrupt捕获似乎不能在Windows命令提示符下工作,只有让我退出进程的东西是ctrl + pause / break。任何人都可以帮我想一个让服务器优雅地结束的方法吗?

服务器代码:

import socket
import threading
import time
import datetime
import sys

def getTime():
    ts = time.time()
    timeStamp = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-      %d_%H:%M:%S')
    return timeStamp

def ThreadFunction(clientsocket, clientaddr):
    global ReceivedData
    global SentData
    while True:

        #Receive data from client
        data = clientsocket.recv(bufferSize)
        #Get client IP and port
        clientIP, clientSocket = clientsocket.getpeername()

        #Add to total amount of data transfered
        ReceiveDataSize = len(data)
        ReceivedData += ReceiveDataSize

        #LOg the received data
        text_file.write(str(getTime()) + "__ Size of data received (" +     clientIP + ":" + str(clientSocket) + ") = " + str(ReceiveDataSize) + '\n')

        #Send data
        clientsocket.send(data)
        SentDataSize = len(data)
        SentData += SentDataSize

        #Log the sent data
        text_file.write(str(getTime()) + "__ Size of data sent (" + clientIP + ":" + str(clientSocket) + ") = " + str(SentDataSize) + '\n')


def Close(counter, ReceivedData, SentData):
    print ("Shutting down Server...")
    serversocket.close()
    text_file.write("\n\nTotal # of connections: " + str(counter))
    text_file.write("\nTotal data received: " + str(ReceivedData))
    text_file.write("\nTotal data sent: " + str(SentData))
    text_file.close()
    sys.exit()


if __name__ == '__main__':

    serverIP = raw_input('Enter your server IP \n')
    port = int(raw_input('What port would you like to use?\n'))

    # Maintain how many connections
    connections = []
    counter = 0

    # Maintain amount of data sent to and from server
    ReceivedData = 0
    SentData = 0
    bufferSize = 1024

    # Create and initialize the text file with the date in the filename in the logfiles directory
    text_file = open("MultiThreadedServerLog.txt", "w")
    address = (serverIP, port)
    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # Bind server to port
    serversocket.bind(address)

    # The listen backlog queue size
    serversocket.listen(50)
    print ("Server is listening for connections\n")

    try:
        while 1:
            # Accept client connections, increment number of connections
            clientsocket, clientaddr = serversocket.accept()
            counter += 1

            # Log client information
            print (str(clientaddr) + " : " + " Just Connected. \n Currently connected clients: " + str(counter) + "\n")
            text_file.write(str(getTime()) + " - " + str(clientaddr) + " : " + " Just Connected. \n Currently connected clients: " + str(counter) + "\n")
            clientThread = threading.Thread(target=ThreadFunction, args=(clientsocket, clientaddr))
            clientThread.start()

    except KeyboardInterrupt:
        print ("Keyboard interrupt occurred.")
        Close(counter, ReceivedData, SentData)

客户代码:

from socket import *
import threading
import time
import random
import sys
import datetime


serverIP = ""
port = 8005
message = ""
msgMultiple = 1


def getTime():
    ts = time.time()
    timeStamp = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d_%H:%M:%S')
    return timeStamp



def run(clientNumber):
    buffer = 1024

    global totalTime

    s = socket(AF_INET, SOCK_STREAM)
    s.connect((serverIP, port))
    threadRTT = 0

    while 1:
        for _ in range(msgMultiple):
            cData = message + "  From: Client " + str(clientNumber)

            # Start timer and send data
            start = time.time()
            s.send(cData.encode('utf-8'))
            print "Sent: " + cData

            # Stop timer when data is received
            sData = s.recv(buffer)
            end = time.time()

            # Keep track of RTT and update total time
            response_time = end - start
            threadRTT += end - start
            totalTime += response_time
            print "Received: " + cData + '\n'
            t = random.randint(0, 9)
            time.sleep(t)

        # Log information of Client
        text_file.write(
            "\nClient " + str(clientNumber) + " RTT time taken for " + str(msgMultiple) + " messages was: " + str(
                threadRTT) + " seconds.")
        threadRTT = 0
        break


if __name__ == '__main__':
    serverIP = raw_input('Enter the server IP: ')
    port = int(input('Enter the port: '))
    clients = int(input('Enter number of clients: '))
    message = raw_input('Enter a message to send: ')
    msgMultiple = int(input('Enter the number of times you would like to send the message: '))

    # Initialize Log file
    text_file = open("ClientLog.txt", "w")

    # Used to maintain list of all running threads
    threads = []
    totalTime = 0

    # Create a seperate thread for each client
    for x in range(clients):
        thread = threading.Thread(target=run, args=[x])
        thread.start()
        threads.append(thread)

    for thread in threads:
        thread.join()
    # Calculations for log data
    bytes = sys.getsizeof(message)
    totalRequests = clients * msgMultiple
    totalBytes = totalRequests * bytes
    averageRTT = totalTime / totalRequests
    # Output data
    print("Bytes sent in message was : " + str(bytes))
    print("Total Data sent was : " + str(totalBytes) + " Bytes.")
    print("Average RTT was : " + str(averageRTT) + " seconds.")
    print("Requests was : " + str(totalRequests))

    # Write data to log file
    text_file.write("\n\n Bytes sent in message was : " + str(bytes))
    text_file.write("\nTotal Data sent was : " + str(totalBytes) + " Bytes.")
    text_file.write("\nAverage RTT was : " + str(averageRTT) + " seconds.")
    text_file.write("\nRequests was : " + str(totalRequests))

如果其他人有任何一般改进,他们会添加到此代码,请告诉我。我在python上还很新,而且还很粗糙。

这是从我的服务器获取的正常预期输入。

enter image description here

但当它到达最后一个连接的客户端时,由于某种原因它开始拖延。

enter image description here

最后一张图片,很长一段时间后,大部分文本文件的输入都会继续。似乎某些东西没有正确结束。

1 个答案:

答案 0 :(得分:0)

通过添加检查字节的if语句来解决此问题。 0,如果是,则结束套接字。