我如何获取套接字以继续侦听客户端并不断从客户端打印信息

时间:2018-07-17 14:03:23

标签: python server

服务器端(服务器打印从客户端发送的第一行信息,然后它只是保持打开状态,似乎不再继续监听,而是保持打开状态。有没有办法让服务器多听取客户意见并打印?)

import time

import socket

import signal

from datetime import datetime
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8089))
serversocket.listen(1024) # become a server socket, maximum 5 connectionn

def clientsocketentry():
    while True:
      connection, addr = serversocket.accept()
      buf = connection.recv(64)

      if not buf:
          break

      elif buf == 'killsrv':
          connection.close()
          sys.exit()

      else:
          print (buf)
          buf = buf.decode("utf-8")
          buf = buf.split(',')
          serverLong = buf[0]
          print('Longitude:' + '' + serverLong)
          serverLat = buf[1]
          print('Lattitude:' + '' + serverLat)
          serverAlt = buf[2]
          print('Altitude:' + '' + serverAlt)
          serverTime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
          print('Time of Entry:' + ' ' + serverTime)
          connection.close()



clientsocketentry()

客户端(我只能发送一串信息,然后服务器保持打开状态,而不会从客户端获取更多信息)

import socket

import time

clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

clientsocket.connect(('localhost', 8089))

a = '39.163100,-76.899428,0'
clientsocket.send(a.encode('utf-8'))
time.sleep(5)

a = '4.2,2.2415,0'
clientsocket.send(a.encode('utf-8'))
time.sleep(5)

a = '43454,354354,35435'
clientsocket.send(a.encode('utf-8'))
time.sleep(5)

a = '435742.,35.452,52434'
clientsocket.send(a.encode('utf-8'))
time.sleep(5)


clientsocket.close()

2 个答案:

答案 0 :(得分:0)

您正在关闭ClientSocketEntry函数中打印逻辑末尾的套接字。

serverTime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print('Time of Entry:' + ' ' + serverTime)
connection.close()

仅在用户发送killsrv时关闭连接,而不是关闭连接 因为每次关闭套接字上的连接都是在说您期望另一个客户端连接到服务器。因此,也许在进入while语句之前先接受连接,然后再将其传递到while语句中,因为当前构造结构的方式是期望来自不同客户端的多个连接。

答案 1 :(得分:0)

如果您一次接受一个连接(那么不需要1024个积压...),您可以简单地嵌套2个循环:外部的一个等待新连接,内部的一个处理来自唯一一个已建立连接的输入。如果需要处理多个连接,则必须使用select或线程。

以下是一个单一连接的示例:

def clientsocketentry():
    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    serversocket.bind(('localhost', 8089))
    serversocket.listen(5) # become a server socket, maximum 5 connectionn
    cont = True
    while cont:
      connection, addr = serversocket.accept()
      while True:
          buf = connection.recv(64)

          if len(buf) == 0:     # end of connection
              connection.close()
              break

          elif buf == b'killsrv':     # request for closing server (beware of the byte string)
              connection.close()
              serversocket.close()
              cont = False
              break

          else:
              print (buf)
              buf = buf.decode("utf-8")
              buf = buf.split(',')
              serverLong = buf[0]
              print('Longitude:' + '' + serverLong)
              serverLat = buf[1]
              print('Lattitude:' + '' + serverLat)
              serverAlt = buf[2]
              print('Altitude:' + '' + serverAlt)
              serverTime = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
              print('Time of Entry:' + ' ' + serverTime)
              # connection.close()    # wait for client to close