Ошибка сокета Java при чтении данных с сервера в reader.readLine () - PullRequest
0 голосов
/ 03 ноября 2019

Я работаю над проектом Android Studio в Java, который отправляет изображение на сервер python для обнаружения лица, сервер возвращает «1», если на отправленном изображении есть лица, и «0», если их нет.

Клиентский сокет может отправлять на сервер строку base64 изображения, и сервер также принимает ее и обнаруживает лица, но всякий раз, когда мой серверный сокет возвращает результат в форме JSON на клиентский сокет, поток вна стороне клиента запускается блок исключений, и результат не читается, и я получаю эту ошибку java.net.SocketException: сброс соединения.

Помогите, пожалуйста. Вот мой код для клиентской и серверной части.

Клиентская сторона

private void sendMsg(final String obj) {
 final Handler handler = new Handler();
 Thread thread = new Thread(new Runnable() {
  @Override
  public void run() {
   try {
    Socket s = new Socket("192.168.10.4", 5000);
    OutputStream out = s.getOutputStream();
    PrintWriter output = new PrintWriter(out);
    output.println(obj);
    output.flush();
    BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
    final String ss = reader.readLine(); 
    handler.post(new Runnable() { 
     @Override
     public void run() {
      try {
       JSONObject obj = new JSONObject(ss);
       String lab = obj.getString("label");
       if (lab.equalsIgnoreCase("1")) {
        prediction.setText("face detected");
       } else {
        prediction.setText("face not detected");
       }
      } catch (JSONException e) {
       e.printStackTrace();
       Log.e("thread error: ", "error inside thread");
      }
     }
    });
   } catch (IOException e) {
    e.printStackTrace();
    Log.e("thread error: ", "error outside thread");
   }
  }
 });
 thread.start();
}

Серверная сторона

import dlib
import base64
import io
import time
import codecs
from PIL import Image, ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True

import face_recognition
import cv2
from imageio import imread

import matplotlib.pyplot as plt
from io import StringIO
def threaded(c):
    data = c.recv(4096)

    #FACE DETECTION CODE WHICH ISNT THE PART OF THE PROBLEM#
    boxes = 1
    if(len(boxes)!= 0):
        label = "1"
    else:
        label = "0"

    c.send(  json.dumps({"label":label }).encode('utf-8')   )
    print( label )
    print( "Data" , json.dumps({"label": label })  )

    #print ("...")
    c.close()

port = 5000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((  "0.0.0.0" , port  )) 
print("socket binded to port", port )
s.listen(5) 
print("socket is listening")
all_conn = []
while True:
    conn, addr = s.accept()
    print('Connected to :', addr[0], ':', addr[1])
    all_conn.append( conn )
    start_new_thread(threaded, (conn,))
s.close()

1 Ответ

0 голосов
/ 03 ноября 2019

Сервер не должен закрывать сокет. Обычно это делается клиентом.

Но рекомендуется закрывать открытый сокет сервера после определенного времени ожидания, когда данные не принимаются.

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