20202421 2023-2024-2 《移动平台开发与实践》第4次作业

20202421秦朗 2024-06-29 13:45:15

20212307 2023-2024-2 《移动平台开发与实践》第4次作业

1.实验内容

1.1socket通信

Socket通信是一种网络通信方式,它允许两台主机或设备之间进行双向的数据交换。具体来说,Socket可以看作是网络通信过程中端点的抽象表示。
Socket的主要特点包括:
通信协议:Socket可以基于不同的通信协议进行数据传输,例如TCP/IP、UDP等。
通信模型:Socket可以支持不同的通信模型,如面向连接的流式Socket(如TCP)和无连接的数据报式Socket(如UDP)。
客户端-服务器模型:Socket通常用于实现客户端-服务器模型,其中客户端应用程序通过Socket与服务器进行通信。
端口号:Socket通过端口号来标识应用程序的通信端口,以便不同的应用程序能够同时在同一台主机上进行网络通信。
Socket通信原理主要涉及客户端和服务端两个方面。首先,在服务器端创建一个服务器套接字(ServerSocket),并把它附加到一个端口上,服务器从这个端口监听连接。然后,客户端创建一个Socket对象,指定要连接的服务器和端口号,向服务器发送连接请求。服务器收到连接请求后,创建一个Socket对象与客户端进行通信。

2.实验过程

2.1服务端实现

2.1.1创建一个新的Android项目,命名为Server并添加INTERNET权限

<uses-permission android:name="android.permission.INTERNET" />

2.1.2编写服务端代码

2.1.2.1布局文件

使用下列Android UI 元素:TextView:用于显示从用户端接收到的消息;EditText:用于输入发送给用户端文本消息的文本框;Button:用于发送消息的按钮;

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/textView2307"
        android:layout_width="300dp"
        android:layout_height="100dp"
        android:textSize="30sp" />
    <EditText
        android:id="@+id/editText"
        android:layout_width="300dp"
        android:layout_height="100dp"/>
    <Button
        android:id="@+id/sendButton"
        android:layout_width="300dp"
        android:layout_height="100dp"
        android:layout_marginTop="20dp"
        android:text="from Server to Client"/>
</LinearLayout>

2.1.2.2Server类

  使用acceptClients()它用于在服务器端启动一个线程,用于接受客户端的连接,然后创建一个 ServerSocket 对象,用于监听指定端口上的客户端连接。再通过一个 while 循环来多次接受客户端的连接,直到服务器关闭。最后,在 finally 块中关闭了服务器套接字,确保在服务器关闭时资源得到正确释放。handleClient函数首先获取客户端的输入流和输出流,用于接收客户端发送的消息和向客户端发送响应消息,然后通过一个 while 循环来持续读取客户端发送的消息,直到客户端关闭连接或发送了终止消息。如果需要向客户端发送响应消息,则会等待 hint 标志的改变,一旦有新的消息需要发送,则将消息写入输出流。最后,在 finally 块中关闭了客户端套接字。

fun acceptClients(messageListener: (String) -> Unit) {
        Thread {
            try {
                serverSocket = ServerSocket(port)
                isServerRunning = true
                while (isServerRunning) {
                    val clientSocket = serverSocket!!.accept()
                    handleClient(clientSocket, messageListener)
                }
                outputStream.flush()
            } catch (e: IOException) {
                e.printStackTrace()
            } finally {
                // 关闭服务器套接字
                serverSocket?.close()
            }
        }.start()
    }

    // 处理客户端连接
    private fun handleClient(clientSocket: Socket, messageListener: (String) -> Unit) {
        Thread {
            try {
                val inputStream: InputStream = clientSocket.getInputStream()
                val outputStream: OutputStream = clientSocket.getOutputStream()
                val bufferedReader = BufferedReader(InputStreamReader(inputStream))
                val printWriter = PrintWriter(outputStream, true)

                var inputLine: String?
                while (bufferedReader.readLine().also { inputLine = it } != null) {                // 读取客户端消息
                    messageListener.invoke(inputLine ?: "")
                    var response: String
                    while (hint == 0) {
                        Thread.sleep(3000)
                    }
                    response = ServerMessage.toString()
                    hint = 0
                    printWriter.println(response)
                }
            } catch (e: IOException) {
                e.printStackTrace()
            } finally {
                // 关闭客户端套接字
                clientSocket.close()
            }
        }.start()
    }

2.1.2.3Mainactivity

package com.example.server

