마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 tcp 통신관련 질문입니다 !! 도와주세요

0 추천

현재 컴퓨터에서 sever를 만들고  핸드폰에서 접속하는 어플 예제를 받아서

실행해보고 제가 만들고 있는 어플에 응용해서 적용하려 하고 있는데

서버와 연결이 안되네요 ㅠ ㅜ

어디를 고쳐야 문제가 사라질까요 ㅠㅠ

어플의 소스

첫번째 화면은 별거 없고 두번째 액티비티의 소스 입니다. ㅠ 에러는 없는데

통신이 안되네요 ㅠ

package com.example.butnex;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import android.util.Log;
import android.view.View.OnClickListener;
import android.widget.Toast;

public class remote_activity extends Activity {
 private String return_msg;
 Button up_btn;//각 버튼을 생성해주는 명령어
 Button left_btn;
 Button right_btn;
 Button down_btn;
 Button disconnect_btn;
 ImageView imagefield; //상단의 이미지를 출력하기 위한 명령어
 TextView check_txt;//버튼이 잘눌리는지 확인해주는 명령어
 
 @Override
 
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.lay2);

  up_btn = (Button)findViewById(R.id.lay2_up_btn);//각 버튼과 이미지 필드의 주소를 GUI와 연결해주는 명령어
  left_btn = (Button)findViewById(R.id.lay2_left_btn);
  right_btn = (Button)findViewById(R.id.lay2_right_btn);
  down_btn = (Button)findViewById(R.id.lay2_down_btn);
  disconnect_btn = (Button)findViewById(R.id.lay2_disconnect_btn);
  imagefield = (ImageView)findViewById(R.id.lay2_imege_field);
  check_txt = (TextView)findViewById(R.id.lay2_check);
/*
  Intent intent = getIntent();

  
  AlertDialog.Builder alert = new AlertDialog.Builder(remote_activity.this);//전달해준 아이피 주소와 포트번호를 다이어로그로 띄우는 명령어
  alert.setPositiveButton("확인", new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface dialog, int which) {
    dialog.dismiss();     //닫기
   }
  });
  alert.setMessage("IP 주소 : " + intent.getStringExtra("ip_data") + "\nPort 번호 : " + intent.getStringExtra("port_data"));
  alert.show();

*/

  up_btn.setOnClickListener(new View.OnClickListener() {//각 버튼을 눌렀을때 동작하는 명령어
   public void onClick(View v) {
    
    
    TCPclient tp = new TCPclient("up");
    tp.run();

    Toast t = Toast.makeText(getApplicationContext(),
      "up", Toast.LENGTH_LONG);
    t.show();
    check_txt.setText(return_msg);
   }
  });
  
  
  left_btn.setOnClickListener(new Button.OnClickListener() {
   public void onClick(View v) {
    
    
     TCPclient tp = new TCPclient("left");
     tp.run();

     Toast t = Toast.makeText(getApplicationContext(),
       "left", Toast.LENGTH_LONG);
     t.show();
     check_txt.setText(return_msg);
    }
   
  });
  right_btn.setOnClickListener(new Button.OnClickListener() {
   public void onClick(View v) {
    
    
    TCPclient tp = new TCPclient("right");
    tp.run();

    Toast t = Toast.makeText(getApplicationContext(),
      "right", Toast.LENGTH_LONG);
    t.show();
    check_txt.setText(return_msg);
   }
  });
  down_btn.setOnClickListener(new Button.OnClickListener() {
   public void onClick(View v) {
    
    
    TCPclient tp = new TCPclient("down");
    tp.run();

    Toast t = Toast.makeText(getApplicationContext(),
      "down", Toast.LENGTH_LONG);
    t.show();
    check_txt.setText(return_msg);
   }
  });
  
  disconnect_btn.setOnClickListener(new Button.OnClickListener() {
   public void onClick(View v) {
    Intent intent = new Intent(remote_activity.this, MainActivity.class);
    startActivity(intent);
   }
  });
 }

 private class TCPclient implements Runnable {
  private static final String serverIP = "192.168.0.13"; // ex:
                // 192.168.0.100
  private static final int serverPort = 5000; // ex: 5555
  private String msg;

  // private String return_msg;

  public TCPclient(String _msg) {
   this.msg = _msg;
  }

  @Override
  public void run() {
   // TODO Auto-generated method stub
   try {

    InetAddress serverAddr = InetAddress.getByName(serverIP);

    Log.d("TCP", "C: Connecting...");

    Socket socket = new Socket(serverAddr, serverPort);

    try {
     Log.d("TCP", "C: Sending: '" + msg + "'");
     PrintWriter out = new PrintWriter(new BufferedWriter(
       new OutputStreamWriter(socket.getOutputStream())),
       true);

     out.println(msg);
     Log.d("TCP", "C: Sent.");
     Log.d("TCP", "C: Done.");

     BufferedReader in = new BufferedReader(
       new InputStreamReader(socket.getInputStream()));
     return_msg = in.readLine();

     Log.d("TCP", "C: Server send to me this message -->"
       + return_msg);
    } catch (Exception e) {
     Log.e("TCP", "C: Error1", e);
    } finally {
     socket.close();
    }
   } catch (Exception e) {
    Log.e("TCP", "C: Error2", e);
   }
  }

 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }
}

 

lonely0826 (140 포인트) 님이 2013년 5월 29일 질문
해결 하였습니다. 문제는 68,83,97,110,라인이 문제 였네요
직접 저렇게 'up' 이런식으로 인자를 전달하면 안되나 봅니다 ㅠ

2개의 답변

0 추천
ip가 192.168.x.x 이면 사설 ip대역입니다.

해당 ip는 외부에서 알 수 없는 ip대역이라서 발생한 문제로 보입니다.~~
wind (2,240 포인트) 님이 2013년 5월 29일 답변
사설ip 망 내에서 통신이 잘되는건 예제를 통해 확인했습니다.
서버도 같은 ip로 연결이 되어있고 안드로이드도 같은 망내에
있기 때문에 문제 없이 연결되는 것은 예제를 통해 확인 했으므로
ip와 port 번호에 문제는 없는 것으로 보입니다 ㅠ
다른부분에서 문제가 생기는 것 같은데 이유를 모르겠습니다
퍼미션부분도 처리했는데 왜 문제가 생기는지 모르겠습니다. ㅠ
0 추천
모바일이 서버 컴퓨터랑 같은 네트워크(공유기)에 접속해서 테스트하시거나,

공유기에서 서버 컴퓨터가 가진사설 ip 로 포트포워딩을 하시거나 해서 접속 가능하도록 하세요

방화벽 설정 해제하는것도 잊지마시구요~
블랙넥원 (9,600 포인트) 님이 2013년 5월 29일 답변
예제를 통해 같은 망내에서 실행했습니다. 예제 프로그램으로
실행시에는 문제 없이 실행 됬구요 ip나 port 번호의 문제 때문은
아닌것 같습니다 ㅠㅜ 어디가 문제일까요? 금요일에 발표인데 ㅠ
...