JSON файл не завершен при использовании сокетов - PullRequest
0 голосов
/ 14 мая 2018

У меня есть поток видео. И каждый кадр мне нужно отправить небольшой файл 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]]}

1 Ответ

0 голосов
/ 14 мая 2018

В вашем 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()

Вам также необходимо закрыть каждое соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...