Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何结束服务器套接字侦听_Python_Multithreading_Sockets_Network Programming - Fatal编程技术网

Python 如何结束服务器套接字侦听

Python 如何结束服务器套接字侦听,python,multithreading,sockets,network-programming,Python,Multithreading,Sockets,Network Programming,所以我要做的是创建一个多线程服务器,为每个连接到它的客户端创建线程,并回复从客户端发送的字符串 它可以正常工作,但我的服务器实际上没有正常结束。我的KerboardInterrupt捕获在windows命令提示符下似乎不起作用,唯一允许我退出进程的是ctrl+pause/break。有人能帮我想一个办法让服务器优雅地结束吗 服务器代码: import socket import threading import time import datetime import sys def getTi

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

它可以正常工作,但我的服务器实际上没有正常结束。我的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还是相当陌生的,而且还很粗糙

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

但当它到达最后一个连接的客户机时,出于某种原因,它开始拖下去


最后一张图片,输入持续了很长一段时间,用于大部分文本文件。似乎有些事情没有正确结束。

通过添加一个if语句来解决,该语句检查字节<0,如果是,则结束套接字

哪个
EOF
?套接字、数据包、文件对象?键盘中断将仅结束主线程。您还必须添加一个控制机制来结束子线程。我试着让我的线程成为一个守护进程,但没有成功。还有其他方法可以结束线程吗?