namespace ChatClient
{
using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Text; public class Class1
{
//UDPClient?象
private static UdpClient m_Client; 
private static UdpClient m_ClientRecive; 
private static string m_hostIp; //本地和?程端口 
private static int RemotePort = 9999; 
//本地主机名称
private static string m_szHostName;
//广播?地址
private static IPAddress m_GroupAddress;
//?程广播?端
private static IPEndPoint m_RemoteEP; 
//跟踪用?是否退出程序
private static bool m_Done = false;
//?示使用方法
public static void Usage()
{
Console.WriteLine("UDP Multicast Chat Utility");
Console.WriteLine("\nUsage:");
Console.WriteLine("chat.exe");
} public static void Initialize()
{
//初始化UDPClient?象
m_Client = new UdpClient(); 
m_ClientRecive=new UdpClient(RemotePort); //主机IP
m_hostIp =(Dns.GetHostByName (Dns.GetHostName() )).AddressList[0].ToString(); //?建多目?广播??象
m_GroupAddress = IPAddress.Broadcast;
//m_GroupAddress = IPAddress.Parse (m_hostIp); //?建?程广播?端
//m_RemoteEP = new IPEndPoint( m_GroupAddress, RemotePort); 
m_RemoteEP = new IPEndPoint(m_GroupAddress, RemotePort); 
 
//加入?
//m_Client.JoinMulticastGroup(m_GroupAddress);

} public static void Terminate()
{
//退出广播?
m_ClientRecive.DropMulticastGroup(IPAddress.Parse (m_hostIp));
} public static void Listener()
{
//?保主?程?始接受用??入
Thread.Sleep(2000);
//ASCII??
Encoding ASCII = Encoding.ASCII;  m_ClientRecive.JoinMulticastGroup(IPAddress.Parse (m_hostIp));

//循?中不断接受数据
while(!m_Done)
{
//加入? 
IPEndPoint endpoint = null;
//接受数据
Byte[] data = m_ClientRecive.Receive(ref endpoint);
//得到数据的ASCII字符串形式
String strData = ASCII.GetString(data);
//如果包含:@
if( strData.IndexOf(":@") > 0 )
{
//先???个?束消息是否来自主?程?是来自其他聊天客?
Char [] separators = {':'};
String [] vars = strData.Split(separators);
//如果是本地机器
if( vars[0] == m_szHostName )
{
//?束?程
//Console.WriteLine("..........");
//在??情况下主?程已?把m_Done??true,
//?里?了保?起?,再次?置m_Done?true
m_Done = true;
}
else
{
//?示消息,某个聊天客?已???
Console.WriteLine("【システム】:{0} 離れた",vars[0]);
}
}
else
{
//如果?是一条聊天消息,???是否来自
//本地机器,如果不是,??示?条消息
if(strData.IndexOf(":") > 0)
{
Char [] separators = {':'};
String [] vars = strData.Split(separators);
if( vars[0] != m_szHostName )        // 本机器的消息
{
Console.WriteLine(strData);
}
}
}
}
//Console.WriteLine("Listener thread finished...");
return;
} public static int Main( String [] args )
{
Initialize();
if( args.Length > 0 )
{
//?示使用方法信息
Usage();
return 1;
}
//得到主机名称和地址
m_szHostName = Dns.GetHostName(); 
//m_szHostName ="wangcs";
//初始化

Console.WriteLine("■ver 1.0  作成 aaa ■  ホスト:ポート「9999」  アドレス「"+ m_hostIp+"」" ); 
Console.WriteLine("------------------------------------------------------------------------------");
Console.WriteLine("注 :'@' 押下して、システム退出\n");
        Console.WriteLine("起動しました...\n");
//?始?听?程 
Thread t = new Thread(new ThreadStart(Listener));
t.Start();
//?送数据使用的?冲区
Byte [] buffer = null;
//??格式
Encoding ASCII = Encoding.ASCII;
//??用?是否按下“@”?
bool m_ShuttingDown = false;
//循??句中?取用?的?入并?送消息
while(!m_ShuttingDown)
{
String s = Console.ReadLine();
//没有?入??循?
if( s.Length == 0 )
continue;
//如果第一个字母?@,?推出循?
if(String.Compare(s,0,"@",0,1) == 0)
{
//停止?听?程中的循?
m_Done = true;
//向其他客??送?束消息
s = m_szHostName + ":@";
m_ShuttingDown = true;
}
else
{
s = m_szHostName + ":" + s;
} //分配?送?冲区空?
buffer = new Byte[s.Length + 1];
//把字符串内容以ASCII??格式放入?送?冲区中
int len = ASCII.GetBytes( s.ToCharArray(), 0, s.Length, buffer, 0);
//?送消息
int ecode = m_Client.Send(buffer, len, m_RemoteEP); 
//?送失?
if(ecode <= 0)
{
Console.WriteLine("エラー : " + ecode);
}
}
//?束?听?程
t.Abort();
t.Join();
//中断和广播?的?接
Console.WriteLine("閉め中...");
Terminate();
return 0;
}
}
}