はじめに
サーバ上にデータを渡すとき、ソケットを利用して通信しようとしました。ソケット通信については全くの素人だったので、そのときに重要だなと思ったことをざっくり書いていこうと思います
サンプルコードもありますのでぜひ見てください
通信の手順
- ソケットの生成
socket()
- ソケットの登録
bind()
- 接続準備
listen()
-
java
?kotlin
?上ではlisten関数が見当たらず、、、
- 接続待機
accept()
- 送信/受信
read()
write()
- 通信の終了
close()
基本的には、この6手順でソケットの通信が可能となります
サンプル
ソースコードを見ながら読んでいただけると幸いです
ソケットの生成
val serverSocket = ServerSocket()
ソケットの登録
serverSocket.reuseAddress = true
serverSocket.bind(InetSocketAddress({ポート番号})
- 1行目について、
reuseAddress=true
にすることで、再度同じポート番号を利用できるようになる。これを指定しないと一定時間(OSによる)そのポート番号がつかえなくなる - 2行目について、ポート番号を登録している
接続待機
val socket: Socket = serverSocket.accept()
- 接続要求が来るまで待機する
受信
inputStream = socket.getInputStream()
bufferedReader = BufferedReader(InputStreamReader(inputStream))
while (inputStream.available() == 0) {}
val received = bufferedReader.readLine()
- while文で書かれている内容について、相手がいつデータを送ってくるかわからない。そのため、
available()==0
の間は待ち受けする必要がある
送信
printWriter = PrintWriter(BufferedWriter(OutputStreamWriter(socket.getOutputStream())))
printWriter.println("{送りたい文字列}")
printWriter.flush()
通信の終了
bufferedReader.close()
printWriter.close()
inputStream.close()
socket.close()
- クローズしなければ接続したままになる
- クライアント側、サーバ側のどちらかがクローズした場合、ソケット通信が終了する
さいごに
今回の話とは関係ないのですが、Thread
を使用しています。初めて使ってみたのですが、実行結果が面白いです
参考までに
わかりにくいですが、ログの最後に書かれている数字が1つのThreadとして対応しています。待ち受けた順番と処理が終わった順番が異なっているところがわかります
ってだけです