728x90

이 포스팅은 앞서 작성한 라즈베리파이 Qt가 서버이고 어플이 클라이언트로 구성되어 있습니다.

https://1d1cblog.tistory.com/39

 

라즈베리파이 Qt Tcp 소켓통신하기(서버)

#ifndef DIALOG_H #define DIALOG_H #include #include #include "processthread.h" namespace Ui { class Dialog; } class Dialog : public QDialog { Q_OBJECT public: explicit Dialog(Q..

1d1cblog.tistory.com

먼저 AndroidManifest.xml에 아래 코드를 추가해줍니다.

 <uses-permission android:name="android.permission.INTERNET" />

그 후 액티비티에 InputStream과 OutputStream, Socket을 선언해줍니다. 그리고 서버 ip, port를 설정합니다. 

여기서 Thread를 사용하는 이유는 반응하지 않는 UI가 생성되는 것을 방지하려면 UI 스레드에서 네트워크 작업을 수행해서는 안 됩니다. 기본적으로 Android 3.0(API 레벨 11) 이상에서는 기본 UI 스레드를 제외한 스레드에서 네트워크 작업을 수행해야 합니다. 그렇지 않으면 NetworkOnMainThreadException이 발생합니다. 

public class MainActivity extends AppCompatActivity {

    final String TAG = "TAG+MainActivity";

    public InputStream dataInputStream;
    public OutputStream dataOutputStream;
    private Socket socket;
    private String ip = "121.153.150.157";
    private int port = 9999;

    Thread thread;
    ImageButton lightButton;
    
 	...
}

수신하는 쓰레드입니다. 

thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    socket = new Socket(ip,port);
                    dataInputStream = socket.getInputStream();
                    dataOutputStream = socket.getOutputStream();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                byte[] buffer = new byte[1024];
                int bytes;
                Log.d(TAG, "수신 시작");
                while(true) {
                    try {
                        Log.d(TAG, "수신 대기");
                        bytes = dataInputStream.read(buffer);
                        Log.d(TAG, "byte = " + bytes);
                        String tmp = new String(buffer, 0, bytes);
                        Log.d(TAG,tmp);
                        ...
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        thread.start();

다음으로 송신부분입니다. turnOn()이라는 함수 안에 write함수가 있습니다. 

public void turnOn() throws IOException {
        byte[] inst = "On".getBytes();
        dataOutputStream.write(inst);
}

turnOn()함수를 별도의 쓰레드를 생성해서 사용해줬습니다.

lightButton.setOnClickListener(new View.OnClickListener() {    
    @Override
    public void onClick(DialogInterface dialog, int which) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                        turnOn();
                } catch (IOException e) {
                    e.printStackTrace();
            	}
           }
    }).start();
 }
728x90

+ Recent posts