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