AvaloniaTCP-v1.0.0:学习使用Avalonia/C#进行TCP通讯的一个简单Demo
TCP通讯简介
TCP(传输控制协议,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保数据包按顺序传输,并在必要时进行重传,以保证数据的完整性和准确性。TCP通过三次握手建立连接,通过四次挥手释放连接,确保通信双方在传输数据前已准备好,并在传输结束后正确关闭连接。TCP广泛应用于需要高可靠性的网络应用,如网页浏览、文件传输和电子邮件等。
Demo效果
启动两个应用,一个当服务端,一个当客户端。
开启服务端:

开启客户端:

客户端向服务端发送消息:

服务端向客户端发送消息:

Demo代码
启动服务端:
[RelayCommand]
private async Task StartServer()
{
System.Net.IPAddress Ip = System.Net.IPAddress.Parse(IpAddress);
_tcpServer = new TcpListener(Ip, Port);
_tcpServer.Start();
Message += "Server started. Waiting for a connection...\r\n";
// 接受客户端连接
_tcpServer_Client = await _tcpServer.AcceptTcpClientAsync();
Message += "客户端已连接\r\n";
// Handle client communication
_ = HandleClientAsync(_tcpServer_Client);
}
private async Task HandleClientAsync(TcpClient client)
{
var stream = client.GetStream();
var buffer = new byte[1024];
int bytesRead;
while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0)
{
var message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Message+=$"Received from client: {message}\r\n";
// Echo the message back to the client
//var response = Encoding.UTF8.GetBytes($"Echo: {message}");
//await stream.WriteAsync(response, 0, response.Length);
}
Message += "Client disconnected...\r\n";
stream.Close();
}
启动客户端:
[RelayCommand]
private async Task StartClient()
{
System.Net.IPAddress Ip = System.Net.IPAddress.Parse(IpAddress);
_tcpClient = new TcpClient();
await _tcpClient.ConnectAsync(Ip, Port);
Message += "Connected to server...\r\n";
_ = HandleServerCommunicationAsync(_tcpClient);
}
private async Task HandleServerCommunicationAsync(TcpClient client)
{
var stream = client.GetStream();
var buffer = new byte[1024];
int bytesRead;
while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0)
{
var message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Message += $"Received from server: {message}\r\n";
}
Message += "Disconnected from server...\r\n";
stream.Close();
}
向服务端发消息:
[RelayCommand]
private async Task SendMessageToServer()
{
if (_tcpClient == null || !_tcpClient.Connected)
{
Message += "Not connected to server.\r\n";
return;
}
var stream = _tcpClient.GetStream();
var data = Encoding.UTF8.GetBytes(Text);
await stream.WriteAsync(data, 0, data.Length);
Message += $"Sent: {Text}\r\n";
}
向客户端发消息:
[RelayCommand]
private async Task SendMessageToClient()
{
if (_tcpServer_Client == null || !_tcpServer_Client.Connected)
{
Message += "Not connected to client.\r\n";
return;
}
var stream = _tcpServer_Client.GetStream();
var data = Encoding.UTF8.GetBytes(Text);
await stream.WriteAsync(data, 0, data.Length);
Message += $"Sent: {Text}\r\n";
}
全部代码已上传至https://github.com/Ming-jiayou/AvaloniaTCP。
希望通过我的点滴分享,能够让对Avalonia感兴趣的朋友,更快入门。
AvaloniaTCP-v1.0.0:学习使用Avalonia/C#进行TCP通讯的一个简单Demo的更多相关文章
- Node学习(二) --使用http和fs模块实现一个简单的服务器
1.创建一个www目录,存储静态文件1.html.1.jpg. * html文件内容如下: 12345678910111213 <html lang="en">< ...
- python学习笔记:"爬虫+有道词典"实现一个简单的英译汉程序
1.有道的翻译 网页:www.youdao.com Fig1 Fig2 Fig3 Fig4 再次点击"自动翻译"->选中'Network'->选中'第一项',如下: F ...
- Unity3D学习(三):利用NGUI实现一个简单的左右摇杆
前言 小游戏Konster在测试的时候有热心玩家反馈左右移动手感不是很好,最主要的问题是:手指一旦按在手机屏幕的一个方向按钮上,向反方向滑动到另一个方向按钮上是不会改变玩家移动方向的. 具体如下图: ...
- SpringBoot学习笔记(13)----使用Spring Session+redis实现一个简单的集群
session集群的解决方案: 1.扩展指定server 利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略.缺点:耦合Tomcat/ ...
- Socket 学习(三).1 tcp 通讯
实现了,局域网客户端 对客户端 的通讯. 实际上这是 一个 客户端 兼 服务端 . 2个阿里云服务器测试 效果图: 本地效果图: using System; using System.Collecti ...
- Yii学习笔记之二(使用gii生成一个简单的样例)
1. 数据库准备 (1) 首先我们建一数据库 yii2test 并建立一张表例如以下: DROP TABLE IF EXISTS `posts`; CREATE TABLE `posts` ( `po ...
- 从零开始搭建.NET Core 2.0 API(学习笔记一)
从零开始搭建.NET Core 2.0 API(学习笔记一) 一. VS 2017 新建一个项目 选择ASP.NET Core Web应用程序,再选择Web API,选择ASP.NET Core 2. ...
- Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(无数截图)
[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...
- Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(图文并茂,还有实例下载)
[文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...
- 《Ruby语言入门教程v1.0》学习笔记-01
<Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...
随机推荐
- 实现一个终端文本编辑器来学习golang语言
欢迎!这个系列的博文会带你使用golang语言来编写一个你自己的文本编辑器. 首先想说说写这个系列文章的动机. 其实作为校招生加入某头部互联网大厂一转眼已经快4年了.可以说该大厂算是比较早的用gola ...
- git 如何在本地批量删除匹配名称分支
背景 有时间创建了一大堆的dev/*分支,远程合并完就删除了,但本地还留下一大堆,自己又忘记删除了.一个个删除太麻烦.后面发现居然有批量删除的方法 备注:这里是window下powershell的命令 ...
- springboot接口入参下划线转驼峰以及返回参数驼峰转下划线实现
1.背景 在实际开发中,通常来说java里面是使用驼峰的命名规则; 但是有时候在对接其他三方平台的接口时,要求使用下划线的命名规则,这时候就涉及到如何让自己的接口满足三方平台的下划线; 实现方式有 1 ...
- 跨越时空的对话:如何使用AI阅读工具ChatDOC快速建立数字化身?
跨越时空的对话:如何使用 ChatDOC 快速建立数字化身?以史蒂夫·乔布斯 AI 为例 开门见山,这篇文章主要介绍如何将 AI 改造为靠谱.好用.基于某个人物的数字化身.比如,乔布斯 AI.马斯克 ...
- CH07_指针
CH07_指针 指针的基本概念 作用:可以通过指针间接访问内存 描述: 内存编号是从0开始记录的,一般用十六进制数字表示 可以利用指针变量保存地址 指针变量的定义和使用 语法: 数据类型 * 变量名; ...
- Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程 Xorbits Inference (Xinference) 是一个开源平台,用 ...
- 设计模式之cglib动态代理
什么是动态代理呢?动态代理就是在java进程运行时,通过字节码技术,动态的生成某个类的代理类.在这个代理类中,我们可以做一些额外的操作,一方面仍然保持原有的方法的能力,另外一方面还增强了这些能力.听着 ...
- Linux-mknod命令
mknod 创建块设备或者字符设备文件.此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 用法: mknod [选项]... 名称 类型 ...
- Shell 避免无限递归
在编写 Shell 脚本时,有时会产生我们不期望的递归. 比如说,我曾经写过一个脚本,名为 foo.sh. foo.sh 的内容如下: function foo { # TODO } foo 然后我在 ...
- 链接器 ld 名称的由来
Linker 通常缩写为 LD,这是因为在 Unix 和类 Unix 系统中,ld 是链接器的常用命令名称.这个命名可以追溯到 Unix 系统的早期发展历史. 历史背景 Unix 早期:在 Unix ...