WebSocket in Android
In modern mobile apps, real-time data transfer is no longer a luxury — it’s a necessity. Whether you’re building a chat app, live sports updates, stock market feeds, or collaborative tools, you need something faster and more persistent than REST APIs.
What are WebSockets?
WebSocket is a communication protocol that provides full-duplex (two-way) communication channels over a single TCP connection.
Unlike REST APIs, which work on request-response, WebSocket provides persistent connections. This means both client and server can send data anytime — without waiting for a request.
Why Use WebSocket in Android?
Here are some use-cases where WebSocket is a perfect fit:
How WebSocket Works
WebSocket in Android — Using okHttp
We will use OkHttp by Square — a popular library for HTTP and WebSocket in Android.
Step 1: Add Dependencies
// In app/build.gradle
implementation("com.squareup.okhttp3:okhttp:4.12.0")
Step 2: Create WebSocket Listener
class EchoWebSocketListener : WebSocketListener() {
override fun onOpen(webSocket: WebSocket, response: Response) {
Log.d("WebSocket", "Connected")
webSocket.send("Hello from Android!")
}
override fun onMessage(webSocket: WebSocket, text: String) {
Log.d("WebSocket", "Message Received: $text")
}
override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {
webSocket.close(1000, null)
Log.d("WebSocket", "Closing: $code $reason")
}
override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {
Log.e("WebSocket", "Error: ${t.message}")
}
}
Step 3: Connect to WebSocket Server
fun startWebSocket() {
val client = OkHttpClient()
val request = Request.Builder()
.url("wss://echo.websocket.org") // Replace with your server
.build()
val listener = EchoWebSocketListener()
val ws = client.newWebSocket(request, listener)
client.dispatcher.executorService.shutdown()
}
Real-World Example: Live Chat App
Let’s simulate a real-time chat system. In a real app, you’ll have a backend like Node.js, Spring Boot, or Firebase handling the WebSocket server.
Features:
Reconnection Strategy (Advanced)
class ReconnectingWebSocket(
private val url: String,
private val listener: WebSocketListener
) {
private var webSocket: WebSocket? = null
private val client = OkHttpClient()
private var retryCount = 0
fun connect() {
val request = Request.Builder().url(url).build()
webSocket = client.newWebSocket(request, object : WebSocketListener() {
override fun onOpen(ws: WebSocket, response: Response) {
retryCount = 0
listener.onOpen(ws, response)
}
override fun onFailure(ws: WebSocket, t: Throwable, response: Response?) {
listener.onFailure(ws, t, response)
retryCount++
Handler(Looper.getMainLooper()).postDelayed({
connect()
}, (1000L * retryCount).coerceAtMost(10000L))
}
override fun onMessage(ws: WebSocket, text: String) {
listener.onMessage(ws, text)
}
override fun onClosing(ws: WebSocket, code: Int, reason: String) {
listener.onClosing(ws, code, reason)
}
})
}
fun send(message: String) {
webSocket?.send(message)
}
fun close() {
webSocket?.close(1000, null)
}
}
Handling WebSocket in ViewModel with LiveData (MVVM)
class ChatViewModel : ViewModel() {
private val _chatMessages = MutableLiveData<String>()
val chatMessages: LiveData<String> = _chatMessages
private lateinit var webSocket: WebSocket
fun initWebSocket() {
val client = OkHttpClient()
val request = Request.Builder().url("wss://echo.websocket.org").build()
webSocket = client.newWebSocket(request, object : WebSocketListener() {
override fun onMessage(webSocket: WebSocket, text: String) {
_chatMessages.postValue(text)
}
})
}
fun sendMessage(msg: String) {
webSocket.send(msg)
}
override fun onCleared() {
webSocket.close(1000, null)
super.onCleared()
}
}
What Happens Internally When You Connect via WebSocket?
Security Considerations
Testing Tools for WebSocket
Common Errors & Fixes
How Server and Android Work Together
Real-World Example:
Imagine a chat app — Anand sends a message on his Android phone, and instantly, the message appears on his friend’s device.
That’s WebSocket at work.
Server Responsibilities in WebSocket
1. Accept the Connection
When the Android app connects to ws://yourserver.com, the WebSocket server:
2. Authenticate the User
Since WebSockets don’t have built-in login, we do manual authentication:
Example: Android → { "type": "auth", "token": "abc.jwt.token" } Server → verifies → adds user to map
3. Handle Messages (Send / Receive)
Once authenticated:
Key Idea: WebSocket message = small JSON string with a “type”
Recommended by LinkedIn
4. Disconnect Handling
When a user leaves the app or disconnects:
WebSocket Server Architecture (Concept)
Map of Connected Users
The server keeps a list like this in memory:
{
"anand123": WebSocketConnectionObject,
"john456": WebSocketConnectionObject
}
This way, it knows:
Heartbeat / Ping-Pong (In Production)
To ensure users are still connected:
This prevents memory waste from dead connections.
Authentication with JWT
Why JWT?
Flow:
Full Flow Diagram (Android to Server)
Why “WebSocket Connection Timeout” Happens in Android
1. Server is not reachable
Solution: Make sure server is up, correct IP/port, and firewall is not blocking it
2. Wrong URL / DNS not resolving
Try opening the URL in WebSocket testing tools like WebSocket King to confirm it’s reachable.
3. SSL (wss) issues
Solution: Use a valid HTTPS SSL certificate (e.g., from Let’s Encrypt) Or test with ws:// on development (not production)
4. Port Blocked by Firewall / Network
Try using common ports like 443 or 80
5. Client Timeout (Android SDK/WebSocket Lib)
Solution: Increase timeout in your code:
val client = OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS) // Increase timeout
.build()
6. Poor or Lost Network
Check network status before attempting connection:
fun isNetworkAvailable(context: Context): Boolean {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val network = cm.activeNetwork
val capabilities = cm.getNetworkCapabilities(network)
return capabilities?.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) == true
}
7. Trying to connect from emulator with localhost
Avoid WebSocket Timeout
Summary
WebSocket opens a world of real-time features in Android that REST APIs can’t match. With proper architecture (like MVVM), reconnection logic, and secure authentication — you can build blazing fast, interactive apps.
Thank you for reading. 🙌🙏✌.
Found this helpful? Don’t forgot to clap 👏 and follow me for more such useful articles about Android development and Kotlin or buy us a coffee here ☕
If you need any help related to Android, Kotlin. I’m always happy to help you.
Follow me on:
Insightful