|
안드로이드 개발 Socket IO 사용해서 Node JS 서버와 통신하는 방법 |
|
환경: Android Studio |
요즘은 앱에 사용자간의 소통을 위한 채팅기능은 필수입니다. NodeJS 서버를 사용하고 있다면 좀더 빠르고 쉽게 개발할 수 있는 Socket.io 모듈을 사용해 보세요. 안드로이드와의 채팅 기능을 어렵지 않게 구현할 수 있습니다. 오늘은 간단하게 메시지를 주고 받는 정도만 이야기 하도록 하겠습니다.
|
◎ 안드로이드 App 소스 |
▼ 먼저 안드로이드 App 에서 Socket.io 구현을 위한 준비를 하도록 하겠습니다. NodeJS 서버와 연결을 위해 2가지를 살펴야 합니다. 첫 번째는 AndroidManifest.xml 파일에 INTERNET 퍼미션을 추가해야 합니다. 두 번째는 http://localhost 나 http://127.0.0.1 이 아닌 실질적으로 할당된 가상 아이피를 입력해야 합니다. 윈도우라면 ipconfig 로 아이피 정보를 알아내 접속 주소로 입력하세요.
▼ 다음은 socket.io 사용을 위한 라이브러리를 gradle 의 dependencies 에 추가해야 합니다. 그림과 같이 추가합니다.
▼ Socket IO 연결 소스 입니다. IO.socket() 함수의 파라미터로 접속 주소를 입력합니다. 그리고 Socket 객체의 connect() 함수를 실행하면 연결이 됩니다. Socket 객체의 on() 함수에는 Callback 객체를 등록해야 합니다. Socket.EVENT_CONNECT 는 연결 성공하면 발생하는 이벤트입니다. 두 번째 mSocket.on() 에는 ‘serverMessage’ 이벤트로 오는 메시지를 받기 위한 Callback 객체를 등록했습니다.
private Socket mSocket;
try {
mSocket = IO.socket("http://192.168.0.16:3000");
mSocket.connect();
mSocket.on(Socket.EVENT_CONNECT, onConnect);
mSocket.on("serverMessage", onMessageReceived);
} catch(URISyntaxException e) {
e.printStackTrace();
}
▼ 등록 가능한 이벤트의 종류는 다음과 같습니다.
▼ 두 개의 Callback 객체는 다음과 같습니다. 연결과 동시에 발생하는 onConnect 에는 emit() 함수를 이용해서 서버로 hi 라는 메시지를 전송합니다. 두 번째 onMessageReceived 는 서버에서 보내는 메시지를 받습니다. 서버에서는 데이터를 JSON 으로 보낼 것입니다.
// Socket서버에 connect 되면 발생하는 이벤트
private Emitter.Listener onConnect = new Emitter.Listener() {
@Override
public void call(Object... args) {
mSocket.emit("clientMessage", "hi");
}
};
// 서버로부터 전달받은 'chat-message' Event 처리.
private Emitter.Listener onMessageReceived = new Emitter.Listener() {
@Override
public void call(Object... args) {
// 전달받은 데이터는 아래와 같이 추출할 수 있습니다.
try {
JSONObject receivedData = (JSONObject) args[0];
Log.d(TAG, receivedData.getString("msg"));
Log.d(TAG, receivedData.getString("data"));
} catch (JSONException e) {
e.printStackTrace();
}
}
};
▼ Activity 의 전체 소스는 다음과 같습니다.
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import org.json.JSONException;
import org.json.JSONObject;
import java.net.URISyntaxException;
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
public class MainActivity extends AppCompatActivity {
private String TAG = "MainActivity";
private Socket mSocket;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
mSocket = IO.socket("http://192.168.0.16:3000");
mSocket.connect();
mSocket.on(Socket.EVENT_CONNECT, onConnect);
mSocket.on("serverMessage", onMessageReceived);
} catch(URISyntaxException e) {
e.printStackTrace();
}
}
// Socket서버에 connect 되면 발생하는 이벤트
private Emitter.Listener onConnect = new Emitter.Listener() {
@Override
public void call(Object... args) {
mSocket.emit("clientMessage", "hi");
}
};
// 서버로부터 전달받은 'chat-message' Event 처리.
private Emitter.Listener onMessageReceived = new Emitter.Listener() {
@Override
public void call(Object... args) {
// 전달받은 데이터는 아래와 같이 추출할 수 있습니다.
try {
JSONObject receivedData = (JSONObject) args[0];
Log.d(TAG, receivedData.getString("msg"));
Log.d(TAG, receivedData.getString("data"));
} catch (JSONException e) {
e.printStackTrace();
}
}
};
}
|
◎ NodeJS 서버 소스 |
▼ 다음은 서버 역할을 위한 NodeJS 구현을 위한 소스 입니다. 먼저 http 모듈을 이용해서 서버를 구동해야 합니다. 포트는 3000 번으로 했습니다.
var server = http.createServer(function(req, res){
}).listen(3000, function(){
console.log('Server running at http://192.168.0.16:3000');
});
▼ Socket IO 를 server 에 등록하고 소켓 서버를 생성하는 소스입니다. Client 접속 정보는 connection 이벤트를 통해서 알 수 있습니다. 그리고 클라이언트에서 보낸 메시지는 ‘clientMessage’ 에서 받습니다. 안드로이드와 emit() 으로 메시지를 보낼 때 첫 번째 파라미터 값과 동일하게 맞춰야 합니다.
// 소켓 서버를 생성한다.
var io = socketio.listen(server);
io.sockets.on('connection', function (socket){
console.log('Socket ID : ' + socket.id + ', Connect');
socket.on('clientMessage', function(data){
console.log('Client Message : ' + data);
var message = {
msg : 'server',
data : 'data'
};
socket.emit('serverMessage', message);
});
});
▼ NodeJS 전체 소스는 다음과 같습니다.
var http = require('http');
var socketio = require('socket.io');
var server = http.createServer(function(req, res){
}).listen(3000, function(){
console.log('Server running at http://192.168.0.16:3000');
});
// 소켓 서버를 생성한다.
var io = socketio.listen(server);
io.sockets.on('connection', function (socket){
console.log('Socket ID : ' + socket.id + ', Connect');
socket.on('clientMessage', function(data){
console.log('Client Message : ' + data);
var message = {
msg : 'server',
data : 'data'
};
socket.emit('serverMessage', message);
});
});
'안드로이드 개발' 카테고리의 다른 글
| 안드로이드(Android) ListView 멀티, 싱글 설정과 선택한 데이터 가져오는 방법 (4) | 2019.01.07 |
|---|---|
| 안드로이드 개발 FragmentTransaction replace argument type 에러 (0) | 2018.12.14 |
| 안드로이드(Android) 현재 연결은 사용자의 호스트 시스템의 소프트웨어의 의해 중단되었습니다. 에러 났을 때 (0) | 2018.11.28 |
| 안드로이드 개발 Wear(웨어러블) 앱 프로젝트 만드는 방법 (0) | 2018.11.07 |
| 안드로이드 개발 ERROR x86 emulation currently requires hardware acceleration 에러 (0) | 2018.10.17 |
| 안드로이드 개발 위젯 클릭(이벤트 연결) 으로 앱 실행하는 방법 (0) | 2018.09.21 |
| 안드로이드 개발 Fragment 화면 구성하는 방법 - FragmentActivity 로 화면 구성 (0) | 2018.09.18 |
| 안드로이드 개발 Fragment 와 Activity 의 통신하는 방법 (1) | 2018.08.31 |
