using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using QQ.BLL;namespace QQ
{
/// <summary>
/// 主要功能界面
/// </summary>
public partial class frmMain : Form
{
private int UID; //当前登陆者的ID
private int px = 780; //当前界面的 X 坐标
private int py = 20; //当前界面的 y 坐标
private Point p; //当前窗体坐标
private UserInfoOperater objUserInfoOperater; //用户表的操作类
private DataRow dr; //存储登陆的个人信息
private DataTable dFriend; //当前用户好友表
private TcpClient myClient; //与客户端的连接
private TcpListener tcpListener; //监听客户端连接
private NetworkStream networkStream; //网络访问的基础流
private StreamReader streamReader;
private StreamWriter streamWriter;
private Thread th;
/// <summary>
/// 无参参构造,参数为登陆ID
/// </summary>
public frmMain()
{
InitializeComponent();
}
/// <summary>
/// 有参构造,参数为登陆ID
/// </summary>
/// <param name="objUID"></param>
public frmMain(int objUID)
{
InitializeComponent();
UID = objUID;
}
//窗体加载
private void frmMain_Load(object sender, EventArgs e)
{
this.SetPoint(); //设置窗体二维坐标
this.ShowFriend(); //默认开始显示好友信息
dr = objUserInfoOperater.GetUserInfo(); //存储登陆的个人信息
this.DisplayInfo(); //将个人信息显示在窗体上
th = new Thread(new ThreadStart(Monitor));
th.Start();
}
//QQ好友按钮
private void btnFriend_Click(object sender, EventArgs e)
{
ShowFriend();
flp.Controls.SetChildIndex(lstView, 1);
}
//最近联系人按钮
private void btnLinkman_Click(object sender, EventArgs e)
{
ShowLinkman();
flp.Controls.SetChildIndex(lstView, 2);
}
//关闭窗体时,退出整个应用程序
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult ds = MessageBox.Show("这将关闭服务器,您是否确定要关闭它?", "提示框", MessageBoxButtons.YesNo);
if (ds == DialogResult.Yes)
{
objUserInfoOperater.State = 0;
objUserInfoOperater.UpdateState();
CloseThread();
}
if (ds == DialogResult.No)
e.Cancel = true;
}
//托盘双击,显示窗体
private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (Visible)
{
Visible = false;
}
else
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
}
}
//托盘退出菜单,退出应用程序
private void mnuExit_Click(object sender, EventArgs e)
{
this.Exit();
}
//好友双击事件,准备聊天
private void lstView_DoubleClick(object sender, EventArgs e)
{
//获得双击的项
ListViewItem lstItem = (ListViewItem)sender;
}
//查找好友
private void btnFind_Click(object sender, EventArgs e)
{
frmFind objFrmFind = new frmFind(UID);
objFrmFind.Show();
}
/// <summary>
/// 设置当前窗体的二维坐标
/// </summary>
private void SetPoint()
{
p = new Point(px, py);
this.Location = p;
}
/// <summary>
/// 给树添加好友信息
/// </summary>
private void ShowFriend()
{
lstView.Items.Clear();
objUserInfoOperater = new UserInfoOperater();
objUserInfoOperater.UID = UID;
dFriend = objUserInfoOperater.GetFriendName(UID);
if (dFriend != null)
{
foreach (DataRow dr in dFriend.Rows)
{
ListViewItem lstItem = new ListViewItem();
lstItem.SubItems[0].Text = dr["UName"].ToString();
lstItem.ImageIndex = int.Parse(dr["imageIndex"].ToString());
lstItem.Tag = dr["UID"];
if (int.Parse(dr["state"].ToString()) == 0)
lstItem.ForeColor = Color.Gray;
lstView.Items.Add(lstItem);
}
}
else
{
lstView.Items.Add("暂时无好友");
}
}
/// <summary>
/// 给树添加联系人信息
/// </summary>
private void ShowLinkman()
{
lstView.Items.Clear();
}
/// <summary>
/// 将个人信息显示在窗体上
/// </summary>
private void DisplayInfo()
{
this.notifyIcon.Text = dr["UName"].ToString();
this.Text += UID;
this.picFace.Image = faceImages.Images[int.Parse(dr["imageIndex"].ToString())];
this.lblUID.Text = dr["UName"].ToString();
}
/// <summary>
/// 退出程序
/// </summary>
private void Exit()
{
objUserInfoOperater.UID = UID;
objUserInfoOperater.State = 0;
objUserInfoOperater.UpdateState();
Application.Exit();
}
/// <summary>
/// 线程监听客户端连接,并与数据库的数据保持同步,监听普通消息,添加好友消息
/// </summary>
private void Monitor()
{
try
{
tcpListener = new TcpListener(int.Parse(dr["UID"].ToString()));
tcpListener.Start();
myClient = tcpListener.AcceptTcpClient();
networkStream = myClient.GetStream();
while (true)
{
streamReader = new StreamReader(networkStream);
string line = streamReader.ReadLine();
if (line == "添加好友")
{
MessageBox.Show("有人添加你为好友");
}
//刷新好友信息
if (flp.Controls[1] == lstView)
ShowFriend();
Thread.Sleep(1000);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// 关闭线程
/// </summary>
private void CloseThread()
{
if (th != null)
{
if (th.ThreadState == ThreadState.Suspended)
{
th.Resume();
}
th.Abort();
if (streamReader != null)
streamReader.Close();
if (networkStream != null)
networkStream.Close();
if (myClient != null)
myClient.Close();
th = null;
}
}
}
}请大家耐心的看完这段代码把~
这是用Socket做的类似于QQ的聊天工具
现在的问题是关闭窗口时,进程没有关闭,也就是说,有个资源没有关闭
不知道是线程还是TcpList
但这个关闭窗口事件里面到底怎么写,才能完全关闭呢?
th.IsBackGround = true;//这个属性大致就这么写的
th.Start();
tcpListener.Stop();
关闭窗口的时候.就会提示正在关闭线程
结果还是没有关闭
Application.Exit行不?
直接用Stop()肯定不行