import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    private val server = Server(2307)
    private lateinit var editText: EditText
    private lateinit var sendButton: Button
    private lateinit var textView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        initViewReferences()
        setupServer()
        setupSendButton()
    }

    private fun initViewReferences() {
        editText = findViewById(R.id.editText)
        sendButton = findViewById(R.id.sendButton)
        textView = findViewById(R.id.textView2307)
    }

    private fun setupServer() {
        server.acceptClients { receivedMessage ->
            runOnUiThread {
                textView.text = receivedMessage
            }
        }
    }

    private fun setupSendButton() {
        sendButton.setOnClickListener {
            val message = editText.text.toString()
            if (message.isNotEmpty()) {
                server.sendMessage(message)
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        server.stopServer()
    }
}

2.2客户端实现

2.2.2编写客户端代码

布局文件与服务器端相同,包含四个 Android UI 元素

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <EditText
        android:id="@+id/Message"
        android:layout_width="300dp"
        android:layout_height="110dp"
        android:textSize="20sp"
        android:textAlignment="center"
        android:layout_below="@id/connect"
        />
    <Button
        android:id="@+id/sendMessage"
        android:layout_width="300dp"
        android:layout_height="110dp"
        android:textAlignment="center"
        android:layout_below="@id/message"
        android:text="sendMessage"/>
    <TextView
        android:id="@+id/textViewExpression"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="25sp"
        android:textAlignment="center"
        android:text="2307Message from server"
        android:padding="16dp" />

    <Button
        android:id="@+id/connect"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAlignment="center"
        android:layout_below="@id/textViewExpression"
        android:text="Server Connect"/>

</LinearLayout>

2.2.3Client类

客户端使用Client类,它用于创建一个客户端连接到指定 IP 和端口的服务器,定义了一个 Socket 属性,用于保存客户端与服务器的连接,连接到本地 IP 地址 127.0.0.1 和端口 2307并且使用线程来于监听从服务器发来的消息,并通过 messageListener 处理这些消息。sendMessage函数接受一个消息字符串作为参数,并将其发送给服务器。disconnect是一个用于断开与服务器连接的函数。它尝试关闭之前建立的 Socket 连接,并捕获可能的异常。在 disconnect 函数中,先检查 socket 是否已经被初始化,然后再尝试关闭连接。这是为了避免在未初始化的情况下关闭 Socket 引发异常。

package com.example.client

import java.io.*
import java.net.Socket

class Client {
    private lateinit var socket: Socket
    
    fun connectToServer(messageListener: (String) -> Unit) {
        try {
            socket = Socket("127.0.0.1", 2307)
            val inputStream = socket.getInputStream()
            val outputStream = socket.getOutputStream()
            val bufferedReader = BufferedReader(InputStreamReader(inputStream))
            PrintWriter(OutputStreamWriter(outputStream), true)

            Thread {
                var inputLine: String?
                while (bufferedReader.readLine().also { inputLine = it } != null) {
                    messageListener.invoke(inputLine ?: "")
                }
            }.start()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    fun sendMessage(message: String) {
        try {
            val printWriter = PrintWriter(socket.getOutputStream(), true)
            printWriter.println(message)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    fun disconnect() {
        if (::socket.isInitialized) socket.close()
    }
}

2.2.4mainactivity

package com.example.client

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
    private lateinit var client: Client

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        client = Client() // Initialize client

        val connectButton = findViewById<Button>(R.id.connect)
        val messageTextView = findViewById<TextView>(R.id.textViewExpression)
        val sendBtn = findViewById<Button>(R.id.sendMessage)
        val sendMessage = findViewById<EditText>(R.id.Message)

        connectButton.setOnClickListener {
            GlobalScope.launch(Dispatchers.IO) {
                client.connectToServer { message ->
                    runOnUiThread {
                        messageTextView.text = message
                    }
                }
            }
        }

        sendBtn.setOnClickListener {
            GlobalScope.launch(Dispatchers.IO) {
                val message: String = sendMessage.text.toString()
                client.sendMessage(message)
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        client.disconnect()
    }
}

3.学习中遇到的问题及解决

1:对client报错

解决方案:配置参数出现错误,在android studio中已有默认参数,不需要再自行添加。

4.学习感悟、思考等

  本次实验对对于两个app实现socket通信进行了实践,考察了socket编程相关的知识,由于我对相关知识了解较少,本节课中完成实验借鉴了很多网络上已有的经验。这让我体会到搜索与应用能力在开发活动中同样十分重要。在日后的学习中我也要加强自己这方面的能力,勇于实践不熟悉的方向,从而解决难题。

...全文
301 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文围绕“基于改进型SVPWM调制的钳位型单相三电平NPC逆变器中点电位平衡”展开仿真研究,系统探讨了如何通过改进的空间矢量脉宽调制(SVPWM)策略有效抑制单相三电平中性点钳位(NPC)逆变器中存在的中点电位漂移问题。研究依托Simulink仿真平台构建系统模型,详细分析了不同调制策略对中点电压波动的影响机制,验证了所提出控制方法在提升输出波形质量、增强系统稳定性方面的有效性。同时,文档附带了多项相关科研主题资源,涵盖多电平逆变器控制、虚拟同步发电机(VSG)、微电网能量管理、信号处理、路径规划、机器学习与深度学习等多个前沿方向,展现了较强的综合性与科研实用价值。; 适合人群:电气工程、自动化、新能源科学与工程、电力电子与电力传动等领域的硕士、博士研究生,以及从事电力系统控制、可再生能源并网技术研究的科研人员与工程技术人员。; 使用场景及目标:① 深入理解三电平NPC逆变器的工作原理及中点电位不平衡的成因与危害;② 掌握改进型SVPWM调制策略的设计思想及其在中点电位控制中的实现路径;③ 利用Simulink搭建电力电子系统仿真模型,开展控制算法的验证与优化;④ 拓展至三相多电平逆变器、VSG构网型控制、微电网协同优化等高级课题的研究与复现。; 阅读建议:建议读者结合Simulink仿真环境进行实操演练,重点关注调制策略中开关状态选择与作用时间分配对中点电荷累积的影响机制。初学者应先夯实传统SVPWM理论基础,再逐步过渡到改进策略的学习;进阶研究者可尝试将该方法推广至多目标协同控制或引入智能优化算法进一步提升动态响应性能。

102

社区成员

发帖
与我相关
我的任务
社区描述
实验报告
android 高校
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