java - 使用套接字时,json 文件未完整到达

标签 java python sockets

我有一个视频流。每一帧我都需要发送一个包含该帧数据的小 json 文件,速度至关重要。最好的方法是什么?

我的服务器是这样的。等待 json 文件,然后必须将该 json 文件发送到 python 应用程序。

public class ServerClass  {

    public static void main(String[] args) {
        Marcoserver mimarco=new Marcoserver();                  
    }   
}

class Marcoserver implements Runnable {

    public Marcoserver(){               
        Thread miHilo = new Thread(this);       
        miHilo.start();     
    }   

    public void run() {
        try {
            ServerSocket server = new ServerSocket(7777);

            while (true) {
                Socket miSocket = server.accept(); 

                BufferedReader entrada = new BufferedReader(new InputStreamReader(miSocket.getInputStream(), "UTF8"));
                String mensaje = entrada.readLine();

                JSONObject obj;
                obj = new JSONObject(mensaje);
                System.out.println(obj);

                ConectorSocket cntor = new ConectorSocket("localhost", 6363);   
                cntor.Conectar();
                cntor.Send(mensaje);
                cntor.Close();

                miSocket.close();
            }   

        } catch (IOException e) {
            e.printStackTrace();
        }       
    }

}


public class ConectorSocket{

        private String host;
        private int port;
        Socket sockSend;

        public ConnectClass(String hst, int prt ) {
            this.host = hst;
            this.port = prt;
        }

        public void Conectar() {
            this.sockSend = new Socket(this.host, this.port);
        }
        public void Send(String mensaje) {
            DataOutputStream flujo_salida = new DataOutputStream(sockSend.getOutputStream());
            flujo_salida.writeBytes(mensaje);
            flujo_salida.close();
        }
        public boolean Close() {
            this.sockSend.close();
        }

}

这是简化的 python 应用程序:

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 6666))
serversocket.listen()

while True:
    connection, address = serversocket.accept()
    buf = connection.recv(2048)
    if len(buf) > 0:
        print(buf.decode())

我的问题是 python 应用程序打印不完整的信息,例如:

{"keyword"
{"keyword": [[14, 1, -1]]}
{"keyword": [[14, 

而不是:

{"keyword":[]}
{"keyword":[[14,1,-1]]}
{"keyword":[[14,2,-1]]}

最佳答案

您的 Java 代码没有任何问题,但您的 Python 代码不好:

while True:
    connection, address = serversocket.accept()
    buf = connection.recv(2048)
    if len(buf) > 0:
        print(buf.decode())

这将只打印每个连接第一个收到的 TCP 数据包。

您需要继续调用recv直到它返回0:

while True:
    connection, address = serversocket.accept()
    msg = []
    while True:
        buf = connection.recv(65536)
        if (len(buf) == 0):
            break
        msg.append(buf)
    print(''.join(msg))
    connection.close()

您还需要关闭每个连接。

关于java - 使用套接字时,json 文件未完整到达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50331018/

相关文章:

java - 我可以阻止java抛出某些异常吗?

python - 如何在 macOS 上全屏显示 tkinter 应用程序?

python - 我可以展平一个深度嵌套的 Python 字典,它包含带有更多嵌套字典列表的值吗?

sockets - Erlang套接字发送超时永远不会发生

c# - AS3 套接字和策略文件请求到 C# 服务器

Java8 : double, 带有小写和大写后缀的浮点文字;类型构造函数和类型装箱/拆箱

java - 通过网络发送数据时触发 Android 事件。检测网络使用情况

java - 如何在jsp中使用JSTL迭代列表对象并检查基于列表对象值的条件

python - 如何对在 __init__ 方法之外初始化的实例变量进行单元测试

linux - Linux 中非常奇怪的连接时间