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


using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Collections; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 
using System.IO; 
namespace UDPp2pclient 
{ 
    public partial class clientform : Form 
    { 
        //构造方法中实现了读资源和随机产生提供给其它用户的资源 
        StreamReader reader; 
        public clientform() 
        { 
            InitializeComponent(); 
            CheckForIllegalCrossThreadCalls = false; 
            BackColor = Color.Chartreuse; 
            string ip = this.getIPAddress(); 
            tbserverIP.Text = ip;//设置了默认服务器IP地址为本机IP 
            label3.Text = "请求的服务器IP(可更改):"; 
 
            //读TXT中数据 
            string FileName = "resource.txt"; 
            reader = null; 
            string str = ""; 
            try 
            { 
                string line; 
                reader = new StreamReader(FileName); 
                str += reader.ReadLine(); 
                while ((line = reader.ReadLine()) != null) 
                { 
                    str += "|" + line; 
                } 
            } 
            catch (Exception ex) 
            { 
                rtbmsg.AppendText(ex.Message + "\n"); 
            } 
 
 
            string[] resource = str.Split('|'); 
            string[] keyandsen; 
            for (int h = 0; h < resource.Length; h++) 
            { 
                int itemno = ListViewKeys.Items.Count; 
                keyandsen = resource[h].Split(':'); 
                string[] subitem ={ keyandsen[0], keyandsen[1] }; 
                ListViewItem aItem = new ListViewItem(subitem); 
                ListViewKeys.Items.Insert(itemno,aItem); 
 
            } 
            Random ra = new Random();//产生随机数 
            int rad = ra.Next(1, resource.Length); 
            keyandsen = resource[rad].Split(':'); 
            tbsentence.Text = keyandsen[1]; 
            supportkey.Text = keyandsen[0]; 
        } 
 
        UdpClient udpclient; 
        private IPEndPoint hostPoint; 
        byte[] buff = new byte[1024]; 
        string str; 
        bool flag = true; 
        string[] tokens; 
 
        //获得有效端口和IP 
        private string getIPAddress() 
        { 
            IPAddress[] AddressList = Dns.GetHostByName(Dns.GetHostName()).AddressList; 
            if (AddressList.Length < 1) 
            { 
                return ""; 
            } 
            return AddressList[0].ToString(); 
        } 
        //向中央服务器请求按扭 
        private void btnreq_Click(object sender, EventArgs e) 
        { 
 
            if (tbserverIP.Text == "") 
            { 
                MessageBox.Show("请输入要请求服务器的IP"); 
            } 
            if (tbport.Text == "") 
            { 
                MessageBox.Show("请输入本机监听的端口号"); 
                 
                reader.Close(); 
                Application.Exit(); 
            } 
            
            udpclient = new UdpClient(Int32.Parse(tbport.Text)); 
            string ip = this.getIPAddress(); 
            if (tbserverIP.Text != ip) 
            { 
                label3.Text = "请求的服务器IP:"; 
            } 
            str = "join" + "|" + ip + "|" + tbport.Text + "|" + keymsg.Text + "|" + supportkey.Text; 
            buff = System.Text.Encoding.Default.GetBytes(str); 
            udpclient.Send(buff,buff.Length,tbserverIP.Text,1025); 
 
            //建线程 
            Thread thread2 = new Thread(new ThreadStart(server)); 
            thread2.Start(); 
 
        } 
 
        private void server() 
        { 
            rtbmsg.AppendText("客户端作为服务器在监听...\r\n"); 
 
            string ip = this.getIPAddress(); 
            hostPoint = null; 
            while (flag) 
            { 
                byte[] byteReceive = udpclient.Receive(ref hostPoint); 
                string strReceive = System.Text.Encoding.Default.GetString(byteReceive); 
                tokens = strReceive.Split(new Char[] { '|' }); 
                if (tokens[0] == "0")//是中央服务器发来的消息 
                { 
                    buff = System.Text.Encoding.Default.GetBytes(keymsg.Text + "|" + ip + "|" + tbport.Text); 
                    rtbmsg.AppendText("服务器已经回应,网中某个用户有我需要的资源,正与其连接....\r\n"); 
                    udpclient.Send(buff, buff.Length,tokens[1], Int32.Parse(tokens[2])); 
                } 
                else if (tokens[0] == supportkey.Text)//是客户端发来的请求消息 
                { 
                    buff = System.Text.Encoding.Default.GetBytes("1" + "|" + tbsentence.Text + "|" + ip + "|" + tbport.Text);//我的句子 
                    rtbmsg.AppendText("有客户端来向我请求信息了!\r\n"); 
                    udpclient.Send(buff, buff.Length, tokens[1],Int32.Parse(tokens[2])); 
                } 
 
                else if (tokens[0] == "1")//客户端发来的回应,并写入一个新的TXT中 
                { 
                    rtbmsg.AppendText("得到了资源:" + tokens[1] + ",来自此IP: " + tokens[2] + ",端口:" + tokens[3] + ",正将此资源保存在本机.." + "\r\n"); 
                    string FileName = "Received.txt"; 
                    StreamWriter writer = null; 
                    try 
                    { 
                        writer = new StreamWriter(FileName); 
                        string str = tokens[1]; 
                        writer.WriteLine(str); 
                     } 
                    catch (Exception e) 
                    { 
                        rtbmsg.AppendText(e.Message); 
                    } 
                    finally 
                    { 
                        writer.Close(); 
                    } 
                } 
            } 
        } 
 
        private void btnexit_Click(object sender,EventArgs e) 
        { 
            string ip = this.getIPAddress(); 
            str = "exit" + "|" + ip + "|" + tbport.Text + "|" + keymsg.Text + "|" + supportkey.Text; 
            flag = false; 
            buff = System.Text.Encoding.Default.GetBytes(str); 
            udpclient.Send(buff, buff.Length, tbserverIP.Text, 1025); 
            udpclient.Close(); 
            reader.Close(); 
            Application.Exit(); 
        } 
    } 
}