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

Socket 관련해서 질문있습니다.

0 추천

 

 

안녕하세요.

소켓과 관련해서 질문이 있습니다.

지금 현재 아래의 사진에서 보면, 액티비티1을 누르면 그다음에 open 버튼이 있는곳에 도달하게 됩니다.

그리고 저 open부분을 누르게 되면, 그 아래의 소스코드의 전반적으로 써져있는 로그부분(뚜벅이 1~ 뚜벅이5) 까지

로그가 잘 찍히면서 버튼의 finish()문으로 인해 종료가 되어 다시 액티비티1 버튼이 있는 화면으로 이동합니다.

그리고 다시, 액티비티를 눌렀을 경우에도 같고, 한번 더 눌렀을 경우에도 이와 같습니다.

하지만, 4번째에 들어가게 되었을 경우에, 뚜벅이 로그는 3까지만 찍히며 run()함수의 Socket의 바로 위쪽의

로그인 Log.i("socket","attemping connect") 까지만 찍히게 되고.. 그 이후에는 버튼이 아무런 동작을

하지 않습니다.  소켓과 관련해서 분명히 문제가 있는것 같은데 그 원인을 잘 모르겠어서 질문을 합니다.

어떻게 해야, 횟수에 상관없이 계속적으로 버튼을 눌렀을때 뚜벅이가 1~5까지 정상적으로 찍히면서

소켓이 열리며, 정상작동이 되게 만들수 있을까요 ?

소스가 추가되는 부분은 제 글의 댓글 부분에 달아보겠습니다. ㅠ ㅠ

11.jpg

22.jpg

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class First extends AppCompatActivity implements Runnable {

    private Socket socket;                                
    private DataInputStream dataInputStream;
    private DataOutputStream dataOutputStream;
    private byte[] buffer;          

    private Thread thread;               
    private String ip="192.168.11.6";      

    private Button transferButton;                

    private final static int TRANSFER=1;              
    private final static int NOMOVEMENT=0;           
    private int rwFlag;                             
    private boolean threadStopFlag;                  

  
공산당 (1,960 포인트) 님이 2016년 11월 27일 질문
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);

        buffer=new byte[1];                                            
        rwFlag=NOMOVEMENT;                                           
        threadStopFlag=false;                                        


Log.i("뚜벅이1 ","1");


transferButton=(Button)findViewById(R.id.transfer); //버튼 연결
transferButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rwFlag=TRANSFER; //rwFlag의 상태를 TRANSFER로 바꾸고
setNotify(); //스레드를 다시 동작하게 해서 t를 전송한다.
finish();
}
}); //리스너 연결

Log.i("뚜벅이2 ","2");



thread=new Thread(this); //스레드를 만들고
thread.start(); //동작시킨다.
}



//실제 스레드가 돌아가는 곳
@Override
public void run() {
try {


Log.i("뚜벅이3 ","3");


Log.i("socket", "attemping connect");
socket=new Socket(ip,4251); //입력한 아이피, 4251포트로 접속을 시도한다.
Log.i("socket","connect success"); //성공했으면 connect success를 로그로 출력한다.
dataInputStream=new DataInputStream(socket.getInputStream());
dataOutputStream=new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
Log.i("Input Error", "connect | dataInput | dataOutput error");
Toast.makeText(First.this, "IP가 맞지 않습니다.", Toast.LENGTH_SHORT).show();
}


Log.i("뚜벅이4 ","4");



while(true)
{
if(threadStopFlag)
{
try {
dataOutputStream.close();
Log.i("dataOutputStrema","dataoutputstream close");
dataInputStream.close();
Log.i("datainputStrema", "datainputstream close");
socket.close();
Log.i("socket", "socket close");
} catch (IOException e)
{
e.printStackTrace();
}
break;
}
Log.i("thread", String.valueOf(rwFlag));


        Log.i("뚜벅이5 ","5");


switch(rwFlag)
{
case TRANSFER:
buffer[0]='t';
try {
dataOutputStream.write(buffer);
Log.i("write", "t");
} catch (IOException e) {
e.printStackTrace();
}
break;
}

setWait();
}
}



public synchronized void setNotify() { //스레드를 다시 동작하게 하는 함수
notify();
}

public synchronized void setWait() //스레드를 멈추는 함수
{

try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}


}

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...