热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UDP通讯winform成功;WPF界面接收无响应,假死,并且服务器和客户端互相接收不到消息

UDP通讯winform成功;WPF界面接收卡死,并且客户端接收不到用winform做的界面客户端和服务器端可以成功接收和显示服务器端usingSy

UDP通讯 winform成功; WPF界面接收卡死,并且客户端接收不到

用winform做的界面客户端和服务器端可以成功接收和显示

服务器端
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace comunication
{
public partial class Form1 : Form
{
//bool IsUDPStart = false;
Thread thread;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e){thread = new Thread(ServerMethod);//创建线程thread.Start();textBox1.Text = "服务器已启动"; }private void ServerMethod(){int recv; //接收到的字符数byte[] revData = new byte[1024]; //接受缓存区byte[] sendData = new byte[1024]; //发送缓存区IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999); //本地IPEndPoint remote = (EndPoint)(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9998)); //远程IPSocket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //创建套接字try{sock.Bind(ip); //绑定IPwhile (true){recv = sock.ReceiveFrom(revData, ref remote);string type = Encoding.Unicode.GetString(revData, 0, recv);textBox2.Text = type;//发送信息sendData = Encoding.Unicode.GetBytes(textBox3.Text);sock.SendTo(sendData, sendData.Length, SocketFlags.None, remote);}}catch{sock.Close();}}private void button2_Click(object sender, EventArgs e){thread.Abort();textBox1.Text = "服务器已关闭";}
}

}

客户端
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace comunication
{
public partial class Form1 : Form
{
//bool IsUDPStart = false;
Thread thread;
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e){thread = new Thread(ServerMethod);//创建线程thread.Start();textBox1.Text = "服务器已启动";}private void ServerMethod(){int recv; //接收到的字符数byte[] revData = new byte[1024]; //接受缓存区byte[] sendData = new byte[1024]; //发送缓存区IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999); //本地IPEndPoint remote = (EndPoint)(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9998)); //远程IPSocket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //创建套接字try{sock.Bind(ip); //绑定IPwhile (true){recv = sock.ReceiveFrom(revData, ref remote);string type = Encoding.Unicode.GetString(revData, 0, recv);textBox2.Text = type;//发送信息sendData = Encoding.Unicode.GetBytes(textBox3.Text);sock.SendTo(sendData, sendData.Length, SocketFlags.None, remote);}}catch{sock.Close();}}private void button2_Click(object sender, EventArgs e){thread.Abort();textBox1.Text = "服务器已关闭";}
}

}

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

wpf代码和winform中一样,但是在运行时会出现

下面图中所示,界面卡死。并且服务器端接收不到客户端发送的消息
在这里插入图片描述
20210420记录问题
20210420下午将其解决
客户端 (txtSend发送数据控件名,txtReceive发送数据控件名称,send_click发送按钮事件)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;namespace 连接
{///

/// MainWindow.xaml 的交互逻辑/// public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}//与服务器通信,获取所需信息private string ReadServer(string name){string retValue = "";int recv; //接收到的字符数byte[] revData = new byte[1024]; //接受缓存区byte[] sendData = new byte[1024]; //发送缓存区IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9998); //本地IP和端口EndPoint Remote = (EndPoint)(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999)); //远程IP和端口Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //创建套接字try{sock.Bind(ip); //绑定IP//发送请求sendData = Encoding.Unicode.GetBytes(name);sock.SendTo(sendData, sendData.Length, SocketFlags.None, Remote);//接受数据并转换成相应的类型 recv = sock.ReceiveFrom(revData, ref Remote);retValue = Encoding.Unicode.GetString(revData);}catch{sock.Close();}//关闭套接字sock.Close();return retValue;}private void send_click(object sender, RoutedEventArgs e){txtReceive.Text = ReadServer(txtSend.Text);}}
}

服务器端 控件同上
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Server
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window
{
Thread thread;

public MainWindow(){InitializeComponent();}private void ServerMethod(){int recv; //接收到的字符数byte[] revData = new byte[1024]; //接受缓存区byte[] sendData = new byte[1024]; //发送缓存区IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999); //本地IPEndPoint remote = (EndPoint)(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9998)); //远程IPSocket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //创建套接字try{sock.Bind(ip); //绑定IPwhile (true){recv = sock.ReceiveFrom(revData, ref remote);string type = Encoding.Unicode.GetString(revData, 0, recv);this.Dispatcher.Invoke(new Action(() =>{txtReceive.Text = type;}));Thread.Sleep(500);this.Dispatcher.Invoke(new Action(() =>{//发送信息sendData = Encoding.Unicode.GetBytes(txtSend.Text);sock.SendTo(sendData, sendData.Length, SocketFlags.None, remote);}));Thread.Sleep(500);}}catch{sock.Close();}}private void btn_start_click(object sender, RoutedEventArgs e){txtfuwuqi.Text = "服务器已启动";//将问题代码块放入此函数中thread = new Thread(ServerMethod);//创建线程//thread.IsBackground = true;thread.Start();Thread.Sleep(500);
}

}
分析在做wpf实现UDP过程中出现的问题:
1、互相接收不到对方发送的消息
2、界面假死
第一个问题:
因为没有在Server程序中加入委托,导致UI界面中的控件无法和后台交互,在服务器代码中加入委托即可:

this.Dispatcher.Invoke(new Action(() =>{txtReceive.Text = type;}));Thread.Sleep(500);this.Dispatcher.Invoke(new Action(() =>{//发送信息sendData = Encoding.Unicode.GetBytes(txtSend.Text);sock.SendTo(sendData, sendData.Length, SocketFlags.None, remote);}));Thread.Sleep(500);

第二个问题:
界面无响应,如上图中所示,这时的服务器端可以接收到客户端的消息。但是如果输入消息,界面就会卡死。
因此将服务器中的代码

this.Dispatcher.Invoke(new Action(() =>{recv = sock.ReceiveFrom(revData, ref remote);string type = Encoding.Unicode.GetString(revData, 0, recv);txtReceive.Text = type;}));

修改成

recv = sock.ReceiveFrom(revData, ref remote);string type = Encoding.Unicode.GetString(revData, 0, recv);this.Dispatcher.Invoke(new Action(() =>{txtReceive.Text = type;}));

即可,不知道什么原因,试出来的。如果哪位仁兄愿意指导指导,请赐教


推荐阅读
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
author-avatar
jlxx19_937
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有