Socket通讯备忘录

服务器端
public partial class ServerFrm :Form, CRM.IPlugin.IVote
{
public ServerFrm()
{
InitializeComponent();
}

    private void ServerFrm_Load(object sender, EventArgs e)
    {
        this.Text = "服务器端";
        chatContent.ScrollToCaret();
        
    }
    #region 插件接口
    public string GetPluginName()
    {
        return "服务器端";
    }

    public void SetUp()
    {
        FormCollection formCollection = Application.OpenForms;
        if (formCollection[this.Name] != null)
        {
            (formCollection[this.Name] as Form).WindowState = FormWindowState.Normal;
            (formCollection[this.Name] as Form).Focus();
            (formCollection[this.Name] as Form).IsMdiContainer = false;
            this.Dispose();
        }
        else
        {
            this.Show();
        }
    }
    #endregion
    /// <summary>
    /// 负责监听客户端的线程
    /// </summary>
    Thread threadWatch = null;
    /// <summary>
    /// 负责监听客户端的套接字
    /// </summary>
    Socket socketWatch = null;
    /// <summary>
    /// 负责和客户端通信的套接字
    /// </summary>
    Socket clientConnection = null;

    public delegate void delegateShow();
    public delegate void DelegateShow(string msg);
    /// <summary>
    /// 开始监听
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button1_Click(object sender, EventArgs e)
    {
        if (string.IsNullOrEmpty(textBox1.Text.Trim()))
        {
            MessageBox.Show("监听IP地址不能为空");
            return;
        }
        if (string.IsNullOrEmpty(textBox2.Text.Trim()))
        {
            MessageBox.Show("监听端口不能为空");
            return;
        }
        // 一个套接字用于监听客户端发来的消息,包含三个参数(ipv4寻址协议,流式连接,tcp协议)
        socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        // 服务端发送消息需要一个ip地址和端口号
        IPAddress ip = IPAddress.Parse(textBox1.Text);
        // 把ip地址和端口号绑定在网路节点endport上
        IPEndPoint endPoint = new IPEndPoint(ip, int.Parse(textBox2.Text));

        // 监听绑定的网路节点
        socketWatch.Bind(endPoint);
        // 将套接字的监听队列长度设置限制为0,0表示无限
        socketWatch.Listen(0);


        // 创建一个监听线程
        threadWatch = new Thread(WatchConnecting);
        threadWatch.IsBackground = true;
        //threadWatch.Name = "监听线程";
        threadWatch.Start();
        
        chatContent.AppendText("成功启动监听!"+ "\r\n");
    }     
    /// <summary>
    /// 接收客户端发来的请求
    /// </summary>
    private void WatchConnecting()
    {
        while (true)
        {
            //持续不断监听客户端发来的请求
            clientConnection = socketWatch.Accept();
	//这里使用委托,因为在一个线程中使用控件的时候,因为.net的安全机制,会出现问题。因此使用一个委托去使用这个控件。
            delegateShow @delegate = new delegateShow(ContextShow);
            ///Todo  .....
            ///
            chatContent.Invoke(@delegate);
             
            //创建一个通信线程
            ParameterizedThreadStart pts = new ParameterizedThreadStart(acceptMsg);
            Thread thr = new Thread(pts);
            thr.IsBackground = true;
            thr.Start(clientConnection);

        }
    }

    private void ContextShow()
    {
        chatContent.AppendText("客户端连接成功" +A+ "\r\n");
    }

    //delegate void Action2<in T>(T t);
    private void acceptMsg(object socket)
    {
        Socket socketServer = socket as Socket;
        while (true)
        {
            //创建一个内存缓冲区 其大小为1024*1024字节  即1M
            byte[] recMsg = new byte[1024*1024];
            //将接收到的信息存入到内存缓冲区,并返回其字节数组的长度
            int length = socketServer.Receive(recMsg);
            string a= socketServer.RemoteEndPoint.ToString();
            //将机器接受到的字节数组转换为人可以读懂的字符串
            string msg = Encoding.UTF8.GetString(recMsg, 0, length) +"\r\n"+ a;
            //chatContent.AppendText("客户端:" + GetCurrentTime() + msg + "\r" + "\r\n");
            DelegateShow @delegate = new DelegateShow(chatContentShow);
            chatContent.Invoke(@delegate, msg);
               
        }
    }

