SPRING :: NOTE

[ANDROID] 소켓통신(Socket) 쓰레드 클래스 구현 및 사용방법 본문

Development Language/JAVA · ANDROID

[ANDROID] 소켓통신(Socket) 쓰레드 클래스 구현 및 사용방법

RAYZIE 2019. 1. 15. 19:37
반응형

예전에 안드로이드를 하긴 했지만..

시간이 너무 오래 지나서 안드로이드도 다 까먹고, 워낙 바뀐게 많다 보니 애를 많이먹었다.


안드로이드 API 몇버전이더라...

이제 소켓통신을 할 때 쓰레드를 생성해서 통신하는것 아니면 에러가 난다고 해서 몸소 겪었다. 

하루종일...


그래서... 인터넷에서 찾은 js 소켓 통신으로 SendMessage에 Thread만 추가하여 클래스를 만들었다.

아래는 원본 링크다. 설명이 잘 되어있으니 한번 방문하는것도 좋을듯.

원본 링크


클래스를 구현하고 Activity에서 new 해주면 된다.

TcpClient.java

import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

public class TcpClient {
    private Socket socket;
    private OutputStream socketOutput;
    private BufferedReader socketInput;

    private String ip;
    private int port;
    private ClientCallback listener=null;

    public TcpClient(String ip, int port){
        this.ip=ip;
        this.port=port;
    }

    public void connect(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                socket = new Socket();
                InetSocketAddress socketAddress = new InetSocketAddress(ip, port);
                try {
                    socket.connect(socketAddress);
                    socketOutput = socket.getOutputStream();
                    socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                    new ReceiveThread().start();

                    if(listener!=null)
                        listener.onConnect(socket);
                } catch (IOException e) {
                    if(listener!=null)
                        listener.onConnectError(socket, e.getMessage());
                }
            }
        }).start();
    }

    public void disconnect(){
        try {
            socket.close();
        } catch (IOException e) {
            if(listener!=null)
                listener.onDisconnect(socket, e.getMessage());
        }
    }

    public void send(final String message){
        new Thread()
        {
            public void run()
            {
                try {
                    socketOutput.write(message.getBytes());
                } catch (IOException e) {
                    if(listener!=null)
                        listener.onDisconnect(socket, e.getMessage());
                }
            }
        }.start();

    }

    private class ReceiveThread extends Thread implements Runnable{
        public void run(){
            String message;
            try {
                while((message = socketInput.readLine()) != null) {   // each line must end with a \n to be received
                    Log.d("RECEIVE THREAD RUN() : ", "Progressing...");
                    if(listener!=null)
                        listener.onMessage(message);
                }
            } catch (IOException e) {
                if(listener!=null)
                    listener.onDisconnect(socket, e.getMessage());
            }

        }
    }

    public void setClientCallback(ClientCallback listener){
        this.listener=listener;
    }

    public void removeClientCallback(){
        this.listener=null;
    }

    public interface ClientCallback {
        void onMessage(String message);
        void onConnect(Socket socket);
        void onDisconnect(Socket socket, String message);
        void onConnectError(Socket socket, String message);
    }
}


your Activity.java


/* Socket Comm */
TcpClient mClient;

// onCreate Inner
mClient = new TcpClient("192.168.0.1", 6000);
mClient.setClientCallback(new TcpClient.ClientCallback () {
            @Override
            public void onMessage(String message) {
                Log.d("SERVER RECEIVE : ", message);
            }

            @Override
            public void onConnect(Socket socket) {
                mClient.send("Hello World!\n");
            }

            @Override
            public void onDisconnect(Socket socket, String message) {
            }

            @Override
            public void onConnectError(Socket socket, String message) {
            }
        });

        mClient.connect();
        ...
        ...
        ...
}


반응형
Comments