Skip to content

rezaulkhan111/Android-WebSocketClient

 
 

Repository files navigation

Android WebSocket & WebRTC 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

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Kotlin 100.0%