Newer
Older
WebSocketClientSample / README.md
# WebSocketClientSample

## 概要
ローカルのWebSocketサーバと通信するサンプルアプリ。

## 各ファイルのポイント

### Build.gradle
okhttp3を使うために下の1行を追加、build gradleしておく。

```
dependencies {
	//(省略)

	implementation 'com.squareup.okhttp3:okhttp:4.9.1'
}
```

### AndroidManifest.xml
通信を許可する下の2行を追記。
WebSocket関係なく、通信の際には必要なコード。
```
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
```

以下の android:usesCleartextTraffic="true" を追記。
これもWebSocket関係なく、通信の際には必要なコード。
```
<application
	android:allowBackup="true"
	android:dataExtractionRules="@xml/data_extraction_rules"
	<!--(省略)--> 

	android:usesCleartextTraffic="true" 

	<!--(省略)-->  
	tools:targetApi="31">
```

### 通信部分のコード
メッセージ送ったり、受け取ったりするサンプルコード。
```
class WebSocketClient extends WebSocketListener {
	private WebSocket webSocket; 

	// コンストラクタ 
	public WebSocketClient() { 
		OkHttpClient client = new OkHttpClient(); 

		// 接続先のエンドポイント
		// エミュレータから実行するために、ここではlocalhostとか127.0.0.1ではないことに注意 
		Request.Builder request = new Request.Builder(); 
		request.url("ws://10.0.2.2:8080/demo/WebSocketDemo"); 

		webSocket = client.newWebSocket(request.build(), this); 
	}

	public void send(String message) { 
		System.out.println("send message/ "+message);
		webSocket.send(message); 
	} 

	@Override 
	public void onOpen(WebSocket webSocket, Response response) { 
		// WebSocketと接続できたら呼ばれる 
		System.out.println("WebSocket opened successfully"); 
	}

	@Override 
	public void onMessage(WebSocket webSocket, String text) { 
		// メッセージきたら呼ばれる 
		System.out.println("Received text message/ " + text); 
	} 

	@Override 
	public void onMessage(WebSocket webSocket, ByteString bytes) { 
		// メッセージきたら呼ばれる 
		System.out.println("Received binary message/ " + bytes.hex()); 
	}

	@Override
	public void onClosing(WebSocket webSocket, int code, String reason) { 
		// WebSocketが終了したら呼ばれる 
		webSocket.close(1000, null); 
		System.out.println("Connection closed end/ " + code + reason); 
	} 

	@Override
	public void onFailure(WebSocket webSocket, Throwable t, Response response) { 
		// WebSocketの接続に失敗したら呼ばれる 
		System.out.println("Connection failed/ " + t.getLocalizedMessage()); 
	}

}
```

### メインのコード
```
public class MainActivity extends AppCompatActivity { 
	
	@Override 
	protected void onCreate(Bundle savedInstanceState) { 

		// 省略 

		// さっき作ったやつをインスタンス化してこんな感じで送信できる。 
		WebSocketClient webSocketClient = new WebSocketClient(); 
		webSocketClient.send("Hello from Android"); 
	}

}
```

## 参考
- [AndroidでWebSocket - slideshare](https://www.slideshare.net/kadoppe/androidwebsocket)
- [OkHttp(基本的なGET・POST)- Qiita](https://qiita.com/naoi/items/8d493f00b0bbbf8a666c)
- [AndroidでWebSocket通信 - Zenn](https://zenn.dev/cizneeh/articles/websocket-on-android)