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 ""
}
}
'안드로이드 스튜디오' 카테고리의 다른 글
[안드로이드 스튜디오 코틀린] 상단바(Status Bar) 투명하게 만들기 (0) | 2023.08.22 |
---|---|
[안드로이드 스튜디오 코틀린] ProgressBar 색상 설정 (0) | 2023.08.22 |
[안드로이드 스튜디오 코틀린] 내부 저장소 용량, 사용 가능한 용량 구하는 예제 (0) | 2023.06.22 |
[안드로이드 스튜디오 코틀린] 와이파이 이름, 와이파이 세기 , calculateSignalLevel 사용 (0) | 2023.06.22 |
[안드로이드 스튜디오 코틀린] 버튼 누르면 다른 앱으로 이동하기, getLaunchIntentForPackage not working (0) | 2023.06.13 |