Android WebSocket Client With Kotlin

Android WebSocket Client With Kotlin.
Web Socket Clinet Side For Android With Kotlin you can use this app with Ktor Server Side, Find Ktor Project Here: Ktor WebSocket Server Side
App Preview
Usage
add this line into your build.gradle
app.
dependencies {
implementation 'org.java-websocket:Java-WebSocket:1.4.0'
}
Add This Code In MainActivity
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import com.encept.websocket_client.databinding.ActivityMainBinding
import java.net.URI
import java.util.*
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var webSocketClient: ChatWebSocketClient
private var AL: ArrayList<HashMap<String, Any>> = ArrayList()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val btnSend = binding.btnSend
val editMsg = binding.editMsg
val listview1 = binding.listview1
// load server url from strings.xml
val serverUri = URI(getString(R.string.server_url))
webSocketClient = ChatWebSocketClient(serverUri) { message ->
// display incoming message in ListView
runOnUiThread {
run {
val _item = HashMap<String, Any>()
_item["message"] = message
AL.add(_item)
}
listview1.adapter = Listview1Adapter(AL)
}
}
// connect to websocket server
webSocketClient.connect()
btnSend.setOnClickListener {
try {
// send message to websocket server
webSocketClient.sendMessage(editMsg.text.toString())
editMsg.setText("")
} catch (e: Exception) {
e.printStackTrace()
Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show()
}
}
}
override fun onDestroy() {
super.onDestroy()
// close websocket connection
webSocketClient.close()
}
class Listview1Adapter(private val _data: ArrayList<HashMap<String, Any>>) : BaseAdapter() {
override fun getCount(): Int {
return _data.size
}
override fun getItem(_index: Int): HashMap<String, Any> {
return _data[_index]
}
override fun getItemId(_index: Int): Long {
return _index.toLong()
}
override fun getView(_position: Int, _v: View?, _container: ViewGroup?): View? {
val _inflater = LayoutInflater.from(_container?.context)
var _view = _v
if (_view == null) {
_view = _inflater.inflate(R.layout.cul, _container, false)
}
val text2 = _view?.findViewById<TextView>(R.id.text2)
if (text2 != null) {
text2.text = _data[_position]["message"].toString()
}
return _view
}
}
}
then, add this code at activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:id="@+id/linear2"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical"
android:padding="4dp">
<ListView
android:id="@+id/listview1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:choiceMode="none"
android:padding="8dp"/>
</LinearLayout>
<LinearLayout
android:id="@+id/linear1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="2dp">
<EditText
android:id="@+id/edit_msg"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="@string/enter_message"
android:importantForAutofill="no"
android:padding="8dp"
android:textColor="#000000"
android:textColorHint="#607D8B"
android:textSize="12sp"
tools:ignore="TextFields" />
<Button
android:id="@+id/btnSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:text="@string/send"
android:textColor="#FFFFFF"
android:textSize="16sp" />
</LinearLayout>
now we need to create listview custom view, create new xml called custom.xml
and add this code
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:orientation="horizontal"
tools:ignore="UselessParent">
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="text"
android:textSize="16sp"
android:textStyle="bold"
android:textColor="#000000"/>
</LinearLayout>
</LinearLayout>
after that, Create Kotlin Class Called ChatWebSocketClient
import org.java_websocket.client.WebSocketClient
import org.java_websocket.handshake.ServerHandshake
import java.net.URI
// initialize websocket client
class ChatWebSocketClient(serverUri: URI, private val messageListener: (String) -> Unit) : WebSocketClient(serverUri) {
override fun onOpen(handshakedata: ServerHandshake?) {
// When WebSocket connection opened
}
override fun onClose(code: Int, reason: String?, remote: Boolean) {
// When WebSocket connection closed
}
override fun onMessage(message: String?) {
// When Receive a message
messageListener.invoke(message ?: "")
}
override fun onError(ex: Exception?) {
// When An error occurred
}
fun sendMessage(message: String) {
send(message)
}
}
Features
- Realtime Message with 40ms ping.
- 100% Kotlin Code On Client Side & Server Side.
- Source Code Is Compatible with any IDE
- Clean & Simple Code
License
- All Copyright Saved By Jetbrains.
- Apache License