套接字服务器运行其他代码并向客户端发送更新

时间:2015-01-15 15:45:02

标签: python sockets

这可能已经回答,但没有找到任何内容或者不知道要搜索什么。我有一个针对多个客户端(下面的代码)的套接字服务器,并希望服务器运行代码(即检查某些东西的状态),然后向客户端发送消息。我该怎么做呢?

为了澄清,我需要学习如何向此代码添加异步任务,以便它可以检查并在需要时向客户端发送消息

示例:虽然有连接的客户端,但我希望服务器不断检查日志文件以及是否更改,如果是,我希望它向客户端发送消息

Server.py (工作代码)

from socket import *
import thread

BUFF = 1024
HOST = '127.0.0.1'# must be input parameter @TODO
PORT = 9999 # must be input parameter @TODO
def response(key):
    return 'Server response: ' + key

def handler(clientsock,addr):
    while 1:
        data = clientsock.recv(BUFF)
        if not data: break
        print repr(addr) + ' recv:' + repr(data)
        clientsock.send(response(data))
        print repr(addr) + ' sent:' + repr(response(data))
        if "close" == data.rstrip(): break # type 'close' on client console to close connection from the server side

    clientsock.close()
    print addr, "- closed connection" #log on console

if __name__=='__main__':
    ADDR = (HOST, PORT)
    serversock = socket(AF_INET, SOCK_STREAM)
    serversock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
    serversock.bind(ADDR)
    serversock.listen(5)
    while 1:
        print 'waiting for connection... listening on port', PORT
        clientsock, addr = serversock.accept()
        print '...connected from:', addr
        thread.start_new_thread(handler, (clientsock, addr))

1 个答案:

答案 0 :(得分:0)

我在下面添加了代码server.py,这适用于在日志文件更改时发送状态更改消息。

import socket
import sys
import time
from thread import *

HOST = 'localhost'   # Symbolic name meaning all available interfaces
PORT = 9999 # Arbitrary non-privileged port

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'

#Bind socket to local host and port
try:
    s.bind((HOST, PORT))
except socket.error as msg:
    print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1]
    sys.exit()

print 'Socket bind complete'

#Start listening on socket
s.listen(10)
print 'Socket now listening'

#Function for handling connections. This will be used to create threads
def clientthread(conn):
    #Sending message to connected client
    conn.send('Welcome to the server. Type something and hit enter\n') #send only takes string
    data = conn.recv(1024)

    #infinite loop so that function do not terminate and thread do not end.
    while True:
        logfile = open("serverlog.txt","r")
        #Receiving from client
        logfile.seek(0,2)
        while True:
            line = logfile.readline()
            if not line:
                time.sleep(0.1) # Sleep briefly
                continue
            reply = 'File Changed...Your Data' + data
            break
        conn.sendall(reply)

    #came out of loop
    conn.close()

#now keep talking with the client
while 1:
    #wait to accept a connection - blocking call
    conn, addr = s.accept()
    print 'Connected with ' + addr[0] + ':' + str(addr[1])

    #start new thread takes 1st argument as a function name to be run, second is the tuple of arguments to the function.
    start_new_thread(clientthread ,(conn,))

s.close()

要测试它在一个命令提示符下运行此server.py并保持打开状态。像这样的东西

> python server.py 
Socket created
Socket bind complete
Socket now listening

从其他cmd提示符运行一个简单的telnet来验证连接

telnet localhost 9999

将localhost替换为IP。在这些telnet连接上键入任何内容,您应该得到正确的响应。 您还可以在server.py cmd提示符上查看所做的连接。

正如我所提到的,请检查this link