이번에는 안드로이드 클라이언트를 만들어 보자. 쉽게 할 수 있는 방법을 찾아 보니 딱히 없다. 기본으로 제공하는게 없는 모양이다. 못 찾아서 그럴수도 …
그래서 웹소켓 라이브러리를 이용하기로 했다. 먼저 gradle에 추가해 주자.
implementation 'com.neovisionaries:nv-websocket-client:2.4'
레이아웃은 간단히 응답 메세지를 출력할 텍스트뷰를 배치하고 그 밑에 두개의 버튼을 추가하였다.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_result"
android:textSize="24dp"
android:textColor="@color/colorAccent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="66dp"
android:text="TextView" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginStart="76dp"
android:layout_marginTop="157dp"
android:text="Red" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/button"
android:layout_alignParentEnd="true"
android:layout_marginEnd="77dp"
android:text="Green" />
</RelativeLayout>
이제 메인액티비에 코드를 작성하자.
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
Button bt_red, bt_green;
TextView result;
WebSocket ws = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebSocketFactory factory = new WebSocketFactory().setConnectionTimeout(5000);
try{
ws = factory.createSocket("ws://server_ip:port"); //''로 하면 에러남 이런 아니 왜?
ws.addListener(new WebSocketAdapter(){
@Override
public void onTextMessage(WebSocket websocket, String text) throws Exception {
super.onTextMessage(websocket, text);
Log.d(TAG, "received: " + text);
//응답받은 것을 화면에 출력
result.setText(text);
}
});
ws.connectAsynchronously();
} catch (Exception e) {
e.printStackTrace();
}
bt_red = (Button) findViewById(R.id.button);
bt_green = (Button) findViewById(R.id.button2);
result = (TextView) findViewById(R.id.tv_result);
bt_red.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendMessage(view, "red");
}
});
bt_green.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendMessage(view, "green");
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
if(ws != null){
ws.disconnect();
ws = null;
}
}
public void sendMessage(View view, String message) {
if(ws.isOpen()){
ws.sendText(message);
}
}
}