www.pudn.com > P2Pprogram.rar > Form1.cs


using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 
 
namespace UDPp2pserver 
{ 
    public partial class ServerForm : Form 
    { 
        public ServerForm() 
        { 
            InitializeComponent(); 
            CheckForIllegalCrossThreadCalls = false; 
            BackColor = Color.Chocolate; 
        } 
         private void ServerForm_Load(object sender, EventArgs e) 
        { 
 
        } 
        static int count=0,i=0;        
        private IPEndPoint hostPoint;        
        UdpClient uc; 
        string[] tokens; 
        string[] reqkey; 
        string[] supkey; 
        string[] ip; 
        string[] port; 
        string msg; 
        bool flag = true; 
        //开启按扭,建立处理客户请求的线程 
        private void start_Click(object sender, EventArgs e) 
        {        
          Thread myThread = new Thread(new ThreadStart(run)); 
            myThread.Start(); 
            rtbmsg.AppendText("中心服务器已启动\n开始监听端口:1025.....\r\n");   
        } 
        //更新RichTextBox的方法 
        private void updatertb(string msg) 
        { 
            rtbmsg.AppendText(msg + "\r\n"); 
        } 
        //更新在线人数的方法 
        private void updateonline(string num) 
        { 
            tbonline.Text = num; 
        } 
        //得到本机有效地址 
        private string getIPAddress() 
        { 
            IPAddress[] AddressList = Dns.GetHostByName(Dns.GetHostName()).AddressList; 
            if (AddressList.Length < 1) 
            { 
                return ""; 
            } 
            return AddressList[0].ToString(); 
        } 
        //处理用户请求的线程方法 
        private void run() 
        { 
            string sendinfo,bufferIP=null,bufferPort=null; 
            byte[] sendinfobyte; 
            string iphost = this.getIPAddress(); 
            string counts; 
            hostPoint = new IPEndPoint(IPAddress.Any, 1025); 
            uc = new UdpClient(hostPoint); 
            reqkey = new string[100]; 
            supkey = new string[100]; 
            tokens = new string[100]; 
            ip = new string[100]; 
            port = new string[100]; 
            while (flag) 
            { 
                try{ 
                    byte[] byteReceive = uc.Receive(ref hostPoint); 
                    string strReceive = System.Text.Encoding.Default.GetString(byteReceive); 
                    //将收到的字符串以“|”分开,并分别存入tokens[]数组中 
                    tokens = strReceive.Split(new Char[] { '|' }); 
                    if (tokens[0] == "join") 
                    { 
                        bufferIP = tokens[1]; 
                        bufferPort = tokens[2]; 
                        msg = tokens[1] + "已加入,请求关键字:"+tokens[3]+"提供了关键字:"+tokens[4]+"\n"; 
                        count++; 
                        reqkey[count] = tokens[3]; 
                        supkey[count] = tokens[4]; 
                        port[count] = tokens[2]; 
                        ip[count] = tokens[1]; 
                        //查找与关键字匹配的IP与Port,并将其发送给客户端 
                        for (i = 0; i < count; i++) 
                        { 
                            if (i < count) 
                            { 
                                if (supkey[i] == tokens[3]) 
                                { 
                                    sendinfo = "0" + "|" + ip[i] + "|" + port[i]; 
                                    sendinfobyte = System.Text.Encoding.Default.GetBytes(sendinfo); 
                                    uc.Send(sendinfobyte, sendinfobyte.Length, tokens[1], Int32.Parse(tokens[2])); 
                                     
                                } 
                                if (reqkey[i] == tokens[4]) 
                                { 
                                    sendinfo = "0" + "|" + tokens[1] + "|" + tokens[2]; 
                                    sendinfobyte = System.Text.Encoding.Default.GetBytes(sendinfo); 
                                    uc.Send(sendinfobyte, sendinfobyte.Length, ip[i], Int32.Parse(port[i])); 
                                     
                                } 
                            } 
                        } 
                    } 
                    else if (tokens[0] == "exit")//客户端离开,把服务器存储的该客户端信息删除,计数减一 
                    { 
                        bufferIP = tokens[1]; 
                        bufferPort = tokens[2]; 
                        msg = bufferIP + " " + bufferPort + "已离开\n"; 
                        
                        for (int j = 0; j <= count; j++) 
                        { 
                            if (ip[j] == tokens[1] && port[j] == tokens[2] && reqkey[j] == tokens[3] && supkey[j] == tokens[4]) 
                            { 
                                for (int k = j; k < count; k++) 
                                { 
                                    ip[k] = ip[k + 1]; 
                                    port[k] = port[k + 1]; 
                                    reqkey[k] = reqkey[k + 1]; 
                                    supkey[k] = supkey[k + 1]; 
                                } 
                                count--; 
                                break; 
                            } 
                        } 
                    } 
 
                    counts = Convert.ToString(count); 
                    this.updateonline(counts); 
                    this.updatertb(msg); 
               } 
                catch (Exception ex) 
                { 
                    rtbmsg.AppendText(ex.Message + "\n"); 
                }   
            } 
        } 
        //退出按扭 
        private void button2_Click(object sender, EventArgs e) 
        { 
            flag = false; 
            uc.Close(); 
            Application.Exit(); 
        } 
 
    } 
}