用c#实现类似QQ的简单通讯程序

转载 2007年10月09日 09:53:00
 

本文介绍了用c#实现的一个类似QQ的局域网通讯程序,当点击最小化程序跑到系统托盘里,双击托盘可以可以显示主页面。

程序运行界面如下:

托盘里的菜单如下:

c#作为微软.Net战略的重要棋子,对网络编程提供了很好的支持和优化。实现起来特别方便,还是看代码吧,已经注释的很清楚了。

代码如下:

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using System.IO;

using System.Net.Sockets;

using System.Threading;

namespace p2pChat

 }

#endregion

///

/// 应用程序的主入口点。

///

[STAThread]

static void Main()

{

Application.Run(new MainForm());

}

//开始监听

private void Listen()

{

try

 {

 tcpLister.Start();

 while(true)

 {

 Socket s = tcpLister.AcceptSocket();

 Byte[] stream = new Byte[80];

 int i = s.Receive(stream);

 string message = System.Text.Encoding.UTF8.GetString(stream);

 this.txtRecord.AppendText(message);

 }

 }

 catch(System.Security.SecurityException)

 {

 MessageBox.Show("防火墙安全错误!","错误",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);

 }

 catch(System.Exception)

 {

 //this.txtRecord.AppendText("已停止监听!");

 }

}

private void abortLister(object sender,System.ComponentModel.CancelEventArgs e)

{

this.tcpLister.Stop();

}

//发送

private void btnSend_Click(object sender, System.EventArgs e)

{

if(this.txtContent.Text=="")

{

MessageBox.Show("不能发送空信息!","提示",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);

}

else

{

this.Send();

}

}

//发送消息

private void Send()

{

try

{

string msg = this.txtName.Text+" ("+System.DateTime.Now.ToString()+")/r/n"+this.txtContent.Text+"/r/n";

TcpClient client = new TcpClient(this.txtIp.Text,5566);

NetworkStream sendStream = client.GetStream();

StreamWriter writer = new StreamWriter(sendStream);

writer.Write(msg);

writer.Flush();

sendStream.Close();

client.Close();

this.txtRecord.AppendText(msg);

this.txtContent.Clear();

 }

 catch(System.Exception)

 {

 this.txtRecord.AppendText("目标计算机拒绝连接请求!/r/n");

 }

}

private void MainForm_Load(object sender, System.EventArgs e)

{

this.txtRecord.AppendText("正在监听.../r/n");

lister.Name = "监听本地端口";

lister.Start();

}

}

}

{

///

/// MainForm 的摘要说明。

///

public class MainForm : System.Windows.Forms.Form

{

private System.Windows.Forms.Label label1;

private System.Windows.Forms.Label label2;

private System.Windows.Forms.TextBox txtIp;

private System.Windows.Forms.TextBox txtRecord;

private System.Windows.Forms.TextBox txtName;

private System.Windows.Forms.Button btnSend;

private System.Windows.Forms.TextBox txtContent;

private TcpListener tcpLister = new TcpListener(5566);

System.Threading.ThreadStart listenPort;

System.Threading.Thread lister;

private System.Windows.Forms.Label label3;

System.Windows.Forms.NotifyIcon NotifyIcon1;

//托盘里显示的图标,我用的是QQ里的宠物狗的图标

private Icon img = new Icon(@"C:/OpenPet.ico");

System.Windows.Forms.ContextMenu nMenu;

///

/// 必需的设计器变量。

///

private System.ComponentModel.Container components = null;

public MainForm()

{

//

// Windows 窗体设计器支持所必需的

//

InitializeComponent();

//不显示最大化按钮

this.MaximizeBox = false;

//最小化时不显示在任务栏

this.ShowInTaskbar = false;

listenPort += new ThreadStart(this.Listen);

lister = new Thread(listenPort);

this.Closing += new System.ComponentModel.CancelEventHandler(abortLister);

Initializenotifyicon();

//

// TODO: 在 InitializeComponent 调用后添加任何构造函数代码

//

}

#region 初始化托盘组件

private void Initializenotifyicon()

{

NotifyIcon1 = new NotifyIcon();

NotifyIcon1.Icon = img;

NotifyIcon1.Text = "局域网聊天程序";

NotifyIcon1.Visible = true;

NotifyIcon1.DoubleClick += new EventHandler(this.showMainForm);

MenuItem [] menuArray = new MenuItem[3];

menuArray[0] = new MenuItem();

menuArray[0].Text = "显示主窗口";

menuArray[0].Click += new EventHandler(this.showMainForm);

menuArray[0].DefaultItem = true;

menuArray[1] = new MenuItem("-");

menuArray[2] = new MenuItem();

menuArray[2].Text = "退出";

menuArray[2].Click += new EventHandler(this.exitSystem);

nMenu = new ContextMenu(menuArray);

NotifyIcon1.ContextMenu = nMenu;

}

//显示主窗口

private void showMainForm(object sender,System.EventArgs e)

{

this.WindowState = System.Windows.Forms.FormWindowState.Normal;

}

//退出程序

private void exitSystem(object sender,System.EventArgs e)

{

NotifyIcon1.Visible = false;

this.Close();

}

#endregion

///

/// 清理所有正在使用的资源。

///

protected override void Dispose( bool disposing )

{

if( disposing )

{

 if (components != null)

 {

components.Dispose();

 }

}

 base.Dispose( disposing );

}

#region Windows 窗体设计器生成的代码

///

/// 设计器支持所需的方法 - 不要使用代码编辑器修改

/// 此方法的内容。

///

private void InitializeComponent()

{

this.label1 = new System.Windows.Forms.Label();

this.txtIp = new System.Windows.Forms.TextBox();

this.txtRecord = new System.Windows.Forms.TextBox();

this.label2 = new System.Windows.Forms.Label();

this.txtName = new System.Windows.Forms.TextBox();

this.btnSend = new System.Windows.Forms.Button();

this.txtContent = new System.Windows.Forms.TextBox();

this.label3 = new System.Windows.Forms.Label();

this.SuspendLayout();

//

// label1

//

this.label1.Location = new System.Drawing.Point(16, 232);

this.label1.Name = "label1";

this.label1.Size = new System.Drawing.Size(72, 23);

this.label1.TabIndex = 0;

this.label1.Text = "目标地址:";

this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;

//

// txtIp

//

this.txtIp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));

this.txtIp.Location = new System.Drawing.Point(80, 232);

this.txtIp.Name = "txtIp";

this.txtIp.Size = new System.Drawing.Size(200, 21);

this.txtIp.TabIndex = 1;

this.txtIp.Text = "";

//

// txtRecord

//

this.txtRecord.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));

