본문 바로가기

안드로이드 스튜디오

[안드로이드 스튜디오 코틀린] WebSocket Server 생성하기

728x90
반응형

 

 

 

 

 

 

 

 

https://github.com/TooTallNate/Java-WebSocket

 

GitHub - TooTallNate/Java-WebSocket: A barebones WebSocket client and server implementation written in 100% Java.

A barebones WebSocket client and server implementation written in 100% Java. - GitHub - TooTallNate/Java-WebSocket: A barebones WebSocket client and server implementation written in 100% Java.

github.com

 

위 라이브러리를 사용하여 소켓서버를 만들어보자

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

 

 

이렇게 퍼미션을 주고

 

 

 

 

 

 

 

 

 

 

 

 

 

private fun getIPAddress(): String {
    try {
        val interfaces = NetworkInterface.getNetworkInterfaces()
        while (interfaces.hasMoreElements()) {
            val networkInterface = interfaces.nextElement()
            val addresses = networkInterface.inetAddresses
            while (addresses.hasMoreElements()) {
                val address = addresses.nextElement()
                if (!address.isLoopbackAddress && address.hostAddress.indexOf(':') < 0) {
                    return address.hostAddress
                }
            }
        }
    } catch (e: SocketException) {
        e.printStackTrace()
    }
    return ""
}

 

 

위 함수로 내 ip 주소를 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

확인한 ip + 연결한 포트 번호를 부여하여

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이렇게 넣어서  연결해 주면

 

 

 

 

 

 

 

 

위처럼 로그로 연결된 주소를 볼 수 있고

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Send를 눌러 보내주면

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이렇게 잘 뜨는 것을 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

바인딩을 통해 받아온 메시지를 mainactivity textview에 보여주면 위처럼 잘 받아오는 것을 볼 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

총 코드

 

 

MainActivity.kt

 

import android.Manifest
import android.content.pm.PackageManager
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.annotation.RequiresApi
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.example.socketservertest.databinding.ActivityMainBinding
import org.java_websocket.server.WebSocketServer

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private lateinit var webSocketServer: WebSocketServer

    @RequiresApi(Build.VERSION_CODES.TIRAMISU)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        checkPermissions()

        val port = 3000

        webSocketServer = WebSocketService(port, this)
        webSocketServer.start()
    }

    fun updateMessage(message: String) {
        runOnUiThread {
            binding.textView.text = message
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        webSocketServer.stop()
    }

    @RequiresApi(Build.VERSION_CODES.TIRAMISU)
    private fun checkPermissions() {
        val arrayPermission = arrayOf(
            Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.CHANGE_NETWORK_STATE,
            Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.CHANGE_WIFI_STATE,
 )

        val permission = mutableMapOf<String, String>()
        permission["NETWORKSTATE"] = Manifest.permission.ACCESS_NETWORK_STATE
        permission["CHANGENETWORKSTATE"] = Manifest.permission.CHANGE_NETWORK_STATE
        permission["ACCESSWIFI"] = Manifest.permission.ACCESS_WIFI_STATE
        permission["CHANGEACCESSWIFI"] = Manifest.permission.CHANGE_WIFI_STATE

        val denied = permission.count { ContextCompat.checkSelfPermission(this, it.value) == PackageManager.PERMISSION_DENIED }

        if (denied > 0) {
            requestPermissions(permission.values.toTypedArray(), 100)
        } else {
            ActivityCompat.requestPermissions(this, arrayPermission, 400)
        }
    }
}

 

 

 

 

 

 

 

WebSocketService.kt

 

import android.util.Log
import org.java_websocket.WebSocket
import org.java_websocket.handshake.ClientHandshake
import org.java_websocket.server.WebSocketServer
import java.lang.Exception
import java.net.InetSocketAddress
import java.net.NetworkInterface
import java.net.SocketException

class WebSocketService(port: Int, private val activity: MainActivity): WebSocketServer(InetSocketAddress(port)) {

    override fun onOpen(conn: WebSocket?, handshake: ClientHandshake?) {
        Log.d("WebSocket", "onOpen : ${conn?.remoteSocketAddress?.address}")
    }

    override fun onClose(conn: WebSocket?, code: Int, reason: String?, remote: Boolean) {
        Log.d("WebSocket", "onClose: $code $reason")

        conn?.close()
    }

    override fun onMessage(conn: WebSocket?, message: String?) {
        Log.d("WebSocket", "onMessage: $message")

        activity.updateMessage(message ?: "")
        conn?.send(message)
    }

    override fun onError(conn: WebSocket?, ex: Exception?) {
        Log.e("WebSocket", "onError", ex)

        conn?.close()
    }

    override fun onStart() {
        Log.d("WebSocket", "onStart")

        val ip = getIPAddress()
        Log.e("IP", "IP : $ip")
    }

    // 내 Ip 주소를 가져옴 -> ex) 192.168.0.* 애뮬레이터 : 10.0.2.*
    private fun getIPAddress(): String {
        try {
            val interfaces = NetworkInterface.getNetworkInterfaces()
            while (interfaces.hasMoreElements()) {
                val networkInterface = interfaces.nextElement()
                val addresses = networkInterface.inetAddresses
                while (addresses.hasMoreElements()) {
                    val address = addresses.nextElement()
                    if (!address.isLoopbackAddress && address.hostAddress.indexOf(':') < 0) {
                        return address.hostAddress
                    }
                }
            }
        } catch (e: SocketException) {
            e.printStackTrace()
        }
        return ""
    }

}

 

 

 

 

 

 

 

 

 

728x90
반응형