聊天程序_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 聊天程序

聊天程序

 2010/9/19 23:40:05  devilhand  http://devilhand.javaeye.com  我要评论(0)
  • 摘要:服务器usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Net.Sockets;usingSystem.IO;usingSystem.Net;usingSystem.Threading;namespace聊天程序
  • 标签:聊天程序

服务器

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.IO;
using System.Net;
using System.Threading;
namespace 聊天程序
{
    public partial class Server : Form
    {
        private TcpListener myListener;
        private List<User> userList = new List<User>();
        private const int port = 3000;
        private bool isNormalExit = false;
        IPAddress localAddress;
        public Server()
        {
            InitializeComponent();
            ListboxState.HorizontalScrollbar = true;
            IPAddress[] addIp = Dns.GetHostAddresses(Dns.GetHostName());
            localAddress = addIp[0];
            BtnStop.Enabled = false;
        }

        private void BtnStart_Click(object sender, EventArgs e)
        {

            myListener = new TcpListener(localAddress, port);
            myListener.Start();
            AddItemToListBox(string.Format("开始在{0}:{1}监听客户连接", localAddress, port));
            Thread connectThread = new Thread(ListenClient);
            connectThread.Start();
            BtnStop.Enabled = true;
            BtnStart.Enabled = false;
        }
        private void ListenClient()
        {
            TcpClient newClient = null;
            while (true)
            {
                try
                {
                    newClient = myListener.AcceptTcpClient();
                }
                catch
                {
                    break;
                }
                User user = new User(newClient);
                Thread receiveThread = new Thread(ReceiveData);
                receiveThread.Start(user);
                userList.Add(user);
                AddItemToListBox(string.Format("[{0}]进入", newClient.Client.RemoteEndPoint));
                AddItemToListBox(string.Format("当前的在线的用户数:{0}", userList.Count));
            }
        }
        private void ReceiveData(object userState)
        {
            User user = (User)userState;
            TcpClient tcpClient = user.Clinet;
            string receiveString = null;
            while (false == isNormalExit)
            {
                try
                {
                    receiveString = user.Br.ReadString();
                }
                catch
                {
                    AddItemToListBox(string.Format("与用户{0}失去连接,已终止接收该用户的信息", tcpClient.Client.RemoteEndPoint));
                    RemoveUser(user);
                    break;
                }
                AddItemToListBox(string.Format("来自[{0}]:{1}", user.Clinet.Client.RemoteEndPoint, receiveString));
                string[] spliteString = receiveString.Split(',');
                switch (spliteString[0])
                {
                    case "Login":
                        user.UserName = spliteString[1];
                        SendToAllClient(user, receiveString);
                        break;
                    case "Logout":
                        SendToAllClient(user, receiveString);
                        RemoveUser(user);
                        return ;
                    case "Talk":
                        string talkString = null;
                        talkString = receiveString.Substring(spliteString[0].Length + spliteString[1].Length + 2);
                        AddItemToListBox(string.Format("[{0}]对[{1}]说:{2}", user.UserName, spliteString[1], talkString));
                        SendToClient(user, "talk," + user.UserName + "," + talkString);
                        foreach (User target in userList)
                        {
                            if (target.UserName == spliteString[1] && user.UserName != spliteString[1])
                            {
                                SendToClient(target, "talk," + user.UserName + "," + talkString);
                                break;
                            }
                        }
                        break;
                    default:
                        AddItemToListBox(string.Format("什么意思啊:" + receiveString));
                        break;
                }
            }
        }
        private void SendToAllClient(User user, string message)
        {
            string command = message.Split(',')[0].ToLower();
            if ("login" == command)
            {
                for (int i = 0; i < userList.Count; i++)
                {
                    //向其他用户发送该用法登录信息
                    SendToClient(userList[i], message);
                    //向该用户发送其他用户登录信息
                    if (userList[i].UserName != user.UserName)
                    {
                        SendToClient(user, "login," + userList[i].UserName);
                    }
                }
            }
            if ("logout" == command)
            {
                for (int i = 0; i < userList.Count; i++)
                {
                    //向其他用户发送该用户退出信息
                    if (userList[i].UserName != user.UserName)
                    {
                        SendToClient(userList[i], message);
                    }
                }
            }
        }
        private void SendToClient(User user, string message)
        {
            try
            {
                user.Bw.Write(message);
                user.Bw.Flush();
                AddItemToListBox(string.Format("向[{0}]发送信息:{1}", user.UserName, message));
            }
            catch
            {
                AddItemToListBox(string.Format("向[{0}]发送信息失败!"));
            }
        }
        private delegate void AddItemToListBoxDelegate(string str);
        private void AddItemToListBox(string str)
        {
            if (ListboxState.InvokeRequired)
            {
                AddItemToListBoxDelegate d = AddItemToListBox;
                ListboxState.Invoke(d, str);
            }
            else
            {
                ListboxState.Items.Add(str);
                ListboxState.SelectedIndex = ListboxState.Items.Count - 1;
                ListboxState.ClearSelected();
            }
        }
        private void RemoveUser(User user)
        {
            userList.Remove(user);
            user.Close();
            AddItemToListBox(string.Format("当前在线用户数:{0}", userList.Count));
        }

        private void BtnStop_Click(object sender, EventArgs e)
        {
            AddItemToListBox("开始停止服务,用户依次退出");
            isNormalExit = true;
            for (int i = 0; i < userList.Count; i++)
            {
                RemoveUser(userList[i]);
            }
            myListener.Stop();
            BtnStart.Enabled = true;
            BtnStop.Enabled = false;
        }

        private void Server_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (myListener != null)
            {
                BtnStop.PerformClick();
            }
        }
    }
}

?

?

User类

?

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.IO;
namespace 聊天程序
{
    public class User
    {
        private TcpClient client;
        private BinaryReader br;
        private BinaryWriter bw;
        private string userName;
        public TcpClient Clinet
        {
            get { return client; }
        }
        public BinaryReader Br
        {
            get { return br; }
        }
        public BinaryWriter Bw
        {
            get { return bw; }
        }
        public string UserName
        {
            get { return userName; }
            set {userName=value;}
        }
        public User (TcpClient clinet)
        {
            this.client = clinet;
            NetworkStream networkStream = clinet.GetStream();
            br = new BinaryReader(networkStream);
            bw = new BinaryWriter(networkStream);
        }
        public void Close()
        {
            br.Close();
            bw.Close();
            client.Close();
        }
    }
}

?

?

客户端

?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
namespace Client
{
    public partial class Client : Form
    {
        private bool isExit = false;
        private TcpClient tcpClient;
        private BinaryReader br;
        private BinaryWriter bw;

        public Client()
        {
            InitializeComponent();
            listBoxMessage.HorizontalScrollbar = true;
            listBoxUser.HorizontalScrollbar = true;
            Random r = new Random((int)DateTime.Now.Ticks);
            txtUser.Text = "user" + r.Next(100, 999);
            btnSend.Enabled = false;
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            btnLogin.Enabled = false;
            try
            {
                tcpClient = new TcpClient("192.168.14.56", 3000);
                AddMessage("连接成功");
                btnSend.Enabled = true;
            }
            catch
            {
                btnLogin.Enabled = true;
                AddMessage("连接失败!");
                return;
            }
            NetworkStream networkStream = tcpClient.GetStream();
            br = new BinaryReader(networkStream);
            bw = new BinaryWriter(networkStream);
            SendMessage("Login," + txtUser.Text + "");
            Thread receiveThread = new Thread(ReceiveData);
            receiveThread.IsBackground = true;
            receiveThread.Start();

        }
        private void ReceiveData()
        {
            string receiveString = null;
            while (false == isExit)
            {
                try
                {
                    receiveString = br.ReadString();
                }
                catch
                {
                    AddMessage("与服务器失去连接!");
                    break;
                }
                string[] splitString = receiveString.Split(',');
                string command = splitString[0].ToLower();     
                switch (command)
                {
                    case "login":
                        AddUser(splitString[1]);
                        break;
                    case "logout":
                        RemoveUser(splitString[1]);
                        break;
                    case "talk":
                        AddMessage(splitString[1] + ":");
                        AddMessage(receiveString.Substring(splitString[0].Length + splitString[1].Length + 2));
                        break;
                    default:
                        AddMessage("什么意思啊" + receiveString);
                        break;
                }
            }
            Application.Exit();
        }
        private void SendMessage(string message)
        {
            try
            {
                bw.Write(message);
                bw.Flush();
            }
            catch
            {
                AddMessage("发送信息失败!");
            }
        }
        private delegate void AddMessageDelegate(string str);
        private void AddMessage(string str)
        {
            if (listBoxMessage.InvokeRequired)
            {
                AddMessageDelegate d = AddMessage;
                listBoxMessage.Invoke(d, str);
            }
            else
            {
                listBoxMessage.Items.Add(str);
                listBoxMessage.SelectedIndex = listBoxMessage.Items.Count - 1;
                listBoxMessage.ClearSelected();
            }
        }
        private delegate void AddUserDelegate(string str);
        private void AddUser(string str)
        {
            if (listBoxUser.InvokeRequired)
            {
                AddUserDelegate d = AddUser;
                listBoxUser.Invoke(d, str);
            }
            else
            {
                listBoxUser.Items.Add (str);
                listBoxUser.SelectedIndex = listBoxMessage.Items.Count - 1;
                listBoxUser.ClearSelected();
            }
        }
        private delegate void RemoveUserDelegate(string str);
        private void RemoveUser(string str)
        {
            if (listBoxUser.InvokeRequired)
            {
                RemoveUserDelegate d = RemoveUser;
                listBoxUser.Invoke(d, str);
            }
            else
            {
                listBoxUser.Items.Remove(str);
                listBoxUser.SelectedIndex = listBoxMessage.Items.Count - 1;
                listBoxUser.ClearSelected();
            }
        }

        private void txtMessage_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)Keys.Return)
            {
                btnSend.PerformClick();
            }
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            if (listBoxUser.SelectedIndex != -1)
            {
                SendMessage("Talk," + listBoxUser.SelectedItem.ToString() + "," + txtMessage.Text);
                txtMessage.Clear();
            }
            else
            {
                MessageBox.Show("请选择接收的用户");
            }         
        }

        private void Client_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (null != tcpClient)
            {
                SendMessage("Logout," + txtUser.Text);
                isExit = true;
                br.Close();
                bw.Close();
                tcpClient.Close();
            }
        }     
    }
}

?

?

?

?

?

?

  • 相关文章
发表评论
用户名: 匿名