为什么我的 UDP 客户端/服务器数据报无法进行双向通信?

2024-01-08

我在两个应用程序之间设置了一个简单的 UDP 客户端/服务器数据报:Android-Java-Client 和 Windows-C#-Server。这是我第一次使用 Java 编程和 Android 应用程序,因此解决方案可能是显而易见的。这样我就成功地从客户端向服务器发送了一个数据包。但是,我无法从服务器发送回客户端。

我正在尝试将确认消息从服务器发送回客户端。我尝试将 C# 客户端代码与现有 C# 服务器代码合并,但一旦服务器收到第一条消息,它就会崩溃System.ObjectDisposedException。我删除并重新开始“如果需要,请查看已编辑的内容”。现在,我成功发送到服务器,但没有收到任何内容,Java 客户端也没有显示任何内容。我知道我可以(或者也许应该)使用相同的套接字发送回客户端。我的错误在哪里?请并谢谢。

  • 我尝试把整个NetworkThread in the OnTouchListener
  • 我尝试着崩溃SendUdpMessage()一分为二,一发送,一接收
  • 我尝试了下面的答案

我仍然无法让它工作:(

C# 服务器端:

// This class is responsible of running the server side on the PC. 
class UdpServer
{
    static void Main(string[] args)
    {
        byte[] data = new byte[1024];
        UdpClient serverSocket = new UdpClient(15000);
        int i = 0;

        while (true)
        {
            Console.WriteLine("Waiting for a UDP client...");
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            data = serverSocket.Receive(ref sender);

            string stringData = Encoding.ASCII.GetString(data, 0, data.Length);
            Console.WriteLine("Response from " + sender.Address);
            Console.WriteLine("Message " + i++ + ": " + stringData + "\n");

            // Here I am sending back
            byte[] data2 = Encoding.ASCII.GetBytes("Response");
            serverSocket.Send(data2, 8, sender);
        }

    }
}

Java 客户端: 按钮调用函数来发送 UDP 消息,并将响应分配到全局变量中,然后我尝试通过文本框在屏幕上显示该变量

    public class MainActivity extends AppCompatActivity {

    String message;
    String Response;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Button Declaration
        final TextView TextOne = (TextView) findViewById(R.id.StatusText);
        Button LftBtn = (Button) findViewById(R.id.LeftButton);
        // ...
        // other code here (button declaration and event handlers
        // ...

        // Left Button Click
        LftBtn.setOnTouchListener(
                new Button.OnTouchListener() {
                    public boolean onTouch(View v, MotionEvent event) {
                        if (event.getAction() == MotionEvent.ACTION_DOWN) {
                            //Button pressed
                            TextOne.setText("Left");
                            message = "Left";
                            SendUdpMsg(message);
                            TextOne.setText(Response);
                            return true;
                        } else if (event.getAction() == MotionEvent.ACTION_UP) {
                            //Button released do nothing
                            return true;
                        }
                        return false;
                    }//onTouch
                });//setOnTouchListener
    }

    // This function is responsible for sending a udp packet to a hardCoded IP below. Returns nothing and takes a string(the message) as a parameter.
    public void SendUdpMsg(final String msg)
    {
        Thread networkThread = new Thread() {

            // No local Host 127.0.0.1 in Android
            String host = "192.168.200.3"; // my actual IP
            int port = 15000;
            DatagramSocket dsocket = null;
            String Response = "1";

            public void run() {
                try {
                    // Get the Internet address of the specified host
                    InetAddress address = InetAddress.getByName(host);

                    // wrap a packet
                    DatagramPacket packet = new DatagramPacket(
                            msg.getBytes(),
                            msg.length(),
                            address, port);

                    // Create a datagram socket, send the packet through it, close it.
                    dsocket = new DatagramSocket();
                    dsocket.send(packet);

                    // Here, I am receiving the response?
                    byte[] buffer = new byte[1024];
                    DatagramPacket packet2 = new DatagramPacket(buffer, buffer.length);
                    dsocket.receive(packet2);
                    Response = new String(buffer, 0, packet2.getLength());
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run()
                        {
                            // I can't use this since TextOne is a local variable in the above function
                            //TextOne.setText(Response);
                        }
                    });
                    dsocket.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }//catch
            }//run
        };// Networkthread
        networkThread.start();//networkThread.start() 
    }       
}

网络代码有效,问题是您没有等待响应,即SendUdpMsg方法不能立即返回响应,应该由后台线程推送。例如 :

dsocket.receive(packet2);
Response = new String(buffer, 0, packet2.getLength());

// we received the response
// but since we are running on a background thread, we can not touch the UI
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        // this is executed on the main (UI) thread
        TextOne.setText(Response);                        }
});

dsocket.close();

必须在后台线程上工作并在主线程上处理结果是一种常见模式。 Android 提供了一些工具,例如Handler https://developer.android.com/reference/android/os/Handler.html or 异步任务 https://developer.android.com/reference/android/os/AsyncTask.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 UDP 客户端/服务器数据报无法进行双向通信? 的相关文章

