首頁 > 軟體

C#實現簡易多人聊天室

2022-02-11 10:03:18

本文範例為大家分享了C#實現簡易多人聊天室的具體程式碼,供大家參考,具體內容如下

只有一個群聊的功能

伺服器端

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FinalChatRoomClient
{
    public partial class Client : Form
    {
        //使用者端負責接收伺服器端發來的資料訊息的執行緒
        Thread threadClient = null;
        //建立使用者端通訊端,負責連線伺服器
        Socket socketClient = null;

        public Client()
        {
            InitializeComponent();
            //關閉對文字方塊跨執行緒操作的檢查
            TextBox.CheckForIllegalCrossThreadCalls = false;
        }

        private void start_Click(object sender, EventArgs e)
        {
            //獲得文字方塊中的IP地址物件
            IPAddress address = IPAddress.Parse(txtIp.Text.Trim());
            //建立包含IP和埠的網路節點物件
            IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
            //建立使用者端通訊端,負責連線伺服器
            socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                //使用者端連線到伺服器
                socketClient.Connect(endPoint);
                ShowMsg("使用者端連線伺服器成功");
            }
            catch (SocketException ex)
            {
                ShowMsg("使用者端連線伺服器發生異常:" + ex.Message);
            }
            catch (Exception ex)
            {
                ShowMsg("使用者端連線伺服器發生異常:" + ex.Message);
            }

            threadClient = new Thread(ReceiveMsg);
            threadClient.IsBackground = true;
            threadClient.Start();
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            string strMsg = txtMsg.Text.Trim();
            //將字串轉成方便網路傳送的二進位制陣列
            byte[] arrMsg = Encoding.UTF8.GetBytes(strMsg);
            byte[] arrMsgSend = new byte[arrMsg.Length + 1];
            arrMsgSend[0] = 0;//設定標識位,0代表傳送的是文字
            Buffer.BlockCopy(arrMsg, 0, arrMsgSend, 1, arrMsg.Length);
            try
            {
                socketClient.Send(arrMsgSend);

                //清空傳送訊息文字方塊中的訊息
                this.txtMsg.Text = "";
            }
            catch (SocketException ex)
            {
                ShowMsg("使用者端傳送訊息時發生異常:" + ex.Message);
            }
            catch (Exception ex)
            {
                ShowMsg("使用者端傳送訊息時發生異常:" + ex.Message);
            }
        }

        private void ShowMsg(string msg)
        {
            txtRecord.AppendText(msg + "rn");
        }

        private void ReceiveMsg()
        {
            while (true)
            {
                //定義一個接收訊息用的位元組陣列緩衝區(2M大小)
                byte[] arrMsgRev = new byte[1024 * 1024 * 2];
                //將接收到的資料存入arrMsgRev,並返回真正接收到資料的長度
                int length = -1;
                try
                {
                    length = socketClient.Receive(arrMsgRev);
                }
                catch (SocketException ex)
                {
                    ShowMsg("使用者端接收訊息時發生異常:" + ex.Message);
                    break;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("使用者端接收訊息時發生異常:" + ex.Message);
                    break;
                }

                //此時是將陣列的所有元素(每個位元組)都轉成字串,而真正接收到只有伺服器端發來的幾個字元
                string strMsgReceive = Encoding.UTF8.GetString(arrMsgRev, 0, length);
                Console.WriteLine(strMsgReceive);
                ShowMsg(strMsgReceive);
            }
        }
    }
}

使用者端

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FinalChatRoomClient
{
    public partial class Client : Form
    {
        //使用者端負責接收伺服器端發來的資料訊息的執行緒
        Thread threadClient = null;
        //建立使用者端通訊端,負責連線伺服器
        Socket socketClient = null;

        public Client()
        {
            InitializeComponent();
            //關閉對文字方塊跨執行緒操作的檢查
            TextBox.CheckForIllegalCrossThreadCalls = false;
        }

        private void start_Click(object sender, EventArgs e)
        {
            //獲得文字方塊中的IP地址物件
            IPAddress address = IPAddress.Parse(txtIp.Text.Trim());
            //建立包含IP和埠的網路節點物件
            IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
            //建立使用者端通訊端,負責連線伺服器
            socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                //使用者端連線到伺服器
                socketClient.Connect(endPoint);
                ShowMsg("使用者端連線伺服器成功");
            }
            catch (SocketException ex)
            {
                ShowMsg("使用者端連線伺服器發生異常:" + ex.Message);
            }
            catch (Exception ex)
            {
                ShowMsg("使用者端連線伺服器發生異常:" + ex.Message);
            }

            threadClient = new Thread(ReceiveMsg);
            threadClient.IsBackground = true;
            threadClient.Start();
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            string strMsg = txtMsg.Text.Trim();
            //將字串轉成方便網路傳送的二進位制陣列
            byte[] arrMsg = Encoding.UTF8.GetBytes(strMsg);
            byte[] arrMsgSend = new byte[arrMsg.Length + 1];
            arrMsgSend[0] = 0;//設定標識位,0代表傳送的是文字
            Buffer.BlockCopy(arrMsg, 0, arrMsgSend, 1, arrMsg.Length);
            try
            {
                socketClient.Send(arrMsgSend);

                //清空傳送訊息文字方塊中的訊息
                this.txtMsg.Text = "";
            }
            catch (SocketException ex)
            {
                ShowMsg("使用者端傳送訊息時發生異常:" + ex.Message);
            }
            catch (Exception ex)
            {
                ShowMsg("使用者端傳送訊息時發生異常:" + ex.Message);
            }
        }

        private void ShowMsg(string msg)
        {
            txtRecord.AppendText(msg + "rn");
        }

        private void ReceiveMsg()
        {
            while (true)
            {
                //定義一個接收訊息用的位元組陣列緩衝區(2M大小)
                byte[] arrMsgRev = new byte[1024 * 1024 * 2];
                //將接收到的資料存入arrMsgRev,並返回真正接收到資料的長度
                int length = -1;
                try
                {
                    length = socketClient.Receive(arrMsgRev);
                }
                catch (SocketException ex)
                {
                    ShowMsg("使用者端接收訊息時發生異常:" + ex.Message);
                    break;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("使用者端接收訊息時發生異常:" + ex.Message);
                    break;
                }

                //此時是將陣列的所有元素(每個位元組)都轉成字串,而真正接收到只有伺服器端發來的幾個字元
                string strMsgReceive = Encoding.UTF8.GetString(arrMsgRev, 0, length);
                Console.WriteLine(strMsgReceive);
                ShowMsg(strMsgReceive);
            }
        }
    }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com