热门标签 | 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;}));

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


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • SQL Server 2008 到底需要使用哪些端口?
    SQLServer2008到底需要使用哪些端口?-下面就来介绍下SQLServer2008中使用的端口有哪些:  首先,最常用最常见的就是1433端口。这个是数据库引擎的端口,如果 ... [详细]
  • 域名解析系统DNS
    文章目录前言一、域名系统概述二、因特网的域名结构三、域名服务器1.根域名服务器2.顶级域名服务器(TLD,top-leveldomain)3.权威(Authoritative)域名 ... [详细]
  • 实例详解ISA防火墙策略元素
    我们在前面的工作中已经实现了ISA2006的代理服务器功能,接下来我们要实现ISA的访问控制功能。很多公司都有控制员工访问外网的需求,例如有的公司不允许 ... [详细]
  • 网络编程:其实就是在学socketsocket是什么?翻译过来称为套接字是对底层的TCPIPUDP等网络协议进行封装使得上层的应用程序开发者,不用直接接触这对复杂,丑陋的协议在程序 ... [详细]
  • python图书管理系统类_Python标准库socketserver使用线程混入实现异步TCP服务器
    推荐图书:《Python程序设计开发宝典》,ISBN:978-7-302-47210-0,董付国,清华大学出版 ... [详细]
  • SpringBoot使用Netty实现远程调用的示例
    这篇文章主要介绍了SpringBoot使用Netty实现远程调用的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了如何使用iptables添加非对称的NAT规则段,以实现内网穿透和端口转发的功能。通过查阅相关文章,得出了解决方案,即当匹配的端口在映射端口的区间内时,可以成功进行端口转发。详细的操作步骤和命令示例也在文章中给出。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • windows平台使用NSP拦截具体进程的域名解析过程(xFsRedir的代理功能之域名代理)
    byfanxiushu2022-10-17转载或引用请注明原始作者。xFsRedir软件其中之一的功能就是实现了全方位的网络代理,从主机代理,到本地代理 ... [详细]
  • 引言随着企业安全意识的增强以及现代化管理水平的提高,对设备的远程监控在工业控制系统中得到了越来越广泛的应用。近年来,Web技术广泛普及,把 ... [详细]
  • TCP/IP详解 卷1 第一章概述
    第一章概述1.2分层网络编程通常分不同层次进行开发,每一层负责不同的通信功能。一个协议族比如TCPIP,通常是一组不同层次上多个协议的组合。一般可以认为 ... [详细]
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社区 版权所有