【问题标题】:Python - Socket Communication, multiple messagesPython - 套接字通信,多条消息
【发布时间】:2016-10-13 03:10:40
【问题描述】:

我被这个套接字通信卡住了,我到处找了,但我还没有找到答案。

问题:在给我一个错误或结束脚本之前,我只能从客户端发送 1 条消息。 我需要能够向服务器发送多条消息。

服务器端(如下图)应该没问题:

# Echo server program
import socket
import time
import os

#-----------------------------------------------------------------------------------------------------------------------

today = time.strftime('%Y.%m.%d')
logFileName = "log - " + today + ".txt"


HOST = '10.0.0.16'                                                          
PORT = 8080                                                                 # Reserve a port for your service
BUFFER_SIZE = 1024                                                          
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)                       # Create a socket object
s.bind((HOST, PORT))                                                        # Bind to the port


def print_write(text):
    log.write(time.strftime("%H:%M:%S") + "  |  " + text)
    log.write("\n")
    print text


#-----------------------------------------------------------------------------------------------------------------------


if os.path.isfile(logFileName) is True:
    log = open(logFileName, 'a+')
    print_write("[SERVER] Log for " + today + " already exists.")
    print_write("[SERVER] Starting comms")
else:
    print "[SERVER] Log doesn't exist"
    log = open(logFileName, 'a+')                                           # Create file -> log - %date%.txt
    print_write("[SERVER] Log created")


while True:
    s.listen(1)
    conn, addr = s.accept()
    data = conn.recv(BUFFER_SIZE)
    if data == "Comms Shutdown":
        print_write("------ REMOTE SHUTDOWN ------")
        conn.close()
        raise SystemExit
    else:
        print_write("[COMMS] " + str(addr) + " says: " + data)

log.close()

很抱歉,如果它非常混乱和令人困惑,但我没有太多时间完成这个项目,如果您有任何问题,请尽管提问。

对于客户端我没有太多,但在这里,我会给你这个:

import socket

HOST = '10.0.0.16'          # The remote host
PORT = 8080                 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

while True:
    msg = raw_input()
    s.sendall(msg)
    print msg

我知道这行不通,只是为了让您了解我需要什么。

提前谢谢你。

【问题讨论】:

  • 你的服务器代码在再次循环之前只调用了一次recv,你应该使用while循环或类似的东西在打开新连接之前多次调用recv..

标签: python sockets communication


【解决方案1】:

问题是,您只能从每个打开的连接中读取第一条消息,然后再继续下一条。 accept() 方法等待新连接,并在新连接进入时为您提供所需的信息。另一方面,recv() 方法从现有连接接收数据并在没有连接时等待。如果你想从一个客户端接收多条消息,你可以等待第一个连接,然后用recv()等待数据。这可能看起来像这样:

s.listen(1)
conn, addr = s.accept()
while True:
    data = conn.recv(BUFFER_SIZE)
    if data == "Comms Shutdown":
        print_write("------ REMOTE SHUTDOWN ------")
        conn.close()
        raise SystemExit
    else:
        print_write("[COMMS] " + str(addr) + " says: " + data)

如果您还希望能够管理多个客户端,则必须从等待新连接的 while 循环中为每个客户端创建一个线程。这有点复杂:

def client_handler(conn):
    while True:
        data = conn.recv(BUFFER_SIZE)
        if data == "Comms Shutdown":
            print_write("------ REMOTE SHUTDOWN ------")
            conn.close()
            raise SystemExit  
            # this will kill the server (remove the line above if you don't want that)
        else:
             print_write("[COMMS] " + str(addr) + " says: " + data)

while True:
    s.listen(1)
    conn, addr = s.accept()
    recv_thread = threading.Thread(target=client_handler, args=(conn, ))
    recv_thread.start()

所有这些代码都未经测试。请注意,我省略了日志记录部分和套接字创建部分以及所有导入。

【讨论】:

  • 正是我想要的!太好了,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
相关资源
最近更新 更多