2017-03-11 3 views
-1

여기에 몇 가지 코드를 입력하고 연결을 설정합니다. 그러나 클라이언트가 서버에 데이터를 보내려고 할 때마다 클라이언트는 데이터를 연결 해제 할 때 보내지 않습니다. 곧 서버에 도달하여 문제를 해결할 수 있습니다.클라이언트가 서버에 도달하지 못했지만 클라이언트가 서버에 보낸 데이터를 연결 해제했을 때 성공적으로 연결되었습니다.

내가 원하는 것 : 연결이 설정되고 연결되지 않으면 닫습니다.

public class Server extends AppCompatActivity { 

private ServerSocket serverSocket; 
Handler UIHandler; 
Thread Thread1 = null; 
EditText edText; 
public static final int SERVERPORT = 3000; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_server); 
    getSupportActionBar().setTitle("Server"); 
    edText = (EditText) findViewById(R.id.editText); 
    UIHandler = new Handler(); 
    this.Thread1 = new Thread(new Thread1()); 
    this.Thread1.start(); 

} 

class Thread1 implements Runnable { 
    InetAddress addr; 

    @Override 
    public void run() { 
     Socket socket = null; 
     try { 
      addr = InetAddress.getByName(getLocalIpAddress()); 
      serverSocket = new ServerSocket(SERVERPORT); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     while (!Thread.currentThread().isInterrupted()) { 
      try { 
       socket = serverSocket.accept(); 

       Thread2 commThread = new Thread2(socket); 

       new Thread(commThread).start(); 

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

private String getLocalIpAddress() throws Exception { 
    String resultIpv6 = ""; 
    String resultIpv4 = ""; 

    for (Enumeration en = NetworkInterface.getNetworkInterfaces(); 
     en.hasMoreElements();) { 

     NetworkInterface intf = (NetworkInterface) en.nextElement(); 
     for (Enumeration enumIpAddr = intf.getInetAddresses(); 
      enumIpAddr.hasMoreElements();) { 

      InetAddress inetAddress = (InetAddress) enumIpAddr.nextElement(); 
      if (!inetAddress.isLoopbackAddress()) { 
       if (inetAddress instanceof Inet4Address) { 
        resultIpv4 = inetAddress.getHostAddress().toString(); 
       } else if (inetAddress instanceof Inet6Address) { 
        resultIpv6 = inetAddress.getHostAddress().toString(); 
       } 
      } 
     } 
    } 
    return ((resultIpv4.length() > 0) ? resultIpv4 : resultIpv6); 
} 

private class Thread2 implements Runnable { 
    Socket clientSocket; 
    BufferedReader input; 
    String read; 

    public Thread2(Socket clientSocket) { 
     this.clientSocket = clientSocket; 

     try { 
      this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream())); 

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

    @Override 
    public void run() { 
     while (!Thread.currentThread().isInterrupted()) { 

      try { 

       read = this.input.readLine(); 

       if (read != null) { 

        Server.this.runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          edText.setText(edText.getText().toString() + "Client says: " + read + "\n"); 
          Log.i("hhFULL", edText.getText().toString()); 
         } 
        }); 
       } else { 

        Thread1 = new Thread(new Thread1()); 
        Thread1.start(); 
        return; 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
+0

여기에 클라이언트 코드가 없습니다. 네가 묻고있는 것이 불분명하다. – EJP

+1

여기에 테스트 목적을 위해 나는 TCP 클라이언트가 Hercules 유틸리티 (s/w)를 사용하고 있습니다. 친애하는 @EJP, 그렇습니다. 어떤 클라이언트 (S/W)가 서버 연결에 연결되어 있지만 클라이언트가 서버에 텍스트를 보내면 클라이언트가 연결을 끊을 때까지 도달하지 않을 때 서버 코드입니다. –

+0

그래서 클라이언트 코드를 게시하십시오. 문제가 서버 코드에 있어야한다는 것은 임의로 결정할 수 없습니다. – EJP

답변

5

이것은 아마도 사용중인 클라이언트가 \ n 또는 \ r없이 메시지를 보내기 때문일 수 있습니다. InputStream로부터 라인을 읽는 코드가 무한 개행 문자를 기다립니다 아래 : -

read = this.input.readLine(); 
0

문제는 클라이언트가 일부 데이터를 보낼 때 해결, 그것은 (ASCII 코드)의 새로운 라인을 필요로한다.