this.txtRecord.Location = new System.Drawing.Point(16, 32);

this.txtRecord.Multiline = true;

this.txtRecord.Name = "txtRecord";

this.txtRecord.ReadOnly = true;

this.txtRecord.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;

this.txtRecord.Size = new System.Drawing.Size(264, 176);

this.txtRecord.TabIndex = 4;

this.txtRecord.Text = "";

//

// label2

//

this.label2.Location = new System.Drawing.Point(24, 256);

this.label2.Name = "label2";

this.label2.Size = new System.Drawing.Size(48, 23);

this.label2.TabIndex = 5;

this.label2.Text = "呢 称:";

this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;

//

// txtName

//

this.txtName.Location = new System.Drawing.Point(80, 256);

this.txtName.Name = "txtName";

this.txtName.Size = new System.Drawing.Size(88, 21);

this.txtName.TabIndex = 6;

this.txtName.Text = "";

//

// btnSend

//

this.btnSend.Location = new System.Drawing.Point(200, 256);

this.btnSend.Name = "btnSend";

this.btnSend.Size = new System.Drawing.Size(64, 23);

this.btnSend.TabIndex = 0;

this.btnSend.Text = "发 送";

this.btnSend.Click += new System.EventHandler(this.btnSend_Click);

//

// txtContent

//

this.txtContent.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)

 | System.Windows.Forms.AnchorStyles.Right)));

this.txtContent.Location = new System.Drawing.Point(16, 288);

this.txtContent.Multiline = true;

this.txtContent.Name = "txtContent";

this.txtContent.Size = new System.Drawing.Size(264, 152);

this.txtContent.TabIndex = 8;

this.txtContent.Text = "";

//

// label3

//

this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)

 | System.Windows.Forms.AnchorStyles.Right)));

this.label3.Location = new System.Drawing.Point(16, 8);

this.label3.Name = "label3";

this.label3.Size = new System.Drawing.Size(100, 16);

this.label3.TabIndex = 9;

this.label3.Text = "聊天记录:";

this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;

//

// MainForm

//

this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);

this.ClientSize = new System.Drawing.Size(292, 453);

this.Controls.Add(this.label3);

this.Controls.Add(this.txtContent);

this.Controls.Add(this.btnSend);

this.Controls.Add(this.txtName);

this.Controls.Add(this.label2);

this.Controls.Add(this.txtRecord);

this.Controls.Add(this.txtIp);

this.Controls.Add(this.label1);

this.Name = "MainForm";

this.Text = "局域网聊天程序";

this.Load += new System.EventHandler(this.MainForm_Load);

this.ResumeLayout(false);

 }

#endregion

///

/// 应用程序的主入口点。

///

[STAThread]

static void Main()

{

Application.Run(new MainForm());

}

//开始监听

private void Listen()

