2016-12-30 2 views
0

Android에서 클라이언트 (client.java)의 문자열을 허용하는 자바 소켓을 사용하여 server.java이라는 Java 서버를 만들고 수정 한 다음 클라이언트에 수정 한 문자열을 보냅니다. 내 경우 엔 안드로이드 앱이다.]Java 소켓 프로그래밍에 도움이 필요합니다.

두 가지를 모두 실행하려고 시도했는데 오류없이 안드로이드 앱이 사용자 입력 문자열을 서버에 성공적으로 보냅니다. 서버가 문자열을 받으면 서버가 출력을 제공하지 않을 때 문제가 발생합니다. 클라이언트가 서버 터미널 출력 후 폐쇄 (또는 사망) 그러나 만약 같이 여기

public class Server { 
    static Socket socket; 
    static PrintWriter out; 
    static BufferedReader in; 
    static int port = 9999; 

    public static void main(String[] args) { 

     String query="blank", returnMessage="Server malfunctioning!"; 

     try { 
      ServerSocket serverSocket = new ServerSocket(port); 
      System.out.println("Server Started and listening to the port "+port); 
      socket = serverSocket.accept(); 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 

      while(true) { 
       try { 
        query=in.readLine(); 
        System.out.println("message received from client is: "+query); 
        //Processing the query. 
        returnMessage="i received message:"+query; 

        //Sending the response back to the client. 
        out.print(returnMessage); 
        System.out.println("request: Message sent to the client : " + returnMessage); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } finally { 
        out.flush(); 
        out.close(); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       socket.close(); 
      } catch(Exception e) { 
       System.out.println(e); 
      } 
     } 
    } 
} 

을 그리고 AsyncTask를 확장 ServerConnect.java있다 : 여기

message received from client is: null 
request: Message sent to the client : i received message:null 
message received from client is: null 
request: Message sent to the client : i received message:null 
message received from client is: null 
request: Message sent to the client : i received message:null 
message received from client is: null 
request: Message sent to the client : i received message:null 
message received from client is: null 
request: Message sent to the client : i received message:null 

데스크톱 컴퓨터에서 실행 Server.java의 코드는 : 피어가 연결을 닫을 때

public class ServerConnect extends AsyncTask<Object, Object, Void> { 
    String TAG="Server"; 
    String message="empty response"; 
    String ip="EMPTY QUERY"; 
    WebView wb; 
    TextToSpeech tts; 
    String host = "192.168.2.3"; 
    int port = 9999; 
    PrintWriter out; 
    BufferedReader in; 
    Socket socket; 

    ServerConnect(String inp, WebView wbb, TextToSpeech ts) { 
     ip=inp; 
     this.wb=wbb; 
     tts=ts; 
    } 

    @Override 
    protected Void doInBackground(Object... voids) { 
     Log.d(TAG, "ip value "+ip); 
     try { 
      // InetAddress address = InetAddress.getByName(host); 
      socket = new Socket(host, port); 
      out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

      try { 
       //Send the message to the server 
       out.print(ip); 
       //out.flush(); 
       Log.d(TAG, "request: Message sent to the server : " + ip); 
       message = in.readLine(); 
       Log.d(TAG, "doInBackground: message" + message); 
      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       message = "UnknownHostException: " + e.toString(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       message = "My Brain is not working! Reason is: "+e; 
      } finally { 
       in.close(); 
       out.flush(); 
      } 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      Log.d(TAG, "doInBackground: finally block"); 

      try { 
       socket.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     return null; 
    } 

    protected void onPostExecute(Void result) { 
     // wb.getSettings().setJavaScriptEnabled(true); 
     if(message!=null) { 
      wb.loadDataWithBaseURL(null, message, "text/html", "utf-8", null); 
      tts.speak(stripHtml(message), TextToSpeech.QUEUE_FLUSH, null, null); 
      if (!(pullLinks(stripHtml(message)).equals(""))) { 
       wb.setWebViewClient(new WebViewClient()); 
       wb.setWebChromeClient(new WebChromeClient() {}); 
       wb.loadUrl(pullLinks(message)); 
       //ip.setText(""); 
       super.onPostExecute(result); 
      } 
     } else { 
      wb.loadDataWithBaseURL(null, "Message is null!", "text/html", "utf-8", null); 
      tts.speak("Message is null!", TextToSpeech.QUEUE_FLUSH, null, null); 
     } 
    } 

    public String stripHtml(String html) { 
     return Html.fromHtml(html).toString(); 
    } 

    private String pullLinks(String text) { 
     String links=""; 

     String regex = "\\(?\\b(http://|www[.])[-A-Za-z0-9+&amp;@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&amp;@#/%=~_()|]"; 
     Pattern p = Pattern.compile(regex); 
     Matcher m = p.matcher(text); 

     while(m.find()) { 
      String urlStr = m.group(); 
      if (urlStr.startsWith("(") && urlStr.endsWith(")")) 
       urlStr = urlStr.substring(1, urlStr.length() - 1); 

      links=urlStr; 
     } 

     return links; 
    } 
} 
+0

클라이언트 - 서버 통신을 만드는 기존 기술을 제안 할 수 있습니까? – Sergey

+0

서버 쪽 끝에있는 작성자를 플러시하려고합니다. – PWC

+0

입력 및 출력을 처리 할 스레드를 만듭니다. 처음 연결된 클라이언트가 다른 모든 클라이언트를 차단하고 있습니다. – PWC

답변

0

readLine() 반환, 즉 스트림의 마지막에 널 (null). 당신은 그 사건을 감지하지 못합니다 : 당신은 null을 데이터로 다루고 있습니다. 널을 얻으면 읽기 루프를 종료해야합니다.

NB UnknownHostExceptionprint() 또는 readLine()으로 처리 할 수 ​​없습니다.

관련 문제