WinForm(十五)窗体间通信
在很多WinForm的程序中,会有客户端之间相互通信的需求,或服务端与客户端通信的需求,这时就要用到TCP/IP的功能。在.NET中,主要是通过Socket来完成的,下面的例子是通过一个TcpListerner作为监听,等待TcpClient的连接,连接成功后就可以利用NetStream进行信息互通了。
在互相通信过程中,发送和接收分别在不同的线程中处理,并且还要处理UI更新。
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Sockets;namespace WinFormsDemo15
{public partial class Form1 : Form{public Form1(){InitializeComponent();}/// <summary>/// 创建连接后的网络流/// </summary>NetworkStream _stream;private void ConnectionButton_Click(object sender, EventArgs e){if (IsServer.Checked){AcceptTcpClient();}else{var tcpClient = new TcpClient(IPTextBox.Text, int.Parse(PortTextBox.Text));_stream = tcpClient.GetStream();ReciveMessage(_stream);}}/// <summary>/// 在一个新线程中接收TcpClient连接/// </summary>void AcceptTcpClient(){Task.Run(() =>{var listener = new TcpListener(IPAddress.Any, int.Parse(PortTextBox.Text));listener.Start();var tcpClient = listener.AcceptTcpClient();this.Invoke(() =>{YouTextBox.Text += $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} \r\n收到客户端连接。\r\n";});_stream = tcpClient.GetStream();ReciveMessage(_stream);});}/// <summary>/// 接收消息/// </summary>/// <param name="stream">网络流</param>void ReciveMessage(NetworkStream stream){Task.Run(() =>{while (true){var messageArr = new byte[1024];stream.Read(messageArr, 0, messageArr.Length);this.Invoke(() =>{var message = System.Text.Encoding.UTF8.GetString(messageArr).Trim('\0');YouTextBox.Text += $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 对方说:\r\n{message}\r\n";});}});}/// <summary>/// 发送消息/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void SendButton_Click(object sender, EventArgs e){var messageArr = System.Text.Encoding.UTF8.GetBytes(MyTextBox.Text);_stream.Write(messageArr, 0, messageArr.Length);_stream.Flush();YouTextBox.Text += $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 我说:\r\n{MyTextBox.Text}\r\n";MyTextBox.Clear();}}
}
下面是演示结果:
WinForm(十五)窗体间通信相关推荐
- 利用委托 实现窗体间通信,非原创
copy自:https://www.cnblogs.com/hugoNB/p/7130562.html,这个作者写的浅显易懂,就复制下来自己看 实现过程: 这里主要是用到委托实现,所以主要描述一下委托 ...
- C#不同窗体间通信,数据传递
在一个项目中,很多时候都需要在窗体间进行数据传递和通信,最觉见的是父子窗体之间的数据传递,比如登录ID,各个窗体都需要知道.有很多文章都写了这方面的问题,提出很多优秀的方法,鄙人不才,搜了一些资料之后 ...
- AUTOSAR从入门到精通100讲(三十五)-Lin通信协议栈分析三部曲LinTrcv配置及代码分析
LinTrcv 0.Lin通信协议栈简介: LIN通信服务是一组用于与LIN通信系统进行车辆网络通信的模块.提供统一的LIN网络接口.对应用层程序隐藏协议信息和消息属性的特性. Lin通信服务包括: ...
- 通信算法之七十五:无人机通信-接收信号解析破解
无人机通过无线信号与地面联系.无人机的反制流程主要有侦测.识别.追踪和打击.侦测和识别是进行无人机反制的基础,对无人机数传和测控信号实时搜索.探测和报警,获取无人机数传和测控信号的参数测量.单站测向. ...
- 十五天精通WCF——第六天 你必须要了解的3种通信模式
十五天精通WCF--第六天 你必须要了解的3种通信模式 原文:十五天精通WCF--第六天 你必须要了解的3种通信模式 wcf已经说到第六天了,居然还没有说到这玩意有几种通信模式,惭愧惭愧,不过很简单啦 ...
- WinForm窗体间如何传值
窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 公共静态变量: 使用共有属性: 使用委托与事件: 通过构造函数把主窗体传递到从窗体中: 一.通过静态变量 特点:传值是双 ...
- Winform程序窗体间的跳转
关于Winform程序窗体间的跳转问题: 对于编程新手来讲,winform程序窗体间的跳转,经常会出现一些异常,或是弹出重复的窗口,如下图 下面给出一种方法,可以很好的避免掉这样的问题: 首先,在主程 ...
- 网络云存储技术Windows server 2012 (项目十五 存储服务间的数据同步)
网络云存储技术Windows server 2012 (项目十五 存储服务间的数据同步) 目录 前言 一.项目背景 二. 项目实训题 前言 网络存储技术,是以互联网为载体实现数据的传输与存储,它采用面 ...
- 北京智能佳科技有限公司亮相第十五期“科学城·云推介”直播间
2020注定是不平凡的一年,新年伊始新冠爆发,人们经历了数月的至暗时期,经济的低迷,市场的萎缩,在不断地冲击着人们的生活,但同时,机遇也出现在人们面前.作为科技时代下智慧的产物,人工智能为疫情做出了巨 ...
最新文章
- 莫比乌斯函数+莫比乌斯反演
- pod实例数是什么意思_[灌水] Kubernetes In Action: Pod
- JavaFX UI控件教程(十六)之Separator
- 采用Spring管理Bean和依赖注入
- [leetcode]1.Two Sum
- xshell 无法定位输入点_linux基础知识个人总结
- php ajax 返回字符串而不是对象
- hbuilder怎么设置网页的大小_怎么免费将图片转成PDF?这个方法超简单
- 各区区号的字段和名称
- js 实现下拉菜单 完整代码
- 短信API接口demo示例-C#/Message/Send
- 最大子列和问题(PTA)
- react native 8081 端口号被占
- win10 +cude9.2+相匹配的cudnn+相匹配的tensorflow+ssd学习之路(问题百出2)
- 又是被打败的一天 (记招商银行笔试)
- 推荐书、网站(大多为计算机相关)
- 由Table_locks_waited想到的mysql 表锁问题
- 【第三届蓝桥杯】手机尾号
- 五 我们经常会忘记,要学会 走路 才能 奔跑,Python基础教程
- 计算机毕业设计选题建议
热门文章
- 我的炉子和空调应该使用哪种空气过滤器?
- 每日新闻 | 百度推出爱番番CRM开放平台 扶持入驻CRM服务商
- 惠普中国CEO孙振耀退休感言【转】
- 原来眼镜是可以摘掉的
- 记录一次wagon报错Failed to execute goal org.codehaus.mojo:wagon-maven-plugin:1.0:upload-single
- 江苏二本讲师年入43万, 武汉985教授税前17万, 浙江省属讲师每月6K, 各省青椒晒工资!...
- 21天学通python——第一天
- Winxp 蓝屏错误:Stop c0000218 unknown hard error 修复记
- 贝塞尔曲线的数学原理
- PMP支付考试费用相关介绍