关于C#多线程、网络编程与计时器Timer的一点使用心得

        初次使用C#进行网络编程,其中用到了多线程与计时器Timer类,以及网络通信相关类,在此总结一下。

       功能:服务器启动后一直处于侦听状态,一旦有客户发送数据就显示在文本框中,期间可以对侦听进行停止和启动操作。

1、服务器部分界面与代码


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;               // 引入这两个命名空间,以下同
using System.Net.Sockets;
using System.Threading;
using System.IO;
namespace Servers
{
    public partial class FrmServer : Form
    {
        Thread listenThread;//侦听线程
        StringBuilder msgs = new StringBuilder();

        public FrmServer()
        {
            InitializeComponent();
        }

        private void FrmServer_Load(object sender, EventArgs e)
        {
            listenThread = new Thread(IPScan);
            listenThread.IsBackground = true;
        }

        //开始侦听
        private void btnStartListen_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            timer1.Start();
            btnStartListen.Enabled = false;
            btnStopListen.Enabled = true;

            //如果需要多次挂起和启动线程,需要加以判断调用合适的方法
            if (listenThread.ThreadState == ThreadState.Suspended ||
                (listenThread.ThreadState == (ThreadState.SuspendRequested | ThreadState.Background)))
            {
                listenThread.Resume();
            }
            else
            {
                listenThread.Start();
            }
        }

        /// <summary>
        /// 侦听线程
        /// </summary>
        void IPScan()
        {    
            IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });
            TcpListener listener = new TcpListener(ip, 8500);

            listener.Start();           // 开始侦听

            const int BufferSize = 8192;    // 缓存大小,8192字节          
            byte[] buffer = new byte[BufferSize];
            int bytesRead;              
            string msg;

            TcpClient remoteClient;
            NetworkStream streamToClient;

            while (true)//连续侦听
            {
                try
                {
                    // 获取一个连接,中断方法
                    remoteClient = listener.AcceptTcpClient();
                    // 获得流,并写入buffer中
                    streamToClient = remoteClient.GetStream();

                    bytesRead = streamToClient.Read(buffer, 0, BufferSize);

                    // 获得请求的字符串
                    msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
                    msgs.AppendLine(msg);
                    Array.Clear(buffer, 0, bytesRead);

                    Thread.Sleep(1000);
                    #region 反馈结果给客户
                    //可以在此进行其他相关处理
                    byte[] result = Encoding.Unicode.GetBytes("你好啊,兄弟!");
                    streamToClient.Write(result, 0, result.Length);
                    #endregion
                }
                catch (IOException ioe)
                {
                    ;//处理异常
                }
                catch (Exception ex)
                {
                    ;//处理异常
                }
            }
            /*如果套接字是在子线程中创建的,那么在线程停止时(进入Stopped状态),
                * 应该同步停止侦听的连接,否则,下次使用同样的套接字侦听时会报错。*/
            listener.Stop();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            textBox1.Text = msgs.ToString();
        }
        
        //停止侦听
        private void btnStopListen_Click(object sender, EventArgs e)
        {
            listenThread.Suspend();
            timer1.Enabled = false;
            btnStartListen.Enabled = true;
            btnStopListen.Enabled = false;
        }
    }
}



2、客户端部分界面与代码

        客户端做的比较简陋,惭愧。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;               // 引入这两个命名空间,以下同
using System.Net.Sockets;
using System.Threading;
namespace CommonClients
{
    public partial class v : Form
    {
        public v()
        {
            InitializeComponent();
        }

        private void btnSendData_Click(object sender, EventArgs e)
        {
            TcpClient client = new TcpClient();
            try
            {
                client.Connect("127.0.0.1", 8500);      // 与服务器连接
                string msg = textBox1.Text;
                NetworkStream streamToServer = client.GetStream();

                byte[] buffer = Encoding.Unicode.GetBytes(msg);     // 获得缓存
                streamToServer.Write(buffer, 0, buffer.Length);     // 发往服务器
                Thread.Sleep(3000);
                #region 从服务器接收反馈结果
                byte[] receiveBuf=new byte[1024];//接收缓冲区
                int bytesRead = streamToServer.Read(receiveBuf, 0, 1024);
                string msgRead = Encoding.Unicode.GetString(receiveBuf, 0, bytesRead);
                textBox2.Text = msgRead;
                #endregion
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }
        }
    }
}


总结:有关多线程、网络编程的知识还有很多没有涉及,以后慢慢完善。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值