一个简单的c#基于TCP通讯的服务器

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace server
{
    class Program
    {
        Thread threadWatch = null; // 负责监听客户端连接请求的 线程;
        Socket socketWatch = null;
        Dictionary<string, Socket> dict = new Dictionary<string, Socket>();//存放套接字
        Dictionary<string, Thread> dictThread = new Dictionary<string, Thread>();//存放线程

        static void Main(string[] args)
        {





            Program pr = new Program();
            pr.startService();

         /**********************************************************************************/
            Cmd p= new Cmd();
            ArrayList strlist = p.ListNetfile("SAP项目文档");

            foreach (string  str in strlist)
            {
                Console.WriteLine(str);
            }
            /************************************************************************************/
            string ConsoleLine =Console.ReadLine();
            while(true)
            {
                if ("exit".Equals(ConsoleLine))
                {
                    System.Environment.Exit(0);
                }
                ConsoleLine = Console.ReadLine();
            }
        }
        void startService()
        {
            IPEndPoint newipep = new IPEndPoint(IPAddress.Any, 8031);
            socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                socketWatch.Bind(newipep);
            }
            catch (SocketException se)
            {
                Console.WriteLine("异常:" + se.Message);
                return;
            }
            // 设置监听队列的长度;
            socketWatch.Listen(10000);
            // 创建负责监听的线程;
            threadWatch = new Thread(WatchConnecting);
            threadWatch.IsBackground = true;
            threadWatch.Start();
            Console.WriteLine("服务器启动监听成功!");
        }

        void WatchConnecting()
        {
            
            while (true)
            {
                // 开始监听客户端连接请求,Accept方法会阻断当前的线程;
                Socket sokConnection = socketWatch.Accept(); // 一旦监听到一个客户端的请求,就返回一个与该客户端通信的 套接字;
                                                             // 将与客户端连接的 套接字 对象添加到集合中;
                Console.WriteLine(sokConnection.RemoteEndPoint.ToString()+"新客户端连接成功!");
                dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection);
                Thread thr = new Thread(RecMsg);
                thr.IsBackground = true;
                thr.Start(sokConnection);
                dictThread.Add(sokConnection.RemoteEndPoint.ToString(), thr);  //  将新建的线程 添加 到线程的集合中去。
            }
        }

         void RecMsg(object sokConnectionparn)
        {
            Socket sokClient = sokConnectionparn as Socket;
            while (true)
            {
                // 定义一个缓存区;
                byte[] arrMsgRec = new byte[1024];
                // 将接受到的数据存入到输入  arrMsgRec中;
                int length = -1;
                try
                {
                    length = sokClient.Receive(arrMsgRec); // 接收数据,并返回数据的长度;
                    if (length > 0)
                    {
                        //主业务
                        string cmdstr = System.Text.Encoding.UTF8.GetString(arrMsgRec).TrimEnd('\0');//一定要加TrimEnd('\0')不然字符串还是原来的字符数组
                        string[] cmds = cmdstr.Split(' ');
                        if ("select".Equals(cmds[0]))
                        {
                           
                            Cmd cmd= new Cmd();
                            string fileNames = cmds[1].Trim();

                     
                            ArrayList result = cmd.ListNetfile(fileNames);
                            foreach (string str in result)
                            {
                                byte[] b= System.Text.Encoding.UTF8.GetBytes(str);
                                sokClient.Send(b);
                                Thread.Sleep(500);
                                Console.WriteLine(str);
                              
                            }
                           
                            
                        }
                        else if ("delete".Equals(cmds[0]))
                        {
                            Console.WriteLine(cmds[1]);
                            Cmd cmd = new Cmd();
                            string fileNames = cmds[1].Trim();
                            String result = cmd.CloseShareFile(fileNames);
                            Console.WriteLine(result);
                            StringBuilder sb = new StringBuilder();
                            sb.Append(fileNames);
                            sb.Append(" ");
                            if (result.Contains("命令成功完成"))
                            {
                                sb.Append("关闭成功");
                            }
                            else
                            {
                                sb.Append("关闭失败");
                            }
                            result = sb.ToString();
                            byte[] b = System.Text.Encoding.Default.GetBytes(result);
                            sokClient.Send(b);
                            Thread.Sleep(10);

                        }

                        Thread.Sleep(500);
                        sokClient.Send(BitConverter.GetBytes(0x04), 1, new SocketFlags());
                    }
                    else
                    {
                        // 从 通信套接字 集合中删除被中断连接的通信套接字;
                        dict.Remove(sokClient.RemoteEndPoint.ToString());
                        // 从通信线程集合中删除被中断连接的通信线程对象;
                        dictThread.Remove(sokClient.RemoteEndPoint.ToString());
                        Console.WriteLine("" + sokClient.RemoteEndPoint.ToString() + "断开连接\r\n");
                        //log.log("遇见异常"+se.Message);
                        break;
                    }
                }
                catch (SocketException se)
                {
                    // 从 通信套接字 集合中删除被中断连接的通信套接字;
                    dict.Remove(sokClient.RemoteEndPoint.ToString());
                    // 从通信线程集合中删除被中断连接的通信线程对象;
                    dictThread.Remove(sokClient.RemoteEndPoint.ToString());
                    Console.WriteLine("" + sokClient.RemoteEndPoint.ToString() + "断开,异常消息:" + se.Message + "\r\n");
                    //log.log("遇见异常"+se.Message);
                    break;
                }
                catch (Exception e)
                {
                    // 从 通信套接字 集合中删除被中断连接的通信套接字;
                    dict.Remove(sokClient.RemoteEndPoint.ToString());
                    // 从通信线程集合中删除被中断连接的通信线程对象;
                    dictThread.Remove(sokClient.RemoteEndPoint.ToString());
                    // 从列表中移除被中断的连接IP
                    Console.WriteLine("异常消息:" + e.Message + "\r\n");
                    // log.log("遇见异常" + e.Message);
                    break;
                }
            }
        }
    }
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于C#的Modbus TCP实时通讯读写示例代码,你可以参考一下: ```csharp using System; using System.Threading; using System.Net.Sockets; using Modbus.Data; using Modbus.Device; using Modbus.Utility; class Program { static void Main(string[] args) { // 创建Modbus TCP客户端 TcpClient client = new TcpClient("localhost", 502); ModbusIpMaster master = ModbusIpMaster.CreateIp(client); // 定义读写操作的数据 ushort address = 1; ushort count = 1; ushort[] readData = new ushort[count]; ushort[] writeData = new ushort[] { 12345 }; // 循环执行实时通讯读写 while (true) { // 读取保持寄存器(地址为0x0001)中的值 readData = master.ReadHoldingRegisters(address, count); ushort value = readData[0]; Console.WriteLine("保持寄存器中的值为:" + value); // 写入保持寄存器(地址为0x0001)中的新值 master.WriteMultipleRegisters(address, writeData); Console.WriteLine("新值已写入保持寄存器中"); // 等待1秒钟 Thread.Sleep(1000); } // 关闭客户端 client.Close(); } } ``` 在代码中,我们首先创建了一个 Modbus TCP 客户端,并定义了读写操作的数据。然后,使用一个无限循环不断执行实时通讯读写操作,并使用 `Thread.Sleep` 方法暂停1秒钟。在实际应用中,可以根据需要设置读写的地址、数量和数据,并进行相应的操作。当然,在使用时也需要根据实际情况设置 Modbus TCP 服务器的 IP 地址和端口号。 需要注意的是,Modbus TCP 协议是一种基于连接的协议,因此需要在每次使用完成后关闭客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值