问题:用C#写的聊天程序,贴出所有的源代码,大家帮忙瞧瞧!?
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 int LocalPort = 8080;
private static int RemotePort = 8080;
//本地主机名称
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(LocalPort);
//创建多目标广播组对象
m_GroupAddress = IPAddress.Broadcast;
//加入组
m_Client.JoinMulticastGroup(m_GroupAddress);
//创建远程广播组端
m_RemoteEP = new IPEndPoint( m_GroupAddress, RemotePort);
}
public static void Terminate()
{
//退出广播组
m_Client.DropMulticastGroup(m_GroupAddress);
}
public static void Listener()
{
//确保主线程开始接受用户输入
Thread.Sleep(2000);
//ASCII编码
Encoding ASCII = Encoding.ASCII;
//循环中不断接受数据
while(!m_Done)
{
IPEndPoint endpoint = null;
//接受数据
Byte[] data = m_Client.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("shutting down Listener thread...");
//在这种情况下主线程已经把m_Done设为true,
//这里为了保险起见,再次设置m_Done为true
m_Done = true;
}
else
{
//显示消息,某个聊天客户已经离开
Console.WriteLine("{0} has left the conversation", 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 )
{
if( args.Length > 0 )
{
//显示使用方法信息
Usage();
return 1;
}
//得到主机名称和地址
//m_szHostName = Dns.GetHostName(); IT超人
m_szHostName = "127.0.0.1";
//初始化
Console.WriteLine("Initializing...");
Initialize();
//开始监听线程
Console.WriteLine("Starting Listener thread...");
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("Error in send : " + ecode);
}
}
//结束监听线程
t.Abort();
t.Join();
//中断和广播组的连接
Console.WriteLine("Closing connection...");
Terminate();
return 0;
}
}
}
提问时间:
2005-9-28 10:29:45 回答次数:
(14) 提问人:
软界网友 我来回答