【问题标题】:Is there a way to send and receive message from android app(server) to PC(client) using sockets有没有办法使用套接字从 android 应用程序(服务器)向 PC(客户端)发送和接收消息
【发布时间】:2020-12-17 10:23:53
【问题描述】:

我会尽力解释一切。

描述: 开发一个用 kotlin 编写的充当服务器端的 android 应用程序和充当客户端的 Python 程序都在同一台计算机上运行,​​并尝试相互发送和接收消息。我正在使用文本视图来显示我从 PC(python) 接收到的消息。

问题: 每当我尝试运行客户端程序时,如果我使用 client_socket.connect(('10.0.2.2',5000)) 或它给了我错误:61 连接被拒绝 如果我尝试使用 ip 地址 client_socket.connect(('127.0.0.1',5000))

连接它

我尝试过的内容:我已经编写了下面编写的两个程序,但不知道我使用的 IP 地址是错误的还是其他的。而且我使用了 IP模拟器 10.0.2.15 的地址,但没有任何效果。

服务器

package com.example.soundsource

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import android.widget.Button
import android.widget.TextView
import java.net.ServerSocket
import java.net.Socket
import java.io.*





class MainActivity : AppCompatActivity() {



    private lateinit var textView:TextView

    companion object{
        const val COMMUNICATIONPORT = 6000
        private lateinit var serversocket:ServerSocket
        private lateinit var serverThread:Thread
        private lateinit var updateConversationHandler:Handler
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val sendButton:Button = findViewById(R.id.send_button)
        val showLocation = findViewById(R.id.show_location) as? Button
        showLocation?.setOnClickListener {
            val intent = Intent(this,SoundLocation::class.java)
            startActivity(intent)
        }
        textView = findViewById(R.id.text_view)
        sendButton.setOnClickListener{
            serverThread = Thread(ServerThread())
            serverThread.start()
        }
    }

    class ServerThread:Runnable{
        override fun run() {
            var socket: Socket
            try {
                serversocket = ServerSocket(COMMUNICATIONPORT)

            } catch (e:IOException) {
                e.printStackTrace()
            }

            while (!Thread.currentThread().isInterrupted) {

                try {

                    socket = serversocket.accept()

                    val commThread = CommunicationThread(socket)
                    Thread(commThread).start()

                } catch (e: IOException) {
                    e.printStackTrace()
                }

            }
        }
    }


    class CommunicationThread(private val clientSocket: Socket) : Runnable {

        private var input: BufferedReader? = null
        private var output:PrintWriter? = null

        init {

            try {

                this.input = BufferedReader(InputStreamReader(this.clientSocket.getInputStream()))
                this.output = PrintWriter(clientSocket.getOutputStream())

            } catch (e: IOException) {
                e.printStackTrace()
            }

        }

        override fun run() {

            while (!Thread.currentThread().isInterrupted) {

                try {
                    output!!.write("Thanks for connecting with me.....")
                    val read = input!!.readLine()

                    updateConversationHandler.post(MainActivity().UpdateUIThread(read))

                } catch (e: IOException) {
                    e.printStackTrace()
                }

            }
        }

    }

    internal inner class UpdateUIThread(private val msg: String) : Runnable {

        override fun run() {
            val message =  "Client Says: $msg \n"
            textView.text = message
        }
    }

}

客户

import socket


def main():
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print("creating client socket.....")
    client_socket.connect(('10.0.2.2', 6000))
    print("successfully connected.....")
    while True:
        data = client_socket.recv(1024).decode()
        print("server sent something.....\n", data)
        print("you are about to.....")
        client_socket.send("hey server....".encode())


main()

【问题讨论】:

标签: python android sockets server client


【解决方案1】:

在模拟器上运行服务器并尝试从电脑连接非常复杂,因为您必须进行网络重定向。

您可以在这里阅读所有内容:https://developer.android.com/studio/run/emulator-networking

您最好使用 Android 手机来运行您的 Android 服务器应用程序。

简单得多。

10.0.2.2 只能用于模拟器上的客户端,该客户端尝试与运行模拟器的同一台机器上运行的服务器连接。

【讨论】:

    【解决方案2】:

    Android 模拟器是喜怒无常的。您必须在环回接口上转发连接请求。不完全确定在模拟器之外获取 ping 以进行托管是如何工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      相关资源
      最近更新 更多