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();
}
}
}