    private void chatContentShow(string msg)
    {
        chatContent.AppendText("客户端:" + GetCurrentTime()+"\r" + msg + "\r\n");
    }
    /// <summary>
    /// 获取系统当前时间
    /// </summary>
    /// <returns></returns>
    private DateTime GetCurrentTime()
    {
        DateTime currentTime = new DateTime();
        currentTime = DateTime.Now;
        return currentTime;
    }
    /// <summary>
    /// 向客户端发送消息
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button2_Click(object sender, EventArgs e)
    {
        byte[] sendMsg = Encoding.UTF8.GetBytes(richTextBox2.Text);
        string msg = Encoding.UTF8.GetString(sendMsg);
        clientConnection.Send(sendMsg);
        chatContent.AppendText("服务器:" + GetCurrentTime() + "\r" + msg+"\r\n");
    }
}
  • 客户端

    public partial class ClientFrm : Form,CRM.IPlugin.IVote
    {
    public ClientFrm()
    {
    InitializeComponent();
    }
    #region 插件接口
    public string GetPluginName()
    {
    return “客户端”;
    }
    public void SetUp()
    {
    FormCollection formCollection = Application.OpenForms;
    if (formCollection[this.Name] != null)
    {
    (formCollection[this.Name] as Form).WindowState = FormWindowState.Normal;
    (formCollection[this.Name] as Form).Focus();
    (formCollection[this.Name] as Form).IsMdiContainer = false;
    this.Dispose();
    }
    else
    {
    this.Show();
    }
    }
    #endregion

     private void ClientFrm_Load(object sender, EventArgs e)
     {
         this.Text = "客户端";
         chatContent.ScrollToCaret();
     }
    
     /// <summary>
     /// 客户端套接字
     /// </summary>
     Socket clientSocket = null;
     /// <summary>
     /// 监听服务端的进程
     /// </summary>
     Thread threadServer = null;
     /// <summary>
     /// 由于.net的安全机制,需要在线程中使用插件,需要使用委托去调用插件。
     /// </summary>
     /// <param name="Msg"></param>
     public delegate void DelegateShow(string Msg);
    
     private void button1_Click(object sender, EventArgs e)
     {
         if (string.IsNullOrEmpty(textBox1.Text))
         {
             MessageBox.Show("IP地址不能为空");
             return;
         }
         if (string.IsNullOrEmpty(textBox2.Text))
         {
             MessageBox.Show("端口号不能为空");
             return;
         }
         clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
         IPAddress iP = IPAddress.Parse(textBox1.Text.Trim());
         IPEndPoint endPoint = new IPEndPoint(iP,int.Parse(textBox2.Text.Trim()));
         try
         {
             //这里客户端套接字连接到网络节点(服务端)用的方法是Connect 而不是Bind
             clientSocket.Connect(endPoint);
             chatContent.AppendText("连接成功!"+GetCurrentTime()+"\r\n");
    
         }
         catch (Exception ex)
         {
    
             chatContent.AppendText("连接失败!");
             MessageBox.Show(ex.Message);
             return;
         }
         // 创建一个线程监听服务端发来的消息
         threadServer = new Thread(recMsg);
         threadServer.IsBackground = true;
         threadServer.Start();
    
     }
     /// <summary>
     /// 接收服务端发来的消息
     /// </summary>
     private void recMsg()
     {
         while (true)
         {
             //定义一个1M的内存缓冲区 用于临时性存储接收到的信息
             byte[] arrRecMsg = new byte[1024 * 1024];
             int length = 0;
             try
             {
                 //将客户端套接字接收到的数据存入内存缓冲区, 并获取其长度
                 length= clientSocket.Receive(arrRecMsg);
    
             }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.Message);
                 return;
             }
             //将套接字获取到的字节数组转换为人可以看懂的字符串
             string strRecMsg = Encoding.UTF8.GetString(arrRecMsg, 0, length);
    
             DelegateShow @delegate = new DelegateShow(delegateShow);
             chatContent.Invoke(@delegate, strRecMsg);
             
    
         }
     }
    
     private void delegateShow(string Msg)
     {
         chatContent.AppendText("服务器端:" + GetCurrentTime()+"\r" + Msg + "\r\n");
     }
    
     /// <summary>
     /// 获取系统当前时间
     /// </summary>
     /// <returns></returns>
     private DateTime GetCurrentTime()
     {
         DateTime currentTime = new DateTime();
         currentTime = DateTime.Now;
         return currentTime;
     }
     /// <summary>
     /// 发送消息到客户端
     /// </summary>
     /// <param name="sender"></param>
     /// <param name="e"></param>
     private void button2_Click(object sender, EventArgs e)
     {
         byte[] sendMsg = Encoding.UTF8.GetBytes(richTextBox2.Text.Trim());
         string msg = Encoding.UTF8.GetString(sendMsg);
         clientSocket.Send(sendMsg);
         chatContent.AppendText("客户端:" + GetCurrentTime() +"\r"+ msg + "\r\n");
    
     }
    

猜你喜欢

转载自blog.csdn.net/qq_37555752/article/details/84876717