您的位置:首页 > 理论基础 > 计算机网络

代码篇C#网络编程之局域网聊天

2015-09-13 13:59 531 查看
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace _008_局域网聊天室
{
    public partial class Form1 : Form
    {
        //--tcplistener
        private TcpListener myTcpListener;
        //--创建接收客户端连接线程
        private Thread AcceptClientThread;
        //--
        private Dictionary<string, Socket> ClientSocketDic;
        //--
        private TcpClient tcpClient;

        //--
        private delegate void ReceiveClientCallBack(string endPoint);
        private ReceiveClientCallBack receiveClientCallBack;
        //-删除客户端回调
        private delegate void DeleteClientCallBack(int index);
        private DeleteClientCallBack deleteClientCallBack;
        //---添加消息回调
        private delegate void ShowMessageCallBack(string text);
        private ShowMessageCallBack showMessageCallBack;

        public Form1()
        {
            InitializeComponent();
        }

        //---启动服务器按钮被单击事件
        private void btn_start_Click(object sender, EventArgs e)
        {
            try
            {
                ///---创建IP终端节点
                IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(textbox_serverIP.Text), Convert.ToInt32(textbox_serverPort.Text));
                //--创建实例化TCP连接监听器
                myTcpListener = new TcpListener(ipEndPoint);
                //---启动监听
                myTcpListener.Start();
                //--实例化接收客户端连接请求
                AcceptClientThread = new Thread(AcceptClient);
                AcceptClientThread.IsBackground = true;
                AcceptClientThread.Start();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //---接收客户端连接请求
        private void AcceptClient()
        {
            try
            {
                while (true)
                {
                    tcpClient = myTcpListener.AcceptTcpClient();
                    Thread ReceiveThread = new Thread(ClientService);
                    ReceiveThread.IsBackground = true;
                    ReceiveThread.Start();
                    //---更新客户端列表
                    listbox_client.Invoke(receiveClientCallBack, tcpClient.Client.RemoteEndPoint.ToString());
                    //---将客户端加入字典
                    ClientSocketDic.Add(tcpClient.Client.RemoteEndPoint.ToString(), tcpClient.Client);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //---客户端服务线程
        private void ClientService()
        {
            //--
            TcpClient client = tcpClient;
            //--
            string endPoint = tcpClient.Client.RemoteEndPoint.ToString();
            NetworkStream ns = tcpClient.GetStream();
            while(true)
            {
                try
                {
                    int readLen = client.Available;
                    if (0  < readLen)
                    {
                        byte[] getData = new byte[1024];
                        ns.Read(getData, 0, getData.Length);
                        string getMsg = Encoding.Default.GetString(getData);
                        if (0 == getMsg.Replace("\0", "").Length)
                        {
                            //--掉线
                            for (int i = 0; i < listbox_client.Items.Count; i++)
                            {
                                if (string.Equals(endPoint, listbox_client.Items[i].ToString()))
                                {
                                    listbox_client.Invoke(deleteClientCallBack, i);
                                }
                            }
                            //---将掉线客户端从字典删除
                            ClientSocketDic.Remove(endPoint);
                            break;
                        }

                        //--将消息添加至消息列表
                        listbox_message.Invoke(showMessageCallBack, getMsg.Replace("\0",""));
                        //--消息转发
                        for (int i = 0; i < listbox_client.Items.Count; i++)
                        {
                            if (!string.Equals(endPoint, listbox_client.Items[i].ToString()))
                            {
                                ClientSocketDic[listbox_client.Items[i].ToString()].Send(Encoding.Default.GetBytes(endPoint + ":" + getMsg.Replace("\0", "")));
                            }
                        }
                     }
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    if (null != ns)
                    {
                        ns.Dispose();
                    }
                }
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //---初始化回调委托
            receiveClientCallBack = new ReceiveClientCallBack(NewClient);
            deleteClientCallBack = new DeleteClientCallBack(DeleteClient);
            showMessageCallBack = new ShowMessageCallBack(ShowMessage);
            ClientSocketDic = new Dictionary<string,Socket>;
        }

        //---添加客户端回调方法
        private void NewClient(string text)
        {
            listbox_client.Items.Add(text);
        }

        //---删除客户端回调委托
        private void DeleteClient(int index)
        {
            listbox_client.Items.RemoveAt(index);

        }

        //---显示消息回调方法
        private void ShowMessage(string text)
        {
            listbox_message.Items.Add(text);
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: