随笔 - 750  文章 - 1  评论 - 107  阅读 - 34万

[转][C#]Socket 手写服务端

复制代码
    private static log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name);
    private Socket server;
    private Thread thread;
    private bool First = true;
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Stop();

        tssTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss dddd");
        if (First)
        {
            First = false;

            var ips = Dns.GetHostByName(Dns.GetHostName());
            foreach (var item in ips.AddressList)
            {
                tssIP.DropDownItems.Add(item.ToString());
            }
            if (tssIP.DropDownItems.Count > 0)
                tssIP.Text = tssIP.DropDownItems[0].Text;
            tssStart.PerformClick();
        }
        timer1.Start();
    }

    private void tssStart_Click(object sender, EventArgs e)
    {
        if (tssStart.BackColor == Color.Green)
        {
            tssStart.BackColor = SystemColors.Control;
            tssInfo.Text = "停止监听";
        }
        else
        {
            tssStart.BackColor = Color.Green;
            tssInfo.Text = "开始监听";

            SocketStart();
        }
    }

    private void SocketStart()
    {
        if (server != null)
        {
            try
            {
                thread.Abort();
                server.Close();
            }
            catch { }
        }

        server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint local = new IPEndPoint(IPAddress.Parse(tssIP.Text), ConvertHelper.ToInt(txtPort.Text));
        server.Bind(local);
        server.Listen(200);

        thread = new Thread(() =>
        {
            while (true)
            {
                //Thread.Sleep(500);
                Invoke((MethodInvoker)delegate
                {
                    tsProgressBar1.Value = tsProgressBar1.Minimum;
                });
                Socket client = server.Accept();
                byte[] buffer = new byte[4096];
                int bytes = client.Receive(buffer, buffer.Length, SocketFlags.None);

                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < bytes; i++)
                {
                    sb.AppendFormat("{0} ", buffer[i].ToString("x2"));
                }

                string str = string.Format("{0} 接收到 {1} 发送到 {2} 的消息:{3}\r\n字节形式:{4} ",
                    DateTime.Now.ToString("HH:mm"),
                    client.RemoteEndPoint,
                    client.LocalEndPoint,
                    Encoding.ASCII.GetString(buffer, 0, bytes),
                    sb.ToString());
                log.Debug(str);

                var result = Encoding.ASCII.GetBytes(new char[] { 'O', 'K', '\r' });
                client.Send(result);
                client.Close();

                Invoke((MethodInvoker)delegate
                {
                    tsProgressBar1.Value = tsProgressBar1.Maximum;
                    if (txtResult.Lines.Length > 10000)
                        txtResult.Clear();
                    txtResult.Text = string.Format("{0}\r\n\r\n{1}", str, txtResult.Text);
                });
            }
        });
        thread.IsBackground = true;
        thread.Start();
    }

    private void tssIP_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e)
    {
        tssIP.Text = e.ClickedItem.Text;
        ResetStart();
    }

    private void ResetStart()
    {
        tssStart.PerformClick();
        if (tssStart.BackColor != Color.Green)
            tssStart.PerformClick();
    }

    private void txtText_Enter(object sender, EventArgs e)
    {
        txtText.BackColor = Color.White;
        txtByte.BackColor = Color.WhiteSmoke;
    }

    private void txtByte_Enter(object sender, EventArgs e)
    {
        txtText.BackColor = Color.WhiteSmoke;
        txtByte.BackColor = Color.White;
    }

    private void btnTest_Click(object sender, EventArgs e)
    {
        try
        {
            if (txtText.BackColor == Color.White)
            {
                // 转 十六进制
                bool success = true;
                StringBuilder sb = new StringBuilder();
                foreach (var item in txtText.Text)
                {
                    int c = (int)item;
                    if (c > 0xff)
                        success = false;
                    sb.AppendFormat("{0} ", ((byte)item).ToString("x2"));
                }
                txtByte.Text = sb.ToString();

                string tmp = string.Format("转换:{0} -> {1}", txtText.Text, txtByte.Text);
                log.Debug(tmp);
                txtResult.Text = string.Format("{0}\r\n\r\n{1}", tmp, txtResult.Text);
                if (!success)
                {
                    ShowErr("不能转换汉字!");
                    log.Debug("转换出错:不能转换汉字!");
                }
            }
            else
            {
                string[] strs = txtByte.Text.Trim().Split(' ');
                byte[] bs = new byte[strs.Length];
                for (int i = 0; i < strs.Length; i++)
                {
                    bs[i] = Convert.ToByte(strs[i], 16);
                }
                txtText.Text = Encoding.ASCII.GetString(bs);
                string tmp = string.Format("转换:{0} -> {1}", txtByte.Text, txtText.Text);
                log.Debug(tmp);
                txtResult.Text = string.Format("{0}\r\n\r\n{1}", tmp, txtResult.Text);
            }
        }
        catch (Exception ex)
        {
            string tmp = string.Format("转换出错:{0}", ex.Message);
            log.Debug(tmp);
            txtResult.Text = string.Format("{0}\r\n\r\n{1}", tmp, txtResult.Text);
            if (ex.InnerException != null)
                log.DebugFormat("转换出错:{0}", ex.InnerException.Message);
            ShowErr(ex.Message);
        }
    }

    private void ShowErr(string text)
    {
        MessageBox.Show(this, text, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    }
}
复制代码

 

posted on   z5337  阅读(199)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2019-07-11 [转][C#]AutoFac 使用方法总结
2018-07-11 [转][MVC4]
2014-07-11 DevExpress 组件
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示