可以把用C#写的聊天室源代码发给我吗?邮箱:zhuihunzhilei@163.com,不好意思,我没分了。

2026年09月25日 18:25
有1个网友回答
网友(1):

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