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