簡體   English   中英

Java 在 reader.readLine() 從服務器讀取數據時出現套接字錯誤

[英]Java socket error while reading data from server at reader.readLine()

我正在 java 中的 android 工作室項目上工作,該項目將圖片發送到 python 服務器進行人臉檢測,如果發送的圖片中有任何人臉,則服務器返回“1”,如果沒有,則返回“1”。

客戶端套接字能夠將圖片的 base64 字符串發送到服務器,服務器接收它並檢測人臉,但是每當我的服務器套接字以 JSON 形式向客戶端套接字返回結果時,客戶端的線程就會運行異常塊並且未讀取結果,我收到此錯誤 java.net.SocketException: Connection reset.

請幫忙。 這是我的客戶端和服務器端代碼。

客戶端

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()

服務器不應關閉套接字。 這通常由客戶完成。

但是,在沒有接收到數據的特定超時后關閉打開的服務器套接字是一種很好的做法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM