这篇文章主要为大家详细介绍了C#实现简易多人聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了C#实现简易多人聊天室的具体代码,供大家参考,具体内容如下
只有一个群聊的功能
服务端
使用系统;
使用系统。集合。泛型;
使用系统。组件模型;
使用系统。数据;
使用系统。绘图;
使用系统100 . Linq
使用系统。网;
使用系统. Net。套接字
使用系统。文本;
使用系统。穿线;
使用系统。线程。任务;
使用系统窗户。形式
命名空间FinalChatRoomClient
{
公共分部类客户端:表单
{
//客户端负责接收服务端发来的数据消息的线程
线程线程客户端=空
//创建客户端套接字,负责连接服务器
套接字socketClient=null
公共客户端()
{
初始化组件();
//关闭对文本框跨线程操作的检查
文本框checkforillegalcrosthreadcalls=false;
}
私有void start_Click(对象发送方,EventArgs e)
{
//获得文本框中的互联网协议(互联网协议)地址对象
IP地址地址=地址.解析(txtIp .文字。trim());
//创建包含互联网协议(互联网协议)和端口的网络节点对象
IPEndPoint endPoint=new IPEndPoint(address,int .解析(txtPort .文字。trim()));
//创建客户端套接字,负责连接服务器
socketClient=新套接字(地址家庭.互联网,SocketType .流,协议类型. TCP);
尝试
{
//客户端连接到服务器
socketClient .连接(端点);
ShowMsg('客户端连接服务器成功');
}
catch (SocketException ex)
{
ShowMsg('客户端连接服务器发生异常:'例如.消息);
}
接住(例外ex)
{
ShowMsg('客户端连接服务器发生异常:'例如.消息);
}
线程客户端=新线程(接收msg);
线程客户端IsBackground=true
线程客户端. start();
}
私有void btnSend_Click(对象发送方,EventArgs e)
{
字符串strMsg=txtMsg .文字。trim();
//将字符串转成方便网络传送的二进制数组
字节[] arrMsg=编码10 . UTF8。GetBytes(strMsg);
byte[] arrMsgSend=新字节arrMsg .长度1];
arrMsgSend[0]=0;//设置标识位,0代表发送的是文字
缓冲BlockCopy(arrMsg,0,arrMsgSend,1,arrMsg .长度);
尝试
{
socketClient .send(arrMsgSend);
//清空发送消息文本框中的消息
这个。txtmsg。text=
}
catch (SocketException ex)
{
ShowMsg('客户端发送消息时发生异常:'例如.消息);
}
接住(例外ex)
{
ShowMsg('客户端发送消息时发生异常:'例如.消息);
}
}
私有void ShowMsg(字符串消息)
{
txtRecord .追加文本(msg ' \ r \ n ');
}
私有void ReceiveMsg()
{
而(真)
{
//定义一个接收消息用的字节数组缓冲区(2M大小)
byte[] arrMsgRev=新字节[1024 * 1024 * 2];
//将接收到的数据存入arrMsgRev,并返回真正接收到数据的长度
int length=-1;
尝试
{
长度=socketClient .接收(arrMsgRev);
}
catch (SocketException ex)
{
ShowMsg('客户端接收消息时发生异常:'例如.消息);
打破;
}
接住(例外ex)
{
消息框.显示('客户端接收消息时发生异常:'例如.消息);
打破;
}
//此时是将数组的所有元素(每个字节)都转成字符串,而真正接收到只有服务端发来的几个字符
string strMsgReceive=Encoding .UTF8。GetString(arrMsgRev,0,length);
控制台WriteLine(strmsgreece);
ShowMsg(strmsg receive);
}
}
}
}
客户端
使用系统;
使用系统。集合。泛型;
使用系统。组件模型;
使用系统。数据;
使用系统。绘图;
使用系统100 . Linq
使用系统。网;
使用系统. Net。套接字
使用系统。文本;
使用系统。穿线;
使用系统。线程。任务;
使用系统窗户。形式
命名空间FinalChatRoomClient
{
公共分部类客户端:表单
{
//客户端负责接收服务端发来的数据消息的线程
线程线程客户端=空
//创建客户端套接字,负责连接服务器
套接字socketClient=null
公共客户端()
{
初始化组件();
//关闭对文本框跨线程操作的检查
文本框checkforillegalcrosthreadcalls=false;
}
私有void start_Click(对象发送方,EventArgs e)
{
//获得文本框中的互联网协议(互联网协议)地址对象
IP地址地址=地址.解析(txtIp .文字。trim());
//创建包含互联网协议(互联网协议)和端口的网络节点对象
IPEndPoint endPoint=new IPEndPoint(address,int .解析(txtPort .文字。trim()));
//创建客户端套接字,负责连接服务器
socketClient=新套接字(地址家庭.互联网,SocketType .流,协议类型. TCP);
尝试
{
//客户端连接到服务器
socketClient .连接(端点);
ShowMsg('客户端连接服务器成功');
}
catch (SocketException ex)
{
ShowMsg('客户端连接服务器发生异常:'例如.消息);
}
接住(例外ex)
{
ShowMsg('客户端连接服务器发生异常:'例如.消息);
}
线程客户端=新线程(接收msg);
线程客户端IsBackground=true
线程客户端. start();
}
私有void btnSend_Click(对象发送方,EventArgs e)
{
字符串strMsg=txtMsg .文字。trim();
//将字符串转成方便网络传送的二进制数组
字节[] arrMsg=编码10 . UTF8。GetBytes(strMsg);
byte[] arrMsgSend=新字节arrMsg .长度1];
arrMsgSend[0]=0;//设置标识位,0代表发送的是文字
缓冲BlockCopy(arrMsg,0,arrMsgSend,1,arrMsg .长度);
尝试
{
socketClient .send(arrMsgSend);
//清空发送消息文本框中的消息
这个。txtmsg。text=
}
catch (SocketException ex)
{
ShowMsg('客户端发送消息时发生异常:'例如.消息);
}
接住(例外ex)
{
ShowMsg('客户端发送消息时发生异常:'例如.消息);
}
}
私有void ShowMsg(字符串消息)
{
txtRecord .追加文本(msg ' \ r \ n ');
}
私有void ReceiveMsg()
{
而(真)
{
//定义一个接收消息用的字节数组缓冲区(2M大小)
byte[] arrMsgRev=新字节[1024 * 1024 * 2];
//将接收到的数据存入arrMsgRev,并返回真正接收到数据的长度
int length=-1;
尝试
{
长度=socketClient .接收(arrMsgRev);
}
catch (SocketException ex)
{
ShowMsg('客户端接收消息时发生异常:'例如.消息);
打破;
}
接住(例外ex)
{
消息框.显示('客户端接收消息时发生异常:'例如.消息);
打破;
}
//此时是将数组的所有元素(每个字节)都转成字符串,而真正接收到只有服务端发来的几个字符
string strMsgReceive=Encoding .UTF8。GetString(arrMsgRev,0,length);
控制台WriteLine(strmsgreece);
ShowMsg(strmsg receive);
}
}
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。