散分贴。C#编局域网QQ思路及实现方法,指高手指点建议

andy1118 2010-09-09 02:23:50
昨天编了个局域网QQ,能够实现基本的聊天功能了,现把思路及方法分享。指高手指点建议
用了三个窗体:一个登录窗体,登录成功后关闭,启动《显示在线好友》的窗体,
点击在线好友,启动聊天窗体。我把QQ号码放在一台SQL服务器上的,登录窗体就是验证QQ号码及密码正确否

在线好友窗体,Load事件:
一,向数据库中写进自己的IP地址,侦听端口及在线状态
二,从数据库中读出所有在线的QQ用户名称及其IP地址,侦听端口,添加进QQ在线好友列表
三,启动自己的侦听服务,以便别的QQ在线好友可以连接自己,实现和自己聊天
四,双击QQ好友列表中的任一个在线用户,连接此QQ的IP地址,侦听端口,打开聊天窗体开始聊天

界面见下参考(比较简陋):




用到的技术Socket及多线程,如在线好友窗体启动侦听端口另开线程
Thread threadListen = new Thread(ServerListen);
threadListen.Start();

private void ServerListen()
{
while (true) //侦听客户连接
{
TcpClient tcpClient = serverListener.AcceptTcpClient();
if (tcpClient.Connected)
{ //如果有客户建立连接,又再打开线程开启聊天窗体聊天
Thread threadClient = new Thread(ClientConnect);
threadClient.Start(tcpClient);
}
}
}

//如果有客户建立连接,又再打开线程开启聊天窗体聊天
private void ClientConnect(object sender)
{
Application.Run(new FrmChat(sender,this.Text,null));
}

//聊天窗体发送聊天内容
private void button1_Click(object sender, EventArgs e)
{
//发送聊天内容
NetworkStream netStream = tcpClient.GetStream();
byte[] bBuffer = Encoding.GetEncoding("gb2312").GetBytes(sLocalUserName + " " + DateTime.Now.ToString() + "\n " + richTextBox2.Text + "\n");
netStream.Write(bBuffer, 0, bBuffer.Length);
richTextBox1.AppendText(sLocalUserName + " " + DateTime.Now.ToString() + "\n " + richTextBox2.Text + "\n");
richTextBox2.Text = "";
richTextBox2.Focus();
richTextBox2.SelectAll();
}

要注意的是聊天窗体接收聊天内容也要另开线程,否则用户界面会卡住,以下是聊天窗体的Load事件
private void FrmChat_Load(object sender, EventArgs e)
{
IPEndPoint remoteEndPoint = (IPEndPoint)tcpClient.Client.RemoteEndPoint;
if (sRemoteUserName != null)
{
NetworkStream netStream = tcpClient.GetStream();
byte[] bBuffer = Encoding.GetEncoding("gb2312").GetBytes(sLocalUserName + "和您建立了连接,准备与您会话,请知悉。谢谢!\n\n");
netStream.Write(bBuffer, 0, bBuffer.Length);
}
Thread threadRecv = new Thread(RecvData); //再开线程,用于接收聊天内容,代码见下,继续贴出
threadRecv.Start();
richTextBox2.Focus();
richTextBox2.SelectAll();
}

//接收聊天内容
private void RecvData()
{
while (true)
{
try
{
if (tcpClient.Connected)
{
NetworkStream netStream = tcpClient.GetStream();
int iRecvLength = netStream.Read(bBuffer, 0, 1024);
if (iRecvLength > 0)
{
sRecvStr = Encoding.GetEncoding("gb2312").GetString(bBuffer, 0, iRecvLength);
if (sRecvStr.StartsWith("Exit Quit Close Offline"))
{
sRecvStr = sRemoteUserName + "和您断开了连接,无法与您会话,请知悉。谢谢!\n";
richTextBox2.ReadOnly = true;
button1.Enabled = false;
}
richTextBox1.AppendText(sRecvStr);
if (sRecvStr.Substring(sRecvStr.Length - 24, 22).StartsWith("和您建立了连接,准备与您会话,请知悉。谢谢!"))
{
sRemoteUserName = sRecvStr.Substring(0, sRecvStr.Length - 24);
this.Text = "和" + sRemoteUserName + "会话中";
}
}
}
}
catch
{
}
}
}
...全文
246 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
chuanzhang5687 2010-09-10
  • 打赏
  • 举报
回复
既然都链接数据库了 怎么不再登陆界面上设置个注册功能
这个项目基本上就是靠socket通信机制完成 捎带一点多线程
xiyunfei_ff 2010-09-10
  • 打赏
  • 举报
回复
为什么不用IOCP模型
liconglu 2010-09-10
  • 打赏
  • 举报
回复
文件夹传输功能比较麻烦,试验过没有什么满意的解决方案
萨拉嘿 2010-09-10
  • 打赏
  • 举报
回复
多线程时控件赋值得使用委托,再个多注意客户端断开时的资源释放问题
netstray 2010-09-10
  • 打赏
  • 举报
回复
支持,关注……
andy1118 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 javabegin 的回复:]
北大青鸟没有这么高的技术,他们的qq就是直接查数据库的。根本没有用socket。

还应该有群聊功能
[/Quote]

谢谢!一步一步学,一步一步实现,先实现文件传输功能,再实现群聊功能

慢慢来,祝你们开心快乐
q107770540 2010-09-10
  • 打赏
  • 举报
回复
andy1118 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 laj0600310219 的回复:]
http://download.csdn.net/source/2654937
这是我以前用UDP协议做的一个局域网内的QQ,你可以学习一下。
[/Quote]

谢谢,今天准备实现文件传输功能
willy2358 2010-09-10
  • 打赏
  • 举报
回复
学习学习。
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 li_1042237864 的回复:]
引用 7 楼 quchumin 的回复:
楼主北青的吧。
应该是做qq项目?
建议你使用北青提供的qq分组控件。
我们在做qq项目的时候没有扩展局域网聊天功能。


什么是北青? 北大青鸟? 人家都亲切的说青鸟 北青还是头一次听说
我是来接分的
[/Quote]
很多人都这样说啊。我也是北大青鸟的。
laichunlin 2010-09-09
  • 打赏
  • 举报
回复
页面间传值较难弄,关闭时经常出错!
javabegin 2010-09-09
  • 打赏
  • 举报
回复
北大青鸟没有这么高的技术,他们的qq就是直接查数据库的。根本没有用socket。

还应该有群聊功能
laj0600310219 2010-09-09
  • 打赏
  • 举报
回复
http://download.csdn.net/source/2654937
这是我以前用UDP协议做的一个局域网内的QQ,你可以学习一下。
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
socket,我也用过,还行,局域网内聊天发送信息一般都这样,不知道怎么实现外网那样的QQ,有什么不同
纯唇Yu弄 2010-09-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 quchumin 的回复:]
楼主北青的吧。
应该是做qq项目?
建议你使用北青提供的qq分组控件。
我们在做qq项目的时候没有扩展局域网聊天功能。
[/Quote]

什么是北青? 北大青鸟? 人家都亲切的说青鸟 北青还是头一次听说
我是来接分的
  • 打赏
  • 举报
回复
楼主北青的吧。
应该是做qq项目?
建议你使用北青提供的qq分组控件。
我们在做qq项目的时候没有扩展局域网聊天功能。
wubudang 2010-09-09
  • 打赏
  • 举报
回复
飞秋怎么实现的,我这方面知道的少。
haifeng39 2010-09-09
  • 打赏
  • 举报
回复
不错,支持。
billclinton8 2010-09-09
  • 打赏
  • 举报
回复
就是 通过TCP 点对点的通讯撒
加载更多回复(2)

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