socket进行服务器和客户端通信

package com.music.mysongs.activity

import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Message
import androidx.annotation.RequiresApi
import kotlinx.android.synthetic.main.activity_lyric.*
import java.io.*
import java.net.Socket

class LyricActivity : Application, Runnable {
    private val mTag = "LyricActivity"

    //Comment model
    private var mSocket: Socket? = null
    private var mRead: BufferedReader? = null
    private var mWrite: PrintWriter? = null
    private val port: Int = 8080
    private val host: String = "192.168.43.164"//"10.20.19.99"
    private val sb = StringBuilder()

    private val myHandler: Handler = Handler {
        //socket model
        txtShowComment_lyric.text = it.obj.toString()
        editSendComment_lyric.setText("")
        false
    }

    @RequiresApi(Build.VERSION_CODES.M)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_lyric) 
        //socket server
        object : Thread() {
            override fun run() {
                try {
                    mSocket = Socket(host, port)
                    mRead = BufferedReader(InputStreamReader(mSocket?.getInputStream(), "UTF-8"))
                    mWrite = PrintWriter(
                        BufferedWriter(
                            OutputStreamWriter(
                                mSocket?.getOutputStream()
                            )
                        ), true
                    )
                } catch (e: IOException) {
                    e.printStackTrace()
                }
            }
        }.start()
        btnSendComment_lyric.setOnClickListener {
            if (editSendComment_lyric.text != null && mSocket!!.isConnected && !mSocket!!.isOutputShutdown) {
                val mSend = editSendComment_lyric.text.toString()
                mWrite!!.println(mSend)
            }
        }
        Thread(this@LyricActivity).start()
    }

    override fun run() {
        try {
            while (true) {
                if (mSocket!!.isConnected && !mSocket!!.isInputShutdown) {
                    if (mRead?.readLine().also { sb.append(it + "\n") } != null) {
                        val msg = Message()
                        msg.obj = sb
                        myHandler.sendMessage(msg)
                    }
                }
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}

1、改成服务器的IP地址和打开的端口号

在这里插入图片描述

2、定义读写数据流

在这里插入图片描述

3、保持socket连接线程的运行start()

在这里插入图片描述

4、监听发送按钮,然后用mWrite写到服务器去

在这里插入图片描述

5、客户端运行的时候用mRead读服务器传送过来的数据,然后放到handler里更新ui

在这里插入图片描述
在这里插入图片描述

6、布局部分

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
    tools:context=".activity.LyricActivity">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            
            <TextView
                android:id="@+id/txtShowComment_lyric"
                 android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="start"  />

            <FrameLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom">

                <EditText
                    android:id="@+id/editSendComment_lyric"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="start"
                    android:inputType="text" />

                <Button
                    android:id="@+id/btnSendComment_lyric"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="end" />
            </FrameLayout>
        </LinearLayout>
</ScrollView>

7、服务器部分

参考这个的server代码
这部分都是通用的,只是ip地址换成自己电脑的,然后打开的端口号和客户端接入的要一致

8、运行

1.先连接上模拟器
2.运行app到模拟手机上
在这里插入图片描述
3.此时run处运行的只有一个app
在这里插入图片描述
4.然后运行server函数的main
在这里插入图片描述
5.此时ChatServer就开始运行了,并且打印了服务器的部分信息
在这里插入图片描述
6.app点击进入聊天室后客户端打印信息
在这里插入图片描述
7.点击发送按钮就可以接收了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值