TCP客户端的WPF实现

news2024/9/23 23:35:07

1、TCP实现类

internal class TcpClient
    {
        Socket ClientSocket { get; set; }
        public byte[] ReceiveBuffer { get; set; }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="receiveBufferLength"></param>
        public TcpClient(int receiveBufferLength) 
        {
            ReceiveBuffer = new byte[receiveBufferLength];
        }
        /// <summary>
        /// 连接服务器
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        public void Start(string ip, string port)
        {
            ClientSocket = CreateSocket(ip, port);
            CreateThread();
        }
        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="buffer"></param>
        public void Send(byte[] buffer)
        {
            ClientSocket.Send(buffer);
        }
        /// <summary>
        /// 断开服务器
        /// </summary>
        public void Stop()
        {
            ClientSocket.Close();
        }
        /// <summary>
        /// 创建客户端Socket
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        private Socket CreateSocket(string ip, string port)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress address = IPAddress.Parse(ip);
            IPEndPoint endPoint = new IPEndPoint(address, int.Parse(port));
            socket.Connect(endPoint);
            return socket;
        }
        /// <summary>
        /// 创建服务端发来消息的线程并启动
        /// </summary>
        private void CreateThread()
        {
            Thread clientThread = new Thread(ReceiverThread);
            clientThread.IsBackground = true;
            clientThread.Start();
        }
        /// <summary>
        /// 接收服务端发来消息的处理方法
        /// </summary>
        private void ReceiverThread()
        {
            int bufferlength = 2 * 1024;
            while (true)
            {
                int length = 0;
                byte[] buffer = new byte[bufferlength];
                try
                {
                    length = ClientSocket.Receive(buffer);
                }catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    break;
                }
                Buffer.BlockCopy(buffer, 0, ReceiveBuffer, 0, length);
            }
        }
    }

2、实现界面

<Grid Margin="10">
        <Grid.RowDefinitions>
            <RowDefinition Height="50"/>
            <RowDefinition Height="50"/>
            <RowDefinition Height="50"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="50"/>
            <RowDefinition Height="50"/>
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Text="配置" VerticalAlignment="Center"/>
        <DockPanel Grid.Row="1" HorizontalAlignment="Left">
            <TextBlock Text="地址" VerticalAlignment="Center" Margin="20 0 10 0"/>
            <TextBox x:Name="TextBoxIp" Text="" Width="100" Height="36" VerticalContentAlignment="Center"/>
            <TextBlock Text="端口" VerticalAlignment="Center" Margin="20 0 10 0"/>
            <TextBox x:Name="TextBoxport" Text="" Width="100" Height="36" VerticalContentAlignment="Center"/>
            <Button x:Name="ButtonStart" Content="连接" Width="75" Height="36" Margin="20,0,10,0" Click="ButtonStart_Click"/>
        </DockPanel>
        <TextBlock Grid.Row="2" Text="接收" VerticalAlignment="Center"/>
        <TextBox Grid.Row="3" Name="TextBoxReciver" Text=""/>
        <TextBlock Grid.Row="4" Text="发送" VerticalAlignment="Center"/>
        <StackPanel Grid.Row="5" Orientation="Horizontal">
            <TextBox x:Name="TextBoxSender" Text="" Width="650" Height="36"/>
            <Button Content="发送" Click="ButtonSend_CLick" Width="75" Height="36" HorizontalAlignment="Right" Margin="10 0 20 0"/>
        </StackPanel>
    </Grid>

3、后台代码

TcpClient tcpClient = null;
        public MainWindow()
        {
            InitializeComponent();
            tcpClient=new TcpClient(2 * 1024);
            TextBoxIp.Text = "10.11.10.44";
            TextBoxport.Text = "8080";
        }

        private void ButtonStart_Click(object sender, RoutedEventArgs e)
        {
            string address = this.TextBoxIp.Text;
            string[] arr = address.Split('.');
            if (arr.Length == 4)
            {
                foreach (string item in arr)
                {
                    int i = int.Parse(item);
                    if (i < 0 || i > 255)
                    {
                        return;
                    }
                }
            }
            string port = this.TextBoxport.Text;
            int j = int.Parse(port);
            if (j < 0)
            {
                return;
            }
            tcpClient.Start(address, port);
        }

        private void ButtonSend_CLick(object sender, RoutedEventArgs e)
        {
            string str = TextBoxSender.Text;
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(str);
            tcpClient.Send(bytes);
        }

4、运行效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/689719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于Eclipse 运行JavaWeb项目发生Source not found的情况

描述是说&#xff0c;class源文件未找到。其实问题就是出在没有部署。但是我们查看部署时&#xff0c;发现我们已经部署过了。 其实&#xff0c;这个比较细节的地方。 你可以右键单击这个jsp项目&#xff0c;然后点击 run as。发现它其实是没有配置run运行文件。这就导致是发现…

【wireshark】时间显示

默认的好像是个相对时间 可以显示当前时间 在视图里选择

Xcode 常用操作相关

代码折叠 选择 Xcode -> Preferences -> Text Editing勾选Code folding ribbon 清空最近打开项目 File -> Open Recent -> Clear Menu

模板匹配Template Matching

实现代码&#xff1a; import cv2 import numpy as np def template_demo(tpl,target):methods[cv2.TM_SQDIFF_NORMED,cv2.TM_CCORR_NORMED,cv2.TM_CCOEFF_NORMED]th,twtpl.shape[:2]for md in methods:start_timecv2.getTickCount()# 匹配结果resultcv2.matchTemplate(target…

【Linux】linux | shell | 获取日期

1、获取上一天 1&#xff09;代码 date -d "1 days ago" %Y-%m-%d 2&#xff09;结果 ~~

