TCP服务器的C#实现

这篇具有很好参考价值的文章主要介绍了TCP服务器的C#实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、TCP实现类

internal class TcpServer
    {
        public Socket ServerSocket { get; set; }
        public Dictionary<string,Socket> Sockets { get; set; }= new Dictionary<string,Socket>();
        public byte[] SendBuffer { get; set; }
        public byte[] ReceiveBuffer { get; set; }
        /// <summary>
        /// 创建构造函数
        /// </summary>
        /// <param name="sendBufferLength"></param>
        /// <param name="receiveBufferLength"></param>
        public TcpServer(int sendBufferLength, int receiveBufferLength)
        {
            SendBuffer = new byte[sendBufferLength];
            ReceiveBuffer = new byte[receiveBufferLength];
        }
        /// <summary>
        /// 启动服务器
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        public void Start(string ip, string port)
        {
            ServerSocket = CreateSocket(ip, port);
            CreateThread();
        }
        /// <summary>
        /// 服务端向指定客户端发送消息
        /// </summary>
        /// <param name="clientInfo"></param>
        /// <param name="data"></param>
        public void Send(string clientInfo, byte[] data)
        {
            Socket socket = Sockets[clientInfo];
            socket.Send(data);
        }
        /// <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.Bind(endPoint);
            socket.Listen(20);
            return socket;
        }
        /// <summary>
        /// 创建监听客户端的线程并启动
        /// </summary>
        private void CreateThread()
        {
            Thread watchThread = new Thread(WatchConnection);
            watchThread.IsBackground = true;
            watchThread.Start();
        }
        /// <summary>
        /// 监听客户端请求
        /// </summary>
        private void WatchConnection()
        {
            while (true)
            {
                Socket clientSocket = null;
                try
                {
                    clientSocket = ServerSocket.Accept();
                    IPEndPoint endPoint = (IPEndPoint)clientSocket.RemoteEndPoint;
                    string ip= endPoint.Address.ToString();
                    string port= endPoint.Port.ToString();
                    Sockets.Add(ip + ":" + port, clientSocket);

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                    break;
                }
                ParameterizedThreadStart pts = new ParameterizedThreadStart(ClientReceiver);
                Thread clientThread = new Thread(pts);
                clientThread.IsBackground = true;
                clientThread.Start(clientSocket);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="socket"></param>
        private void ClientReceiver(object socket)
        {
            Socket clientSocket=socket as Socket;
            int ReceiveBufferSize = 1 * 1024;
            while (true)
            {
                int receivedLength = 0;
                byte[] buffer = new byte[ReceiveBufferSize];
                try
                {
                    List<byte> ls = new List<byte>();
                    if (clientSocket != null)
                    {
                        receivedLength = clientSocket.Receive(buffer);
                        if (receivedLength > 0)
                        {
                            Buffer.BlockCopy(buffer,0, ReceiveBuffer, 0, receivedLength);
                            string msg = "Receive Success " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                            byte[] datas = System.Text.Encoding.UTF8.GetBytes(msg);
                            clientSocket.Send(datas);
                        }
                    }
                }catch(Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                    break;
                }
            }
        }
    }

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">
            <DockPanel 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>
            <DockPanel HorizontalAlignment="Right">
                <TextBlock Text="客户端" VerticalAlignment="Center" Margin="20 0 10 0"/>
                <ComboBox x:Name="ComboBoxClient" SelectedValuePath="Key" DisplayMemberPath="Key" Width="200" Height="36" Margin="20 0 10 0" SelectionChanged="ComboBoxClient_SelectionChanged"/>
            </DockPanel>
        </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、后台代码

TcpServer tcpServer= null;
        public MainWindow()
        {
            InitializeComponent();
            tcpServer = new TcpServer(2 * 1024, 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;
            }
            ComboBoxClient.ItemsSource = tcpServer.Sockets;
            tcpServer.Start(address, port);
        }
        string currentClient = null;
        private void ComboBoxClient_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            //currentClient = ComboBoxClient.SelectedValue.ToString();
            ComboBox comboBox = sender as ComboBox;
            string str = comboBox.SelectedValue.ToString();
            if (tcpServer.Sockets.ContainsKey(str))
            {
                currentClient = str;
            }
        }

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

4、运行结果
c# tcp服务器,tcp/ip,服务器,c#文章来源地址https://www.toymoban.com/news/detail-698921.html

