LoginSignup
12
9

More than 5 years have passed since last update.

Kotlinでソケット通信をするサーバを実装する

Posted at

はじめに

サーバ上にデータを渡すとき、ソケットを利用して通信しようとしました。ソケット通信については全くの素人だったので、そのときに重要だなと思ったことをざっくり書いていこうと思います
サンプルコードもありますのでぜひ見てください

通信の手順

  • ソケットの生成
    • socket()
  • ソケットの登録
    • bind()
  • 接続準備
    • listen()
    • java?kotlin?上ではlisten関数が見当たらず、、、
  • 接続待機
    • accept()
  • 送信/受信
    • read()
    • write()
  • 通信の終了
    • close()

基本的には、この6手順でソケットの通信が可能となります

サンプル

ソースコードを見ながら読んでいただけると幸いです
- tuvy22686/Socket-Server
- tuvy22686/Socket-Client

ソケットの生成

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を使用しています。初めて使ってみたのですが、実行結果が面白いです
参考までに
スクリーンショット 2018-10-30 18.45.21.png
わかりにくいですが、ログの最後に書かれている数字が1つのThreadとして対応しています。待ち受けた順番と処理が終わった順番が異なっているところがわかります
ってだけです

参考

12
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9