chatgpt赋能python:Python计算累乘的优秀解决方案

Python计算累乘的优秀解决方案 在python编程中&#xff0c;经常需要进行数值计算。其中一个最基本的计算就是累乘。累乘可以基于一组数字进行&#xff0c;计算它们的乘积。比如&#xff0c;如果输入的数字序列是[1,2,3,4]&#xff0c;则累乘结果为24。 在本文中&#xff0c;我…

MediaPipe简介

有没有想过“OK Google”背后的含义是什么?嗯,这就是 MediaPipe。如果您刚刚开始使用 MediaPipe,并且这是您阅读的第一篇文章,那么恭喜您,您找到了正确的地方。本文将介绍MediaPipe的基础知识、解决方案之间的差异以及框架。 官方文档指出,推理是实时的,只需几行代码即可…

Qt定时器类QTimer

目录 public/slot function signals static public function 示例&#xff08;获取系统时间并且将其显示到窗口中&#xff09;&#xff1a; 示例主要代码&#xff08;每间隔一秒向控制台发送一条消息&#xff09;&#xff1a; 注意事项&#xff1a; Qt定时器类QTimer是一个…

Bootstrap CSS 概览

文章目录 Bootstrap CSS 概览HTML 5 文档类型&#xff08;Doctype&#xff09;移动设备优先响应式图像全局显示、排版和链接基本的全局显示排版链接样式 避免跨浏览器的不一致容器&#xff08;Container&#xff09;Bootstrap 浏览器/设备支持 Bootstrap CSS 概览 在这一章中&a…

iOS-苹果内购的流程图

关于苹果内购的开发文章有很多&#xff0c;如&#xff1a; Flutter上线项目实战——苹果内购 苹果内购流程&#xff0c;看我就足够了 - 简书 。 下面这是一张苹果内购的流程图。 ​​​​​​​ 该图来源于苹果官网&#xff0c;但不够清晰&#xff0c;欢迎各位网络大牛 告知…

关于cdh环境中zookeeper启动失败NodeManager内存溢出无法链接等的问题

在此记录一下 1、zookeeper一直启动失败&#xff1a; 看你的事物目录配置的是什么 解决方法&#xff1a;删除掉/var/lib/zookeeper/version-2 为0kb的有问题文件&#xff0c;问题解决 2、NodeManager内存溢出无法链接等的问题 注意几点&#xff1a; 1、这里不能超过物理内存…

MySQL数据库学习(保姆级教程)(1.7W字)

1.初识MySQL JavaEE:企业级Java开发 Web 前端&#xff08;页面&#xff1a;展示&#xff0c;数据&#xff01;&#xff09; 后台&#xff08;连接点&#xff1a;连接数据库JDBC&#xff0c;链接前端&#xff08;控制&#xff0c;控制视图跳转&#xff0c;和给前端传递数据&a…

h.264与h.265有什么区别

H.265是新的编码协议&#xff0c;是H.264的升级版。H.265相比H.264最主要的改变是采用了块的四叉树划分结构&#xff0c;也极大了优化了算法&#xff0c;H.265比H.264占用的存储空间理论上要少50%。H.265在各方面都碾压了H.264。 1&#xff0c;H265优点&#xff1a;降低存储空间…

行列转换(一)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 行列转换 • Mysql版 1.准备操作2.行转列1.1为何进…

vue前端和nodejs后端使用socket.io无法通信问题解决

(128条消息) 使用 socket.io 跨域问题的解决&#xff08;整理了四种方法&#xff0c;总有成功的&#xff01;&#xff09; Access to XMLHttpRequest at ‘http://localhost:4000/socket.io_socket io()出现跨域问题_it1790的博客-CSDN博客 socket.io的版本是4.6.2

【Java】Java核心 73:XML (中)

文章目录 5 XML的组成&#xff1a;字符区(了解)**6** **DTD约束(能够看懂即可)****1** **什么是DTD****2** **DTD约束的实现和语法规则&#xff08;看懂dtd约束&#xff0c;书写符合规范的xml文件&#xff09;** 5 XML的组成&#xff1a;字符区(了解) 当大量的转义字符出现在x…

MATLAB随机打乱矩阵(按行或列)

1、重新排列矩阵各行 a [1 2;3 4;5 6;7 8]; rowrank randperm(size(a, 1)); % size获得a的行数&#xff0c;randperm打乱各行的顺序 a1 a(rowrank,:) % 按照rowrank重新排列各行&#xff0c;注意rowrank的位置2、重新排列矩阵各列 b [1 3 5 7;2 4 6 8 ]; r…

【AntDB数据库】AntDB数据库整体架构

整体架构 AntDB包括计算节点(Coordinator)、数据节点(DB)、全局事务管理器&#xff08;GTM&#xff09;和管理节点四种组件&#xff0c;其中GTM和DB为有状态的组件&#xff0c;需要考虑高可用&#xff0c;架构如下图&#xff1a; 计算节点(Coordinator)&#xff1a;提供SQL解…

ffmpeg dec中AVCodecHWConfigInternal在那里使用

在做ffmpeg decode插件的时候&#xff0c;发现需要增加一个AVCodecHWConfigInternal数组&#xff0c; //就是这个数组 static const AVCodecHWConfigInternal *efcodec_hw_configs[] {&(const AVCodecHWConfigInternal) {.public {.pix_fmt AV_PIX_FMT_EFCCODEC,.me…

Jupyter notebook运行环境创建

进入到jupyter notebook,没找到自己之前创建的环境xzc_pytorch 进入到Anaconda prompt,输入如下命令 (xzc_pytorch) C:\Users\xzc> conda install ipykernel安装完后&#xff0c;重启jupyter notebook发现还是没有 &#xff0c;此时选择手动创建&#xff0c;在base环境下执…