我正在尝试让一个客户端连接到我的服务器,并在它们之间有一个通信流。断开连接的唯一原因是由于网络错误,或者除非客户端想停止通话。你知道吗
我遇到的问题是将处理程序保持在一个紧密的循环中,并解析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))
有时我会看到消息被发送,“说你好”和“说再见”,但大多数时候,没有数据显示在服务器端。你知道吗
这个问题确实不清楚,但是调用
self.request.recv(1024)
很可能不是你想做的。您正在消除TCP为您带来的所有良好的应用程序级处理。如果将其更改为self.request.recv(8)
或类似的非常小的数字(例如recv()
在接收数据时返回,并且不尝试填充缓冲区),则可能会得到更好的结果。你知道吗归根结底,这是一个过于简单化的改变,即使它起作用,在更大的背景下也不会起作用。您需要在服务器端处理json解析器的异常,并等待更多数据,直到收到完整的格式良好的消息。你知道吗
这是一个无可救药的更复杂的问题,将处理一般在任何这样的答案。如果您要进行任何数量的原始套接字编程,那么您绝对必须拥有一个Unix Network Programming, Volume 1的副本。你知道吗
相关问题 更多 >
编程相关推荐