随机推荐

  • 线程在调用 Thread.start 之前开始运行

    t1 threading Thread target self read print something t2 threading Thread target self runChecks args self self read无限期地运行
  • 如果容器宽度、填充和行高已知,如何计算高度?

    我正在向 DOM 动态添加元素 div class entry div text data status appendTo app twitter feed 我想在将元素添加到 DOM 之前获取元素高度 通常的方法是将元素添加到具有相同样式
  • 打印出指定宽度的 ASCII 圆

    我正在尝试更改以下代码 以便得到半径 2 的输出 任何帮助将不胜感激 因为我快要疯了 public class Main public static void main String args dist represents distanc
  • 跨多个容器或父级的 jQuery UI 可排序 div

    我有一个对象列表 它被分成两个容器 我想通过 jQuery 对其进行排序 但我不知道如何使一个对象能够添加到其他容器列表中 反之亦然 因此 我希望能够将一个对象从一个容器拖到另一个容器中 并让代码将其视为一个列表 下面是我的代码
  • 如何在不变得模糊的情况下放大图像

    I have an ImageView that is 32x32 Its a sprite basically But when I go to upscale the image it blurs like this But I wan
  • 如何创建此查询

    如果我需要在选择行中包含两个聚合函数并且每个函数我需要不同的分组依据和位置条件 如何创建查询 在我的示例中 我需要返回玩家名称 以及玩家获胜的次数 可以检查桌面游戏结果 第一中的结果 以及他玩了多少次 但不知道如何处理两个聚合函数 只是我想
  • 为什么 OpenGL 中没有圆形或椭圆形图元?

    圆是基本几何实体之一 然而没有定义原语OpenGL http en wikipedia org wiki OpenGL为此 例如直线或多边形 为什么这样 一直为此包含自定义标头有点烦人 有什么具体原因可以省略吗 虽然圆形可能是基本形状 但在
  • C# WPF MenuItem 自定义模板

    在 Main xaml 中 我有这两个菜单项 第一个带有标题 断开电流 第二个带标题 Quit 更多具有不同标题文本的菜单项 为了编辑第一个项目的一些颜色 我在 App xaml 中创建了一个自定义模板
  • _SESSION 变量不起作用

    我有一个 PHP 脚本 我尝试在 HTML 标头开始之前获取会话变量 如果我使用 SESSION变量位于 HTML 正文中的某个位置 由于某种原因它可以工作 但如果我使用 SESSION变量在 HTML 开始之前 我无法从中获取值 有人知道
  • MapReduce作业的Map阶段的输出总是排序的吗?

    我对从 Mapper 获得的输出有点困惑 例如 当我使用以下输入文本运行一个简单的字数统计程序时 hello world Hadoop programming mapreduce wordcount lets see if this wor
  • Selenium.click 对某些锚元素不起作用

    我正在开发的应用程序最近进行了改进 作为其中的一部分 引入了新的 JQuery 日历 我需要单击日历中的链接来选择时间和日期 但是 Selenium click 不起作用 命令被执行 但屏幕上没有任何反应 为了检查我的 XPATH CSS
  • 如何使用 pg-promise 将 jsonb[] 数据插入列

    给定一个包含 type 列的表jsonb 如何将 json 数组插入到列中 使用提供的格式化程序 array json在这种情况下不起作用 除非我错过了正确的组合或其他东西 const links title IMDB url https
  • bootstrap-typeahead.js 在 select 事件上添加监听器

    我是 Bootstrap Twitter 框架的新手 我需要使用 bootstrap typeahead js 进行自动完成 但我还需要获取用户为 typeahead 选择的值 这是我的代码
  • 对于 std::generate,传递的函数可以使用索引吗?

    问题有点难以表达 所以我将举一个例子 可以说我这样做 generate myvec begin myvec end func 我可以拥有它 以便 function 可以读取生成的索引吗 int func if index lt 2 retu
  • Gson 有类似 @JsonProperty 的方法吗?

    Jackson 有 JsonProperty name 注释 可以应用于方法 方法的返回值将分配给 JSON 中的 name 参数 我发现 Gson 有 SerializedName 注释 但不能与方法一起使用 有没有办法获得 Gson 中
  • 使用嵌入式互操作类型时发出警告

    我最近将我的 C 解决方案之一从 VS2008 更新到 VS 2010 以利用嵌入式互操作类型功能 这样我就可以停止提供目前由于与旧版 VB6 代码库交互而必须使用的互操作库 由于某种原因 我在编译解决方案时收到以下消息 类型库导入程序遇到
  • 带有 GigE 视觉相机的 OpenCV [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • Google 地图 v3 自动刷新 仅标记

    我正在使用 Google 地图 V3 来显示一些图钉 我希望能够刷新标记而不影响您在地图上的位置或缩放级别 我希望标记每 x 秒更新一次 我该怎么做呢 我对 jQuery ajax 没有太多经验 我的地图的工作示例如下 http jsfid
  • Python Pillow 的缩略图方法返回 None

    我有一个小脚本 用于使用 Python 的 Pillow 库批量调整图像大小 该脚本适用于调整大小方法 但是纵横比的变化会扭曲图像 因此我尝试使用缩略图方法测试相同的脚本 我很困惑 因为从文档和其他堆栈问题看来 我可以将调整大小方法替换为缩
  • 为什么我的 UDP 客户端/服务器数据报无法进行双向通信?

    我在两个应用程序之间设置了一个简单的 UDP 客户端 服务器数据报 Android Java Client 和 Windows C Server 这是我第一次使用 Java 编程和 Android 应用程序 因此解决方案可能是显而易见的 这