0

我正在尝试让客户端连接到我的服务器,并在它们之间进行通信。连接中断的唯一原因是由于网络错误,或者除非客户端想要停止通话。

我遇到的问题是将处理程序保持在一个紧密的循环中,并解析 JSON。

我的服务器代码是:

#!/usr/bin/env python

import SocketServer
import socket
import json
import time

class MyTCPServer(SocketServer.ThreadingTCPServer):
    allow_reuse_address = True

class MyTCPServerHandler(SocketServer.BaseRequestHandler):

    def handle(self):

        while 1:
            try:
                networkData = (self.request.recv(1024).strip())

                try:
                    jsonInputData = json.loads(networkData)
                    print jsonInputData

                    try: 
                        if jsonInputData['type'] == 'SAY_HI':
                            print "HI"
                    except Exception, e:
                        print "no hi"
                        pass

                    try: 
                        if jsonInputData['type'] == 'GO_AWAY':
                            print "Going away!"
                    except Exception, e:
                        print "no go away"
                        pass

                except Exception, e:
                    pass
                    #time.sleep(0.001)
                    #print "JSON Error", e

            except Exception, e:
                #time.sleep(0.001)
                pass
                #print "No message", e

server = MyTCPServer(('192.168.1.115', 13373), MyTCPServerHandler)
server.serve_forever()

我的客户代码很简单:

#!/usr/bin/env python

import socket
import json
import time
import sys

hostname = '192.168.1.103'
port = 13373

try:
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((hostname,port))

except Exception, e:
    print "Error, could not open socket: ", e

data  = {'type':'SAY_HI'}

sock.send(json.dumps(data))

data  = {'type':'SAY_BYE'}

sock.send(json.dumps(data))

有时我会看到正在发送的消息“SAY_HI”和“SAY_BYE”,但大多数时候,服务器端没有显示任何数据。

4

1 回答 1

1

这个问题确实不清楚,但是打电话self.request.recv(1024)很可能不是你想做的。您正在消除 TCP 很乐意为您完成的所有出色的应用程序级处理。如果您将其更改为self.request.recv(8)或类似的非常小的数字(这样recv()在接收数据时返回,并且不尝试填充缓冲区),您可能会得到更好的结果。

归根结底,这是一个超级简单的变化,即使它有效,在更大的背景下也行不通。您将需要在服务器端处理来自 json 解析器的异常并等待更多数据,直到收到完整的格式良好的消息。

这是一个比任何 SO 答案通常处理的更复杂的主题。如果您要进行任何数量的原始套接字编程,您绝对必须拥有一份Unix Network Programming, Volume 1的副本。

于 2013-10-16T14:14:06.910 回答