到了这里,关于TCP服务器的C#实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#使用NModbus4库创建Modbus TCP Slave(服务器)简单示例

    本文续上篇Codesys—标准库ModbusTCP Master(客户端)配合C#的NModbus4库的通讯示例 链接:https://blog.csdn.net/wushangwei2019/article/details/136375234?spm=1001.2014.3001.5501 上篇描述在Codesys端的Modbus TCP Master(客户端)的设备添加、IO映射、通讯简单展示等方面,本文记录PC端C#利用NModbus4通讯库创建Mo

    2024年03月16日
    浏览(35)
  • 【TCP/IP】多进程服务器的实现(进阶) - 多进程服务器模型及代码实现

             经过前面的铺垫,我们已经具备实现并发服务器的基础了,接下来让我们尝试将之前的单任务回声服务器改装成多任务并发模式吧!         在编写代码前,先让我们大致将多任务(回声)服务器的模型抽象一下,如下图所示:         当客户端请求服务(

    2024年02月08日
    浏览(135)
  • Socket网络编程(TCP/IP)实现服务器/客户端通信。

    一.前言 回顾之前进程间通信(无名管道,有名管道,消息队列,共享内存,信号,信号量),都是在同一主机由内核来完成的通信。 那不同主机间该怎么通信呢? 可以使用Socket编程来实现。 Socket编程可以通过网络来实现实现不同主机之间的通讯。 二.Socket编程的网络模型如

    2024年02月08日
    浏览(68)
  • 【TCP/IP】利用I/O复用技术实现并发服务器 - select函数

    目录 I/O复用技术 select函数 设置文件描述符 指定监视范围 设置超时 I/O复用服务器端的实现        由服务器创建多个进程来实现并发的做法有时会带来一些问题,比如:内存上的开销、CPU的大量占用等,这些因素会消耗掉服务器端有限的计算资源、进而影响程序之间的执

    2024年02月08日
    浏览(39)
  • 【TCP/IP】多进程服务器的实现(进阶) - 僵尸进程及wait、waitpid函数

    目录 僵尸(Zombie)进程 僵尸进程的产生机制 僵尸进程的危害 僵尸进程的销毁 wait函数 waitpid函数          进程管理在网络编程中十分重要,如果未处理好,将会导致出现“僵尸进程”,进而影响服务器端对进程的管控。         第一次听到这个名词大家可能会有些陌生

    2024年02月09日
    浏览(33)
  • 【TCP/IP】多进程服务器的实现(进阶) - 进程的概念及fork函数

    目录 进程的概念及应用 进程的定义 进程的ID fork函数(进程创建函数)         多进程(以及多线程)是现代计算机网络的精髓。在之前,我们所做的诸如回声服务器、回声客户端、文件收发等都是偏向基础的单进程应用。而经过前面的铺垫,我们对Socket也有了一定了解

    2024年02月09日
    浏览(41)
  • Linux网络编程之TCP/IP实现高并发网络服务器设计指南

    目录 引言: 多进程服务器 例程分享: 多线程服务器  例程分享: I/O多路复用服务器 select 例程分享: poll 例程分享: epoll 例程分享: 总结建议         随着互联网的迅猛发展,服务器面临着越来越多的并发请求。如何设计一个能够高效处理大量并发请求的服务器成为

    2024年02月20日
    浏览(44)
  • 【TCP/IP】多进程服务器的实现(进阶) - 信号处理及signal、sigaction函数

    目录 信号 signal函数 sigaction函数 用信号来处理僵尸进程          在之前我们学习了如何处理“僵尸进程”,不过可能也会有疑问:调用wait和waitpid函数时我们关注的始终是在子进程上,那么在父进程上如何实现对子进程的管控呢?为此,我们引入一个概念——信号处理。

    2024年02月08日
    浏览(50)
  • [ C# ] C#中TCP服务端的实现

           本文所用例子为个人学习的小结,如有不足之处请各位多多海涵,欢迎小伙伴一起学习进步,如果想法可在评论区指出,我会尽快回复您,不胜感激!         所公布代码或截图均为运行成功后展示。         嘿嘿,小小免责声明一下!部分代码可能与其他网

    2024年01月18日
    浏览(28)
  • 《TCP/IP网络编程》阅读笔记--基于Windows实现Hello Word服务器端和客户端

    目录 1--Hello Word服务器端 2--客户端 3--编译运行 3-1--编译服务器端 3-2--编译客户端 3-3--运行 运行结果:

    2024年02月10日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包