package org.androidtown.socketio; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import org.json.JSONObject; import java.net.URL; import io.socket.client.IO; import io.socket.client.Socket; import io.socket.emitter.Emitter; public class MainActivity extends AppCompatActivity { EditText et_msg, et_host, et_port; TextView tv_msg; Button btn_connect, btn_send; Socket socket; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { et_msg = findViewById(R.id.editText_msg); et_host = findViewById(R.id.editText_host); et_port = findViewById(R.id.editText_port); tv_msg = findViewById(R.id.TextView_msgFromServer); btn_connect = findViewById(R.id.btn_connect); btn_send = findViewById(R.id.btn_send); btn_connect.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(socket != null) return; try { String host = et_host.getText().toString(); int port = Integer.parseInt(et_port.getText().toString()); URL url = new URL("http", host, port, "/"); socket = IO.socket(url.toURI()); socket.connect(); socket.on("SEND", new Emitter.Listener() { @Override public void call(final Object... args) { runOnUiThread(new Runnable() { @Override public void run() { try { JSONObject data = (JSONObject) args[0]; tv_msg.setText(data.getString("message")); } catch(Exception e) { Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); e.printStackTrace(); } } }); } }); } catch(Exception e) { Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG) .show(); e.printStackTrace(); } } }); btn_send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(socket != null) { JSONObject data = new JSONObject(); try { data.put("message", et_msg.getText().toString()); socket.emit("SEND", data); } catch(Exception e) { Toast.makeText(getApplicationContext(), e.getMessage(), Toast .LENGTH_LONG).show(); e.printStackTrace(); } } } }); } @Override protected void onDestroy() { super.onDestroy(); socket.emit("disconnect", null); socket.disconnect(); } } - 간단한 버튼들로 Retrofit을 이용해 node.js 서버와 각각 ( post / get / put / delete )의 통신 방법으로 데이터를 주고받는 기능을 구현해보자
Create New Project Empty Activity / Next Name : Example_Retrofit / Finish
- activity_main.xml : Layout은 본인 편한대로! 저는 ConstraintLayout 공부중이라 이걸로... ( 쓰다보면 편할거같음 => 좋음 )
- build.gradle ( Module: Example_Retrofit.app ) : dependencies 블럭 안에 추가하고 우측 상단에 Sync Now 클릭!
- AndroidManifest.xml
: <manifest ... > 태그 다음에 넣기
: <application 태그 안에 넣기
- ApiService.java
: GET - Query 형태로 보냄 : POST - Field 형태로 보내기 때문에 @FormUrlEncoded 어노테이션 붙여줘야함 : PUT - 마찬가지로 Field 형태가 있어서 어노테이션 추가, 경로를 통해 id를 보냄 : DELETE - 경로를 통해 id를 보냄 => 통신방법에 따라 보내는 형태가 다름 주의!
- MainActivity.java : onCreate() 메소드 안에 소스코드가 길면 개인적으로 가독성이 좋지 않은것 같아서 메소드를 따로 만들어서 작성하는 편이다. 그리고 버튼이 비슷한 동작을 할 때에는 아래 코드처럼 클릭리스너를 implements해서 작성한다. 상황에 따라 본인이 알맞게 쓰시길... 코드스타일 굳히기가 너무 어렵다 ㅠ
여기까지 앱에서 동작하는 부분은 완료! 다음 포스팅에서 각각의 버튼에 따라 동작하는 node.js 서버를 만들어보자. |