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
但这个关闭窗口事件里面到底怎么写,才能完全关闭呢?