{

try

 {

 tcpLister.Start();

 while(true)

 {

 Socket s = tcpLister.AcceptSocket();

 Byte[] stream = new Byte[80];

 int i = s.Receive(stream);

 string message = System.Text.Encoding.UTF8.GetString(stream);

 this.txtRecord.AppendText(message);

 }

 }

 catch(System.Security.SecurityException)

 {

 MessageBox.Show("防火墙安全错误!","错误",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);

 }

 catch(System.Exception)

 {

 //this.txtRecord.AppendText("已停止监听!");

 }

}

private void abortLister(object sender,System.ComponentModel.CancelEventArgs e)

{

this.tcpLister.Stop();

}

//发送

private void btnSend_Click(object sender, System.EventArgs e)

{

if(this.txtContent.Text=="")

{

MessageBox.Show("不能发送空信息!","提示",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);

}

else

{

this.Send();

}

}

//发送消息

private void Send()

{

try

{

string msg = this.txtName.Text+" ("+System.DateTime.Now.ToString()+")/r/n"+this.txtContent.Text+"/r/n";

TcpClient client = new TcpClient(this.txtIp.Text,5566);

NetworkStream sendStream = client.GetStream();

StreamWriter writer = new StreamWriter(sendStream);

writer.Write(msg);

writer.Flush();

sendStream.Close();

client.Close();

this.txtRecord.AppendText(msg);

this.txtContent.Clear();

 }

 catch(System.Exception)

 {

 this.txtRecord.AppendText("目标计算机拒绝连接请求!/r/n");

 }

}

private void MainForm_Load(object sender, System.EventArgs e)

{

this.txtRecord.AppendText("正在监听.../r/n");

lister.Name = "监听本地端口";

lister.Start();

}

}

}

实现类似qq的聊天小程序

这个程序是室友编的,由于自己现在对MFC还不了解吧,先放这里吧以后好用(环境VS2010) 主函数: // Chat.cpp : 定义应用程序的类行为。 // #include "stdafx...
  • vvccyyqq
  • vvccyyqq
  • 2014年09月10日 18:11
  • 848

Linux下实现类似QQ的通信(简单聊天程序)

这几天在弄有关Linux下实现socket通信方面的东西,发现了yi
  • Zidane_2014
  • Zidane_2014
  • 2014年07月21日 15:05
  • 1584

winforms实现类似QQ消息框一样的右下角消息提示窗口

实现方法   效果示例图 第一步,建立一个Windows Application,然后在主form中放置一个Button,如下图所示: 第二步,给这个Application...
  • lishimin1012
  • lishimin1012
  • 2013年05月18日 21:38
  • 798

c#仿QQ顶置自动隐藏的效果

不用说,大家都用过QQ,QQ有个顶置之后自动隐藏的效果。 本人写WinForm的时候需要这样的特效,上网查了一番,然后自己动手实现了。现共享之。 并将此段代码封装成dll文件,在其他项目中用的时候...
  • crazy1235
  • crazy1235
  • 2013年01月06日 20:38
  • 2789

C#实现类似qq的屏幕截图程序

因为近来想写个类似于远程桌面监控的程序,该程序中要用到屏幕捕捉.为实现该程序的一部分功能,做了个小DEMO.程序很简单,用到的技术也不多,只能实现类似qq的截图功能(方法虽然很笨) 程序流程如下: ...
  • ccx_john
  • ccx_john
  • 2014年01月01日 16:42
  • 519

java类似QQ的聊天室程序的实现(下)(服务器端程序)

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i...
  • u012429555
  • u012429555
  • 2016年05月10日 19:48
  • 1385

基于Socket的java网络编程(实现类似于QQ两人聊天的交互)

基于Socket的java网络编程 1,什么是Socket 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连...
  • luowangcao
  • luowangcao
  • 2013年12月09日 14:05
  • 2632

仿QQ聊天软件2.0版

仿QQ聊天软件2.0版 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907 上次课设做了Java版的仿QQ聊天程序,这次软件实训,我们继续完善了仿QQ聊天程序...
  • u012027907
  • u012027907
  • 2014年07月05日 00:56
  • 10979

C#编写QQ接口软件 QQ通信协议

QQ的Http协议可能会把很多人迷惑了,其实通讯端口是8000而不是我们想的80,这里也可以看出腾讯的谨慎和保守,下面介绍一下具体的分析。 1、找寻支持QQ HTTP协议的服务器。 ...
  • kikaylee
  • kikaylee
  • 2014年01月21日 09:02
  • 4771

完美实现类似QQ的自拍头像、上传头像功能!

现在很多下载客户端程序都需要设定自己头像的功能,而设定头像一般有两种方式:使用摄像头自拍头像,或者选择一个图片的某部分区域作为自己的头像。 一.相关技术   若要实现上述的自拍头像和上传头...
  • beiuweid
  • beiuweid
  • 2014年11月11日 17:36
  • 331
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用c#实现类似QQ的简单通讯程序
举报原因:
原因补充:

(最多只允许输入30个字)