基本信息
源码名称:C# 写的多人聊天实例
源码大小:0.15M
文件格式:.rar
开发语言:C#
更新时间:2016-10-09
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):78630559

本次赞助数额为: 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.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace MultiChatServer
{
    public partial class Form1 : Form
    {
        private Socket ServerSocket;//服务端运行的Socket
        private Thread ServerThread;//服务端运行的线程
        private Socket[] ClientSocket;//为客户端建立的SOCKET连接
        private int ClientNumber;//存放客户端连接的数量
        private byte[] recieve;//存放消息数据
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            StartStopServer.Text = "开启服务器";
            Say.Text = "";
            label2.Text = "";
        }
        private int GetPort()
        {
            return 1998;
        }
        private void StartStopServer_Click(object sender, EventArgs e)
        {
            if (StartStopServer.Text == "开启服务器")
            {
                ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Any;
                IPEndPoint ipe = new IPEndPoint(ip, GetPort());
                ServerSocket.Bind(ipe);//将Socket端口和ip端口绑定
                ServerSocket.Listen(10);//开始监听,并且挂起的数为10
                ClientSocket=new Socket[65535];//为客户端提供连接个数
                recieve = new byte[65535];
                ClientNumber = 0;
                ServerThread = new Thread(RecieveAccept);
                ServerThread.Start();//开始线程
                Control.CheckForIllegalCrossThreadCalls = false;//??不懂??不捕获对错误线程的调用
                StartStopServer.Text = "停止服务器";
                Say.Text = "正在运行";
                clientList.Items.Add("服务器于"   DateTime.Now   "开始运行... ...");
            }
            else if(StartStopServer.Text=="停止服务器")
            {
                ServerThread.Abort();//线程终止
                ServerSocket.Close();//连接并释放所有的资源

                StartStopServer.Text = "开启服务器";
                Say.Text = "已经停止";
                clientList.Items.Add("服务器于"   DateTime.Now   "结束.");
            }
        }
        private void RecieveAccept()
        {
            while (true)
            {
                //Accept 以同步方式从侦听套接字的连接请求队列中提取第一个挂起的连接请求,然后创建并返回新的 Socket。
                //在阻止模式中,Accept 将一直处于阻止状态,直到传入的连接尝试排入队列。连接被接受后,原来的 Socket 继续将传入的连接请求排入队列,直到您关闭它。
                ClientSocket[ClientNumber] = ServerSocket.Accept();
                ////ClientSocket[ClientNumber].Receive();
                //string str = "";
                //int bytes;
                //bytes = ClientSocket[ClientNumber].Receive(recieve,recieve.Length,0);       //从客户端接受信息
                //str  = Encoding.ASCII.GetString(recieve, 0, bytes);       //流的二进制读写器,从流的0字节开始读bytes字节到recvBytes数组中.Encoding描述为“类的新实例的编码类”
                ////Console.WriteLine("Server get clientMessage :"   recvstr);
                ////accept.Text  = recvstr   Environment.NewLine;

                //byte[] bs = Encoding.ASCII.GetBytes(str);//想要发送的字符,转换为ASCII码
                ////temp.Send(bs, bs.Length, 0);   //返回客户端信息成功
                //for (int i = 0; i < ClientNumber; i  )
                //{
                //    if (ClientSocket[i].Connected)
                //    {
                //        ClientSocket[i].Send(bs, bs.Length, 0);
                //    }
                //}   
                ClientSocket[ClientNumber].BeginReceive(recieve, 0, recieve.Length, SocketFlags.None,
                    new AsyncCallback(RecieveCallBack), ClientSocket[ClientNumber]);
                lock(this.clientList)//简单线程锁,保证其后面的代码一次执行完毕,期间不允许执行其他线程
                {
                    clientList.Items.Add(ClientSocket[ClientNumber].RemoteEndPoint.ToString() "成功连接服务器");//获取的远程终结点
                }
                ClientNumber  ;                                      
            }
        }
        private void RecieveCallBack(IAsyncResult AR)
        {
            try
            {
                Socket RSocket = (Socket)AR.AsyncState;
                int REnd = RSocket.EndReceive(AR);
                //对每一个侦听的客户端端口信息进行接收和回发
                for (int i = 0; i < ClientNumber; i  )
                {
                    if (ClientSocket[i].Connected)
                    {
                        //回发数据到客户端
                        ClientSocket[i].Send(recieve, 0, REnd, SocketFlags.None);
                    }
                    //同时接收客户端回发的数据,用于回发
                    RSocket.BeginReceive(recieve, 0, recieve.Length, 0, new AsyncCallback(RecieveCallBack), RSocket);
                }
            }
            catch { }
        }
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (ServerThread != null)
            {
                ServerThread.Abort();//线程终止
                ServerSocket.Close();//关闭SOCKET
                Application.Exit();
            }
        }
    }
}