using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.Net;using System.Net.Sockets;using System.Threading;namespace SyncChatServer//================================服务器{ public partial class Form1 : Form { //保存用户列表 private List<User> userList = new List<User>(); //监听socket private Socket myListener = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); private bool isNormalExit = false; //端口号 private static int myprot = 8889; //用户人数 private static int usercount = 0; public Form1() { InitializeComponent(); button2.Enabled=false; IPEndPoint ep; IPAddress ip = IPAddress.Parse("127.0.0.1"); try { myListener.Bind(new IPEndPoint(ip, myprot)); richTextBox1.AppendText("主机IP:" ip.ToString() "\n"); } catch { richTextBox1.AppendText("绑定失败"); } //=================================================== } //-------------------------------------------向窗口输出信息 private delegate void buttu_richBoxDelegate(string message); private void buttu_richBox(string message) { richTextBox1.AppendText(message "\n"); } //======================================================= //-------------------------------------------------------监听按键 private void button1_Click(object sender, EventArgs e) { isNormalExit = false; buttu_richBoxDelegate d=buttu_richBox; try { myListener.Listen(10); richTextBox1.Invoke(d,"成功监听."); }catch{ richTextBox1.Invoke(d,"监听失败。"); } Thread mhThread=new Thread(ListenClientConnect); mhThread.IsBackground=true; mhThread.Start(); button1.Enabled=false; button2.Enabled=true; } //======================================================= //-------------------------------------------------------监听事件 private void ListenClientConnect() { Socket newClient =null; while(isNormalExit==false) { try { newClient=myListener.Accept(); if (isNormalExit == true) { newClient.Close(); usercount = 0; UserCount(usercount); break; } } catch { break ; } User user = new User(newClient); Thread threadReceive = new Thread(ReceiveData); threadReceive.IsBackground=true; threadReceive.Start(user); UserCount( usercount); } } //======================================================= //-------------------------------------------------------接收信息函数 private void ReceiveData(object userState) { User user =(User)userState; Socket client=user.client; byte[] result=new byte[2048]; string receiveString = null; int receiveNumber; while(isNormalExit==false) { try { receiveNumber = client.Receive(result); receiveString=Encoding.UTF8.GetString(result,0,receiveNumber); //sendMessageTorichBox(receiveString); } catch { if(isNormalExit==false) { sendMessageTorichBox("用户" user.username "已经退出!"); RemoveUser(user); } break; } string[] splitString =receiveString.Split(','); switch(splitString[0].ToLower()) { case "login": user.username=splitString[1]; user.ip = splitString[2]; user.port = int.Parse(splitString[3]); userList.Add(user); AddItemToListBox(user.username); sendToAllClient(user,receiveString); FirstLogin(user); break; case "logout": DeletItemInListBox(user.username); sendToAllClient(user,receiveString); RemoveUser(user); UserCount(--usercount); break; case "talk": multMessage(user,receiveString); break; default: sendMessageTorichBox("不知道什么意思!"); break; } } } //============================================================= private void multMessage(User user,String receiveString) { string[] splitString = receiveString.Split(','); for(int i=1;i<splitString.Length;i=i 3) { sendMessageTorichBox(string.Format("[{0}] 对 [{1}] 说:", user.username, splitString[i]) splitString[i 1]); foreach (User target in userList) { if (target.username == splitString[i] && user.username != splitString[i]) { SendToClient(target, "talk," user.username "," splitString[i 1]); break; } } } } //============================================================= private void SendToClient(User user,string message) { button_richBoxDelegate d=button_richBox; Socket socket=user.client; try { socket.Send(Encoding.UTF8.GetBytes(message)); } catch { richTextBox1.Invoke(d,"发送信息失效。"); } } private void sendToAllClient(User user,string message) { string command =message.Split(',')[0].ToLower(); if(command=="login") { for(int i=0;i<userList.Count;i ) { SendToClient(userList[i],message ","); } } else if(command=="logout") { for(int i=0;i<userList.Count;i ) { if(userList[i].username!=user.username) { SendToClient(userList[i],message); } } } } private void FirstLogin(User user) { for (int i = 0; i < userList.Count; i ) { if(userList[i].username!=user.username) { SendToClient(user,"login," userList[i].username "," userList[i].ip "," userList[i].port ","); } } } private delegate void UserCountDelegate(object obj); private void UserCount(object obj) { UserCountDelegate d = userCountFunction; label3.Invoke(d,obj); } private void userCountFunction(object obj) { label3.Text = (int)obj " 人"; } private void RemoveUser(User user) { userList.Remove(user); user.Close(); } private delegate void button_richBoxDelegate(string str); private void sendMessageTorichBox(string str) { button_richBoxDelegate d=button_richBox; richTextBox1.Invoke(d,str); } private void button_richBox(string str) { richTextBox1.AppendText(str "\n"); } private delegate void DeletItem_ListBoxDelegate(string str); private void DeletItemInListBox(string str) { DeletItem_ListBoxDelegate d = DeletItem_ListBox; listBox1.Invoke(d,str); } private void DeletItem_ListBox(string str) { listBox1.Items.Remove(str); listBox1.SelectedIndex = listBox1.Items.Count - 1; listBox1.ClearSelected(); } private delegate void AddItem_ListBoxDelegate(string str); private void AddItemToListBox(string str) { AddItem_ListBoxDelegate d=AddItem_ListBox; listBox1.Invoke(d,str); } private void AddItem_ListBox(string str) { listBox1.Items.Add(str); listBox1.SelectedIndex=listBox1.Items.Count-1; listBox1.ClearSelected(); } private void button2_Click(object sender, EventArgs e) { sendMessageTorichBox("正在停止服务器,并依次使用户退出!"); isNormalExit=true; for(int i=userList.Count-1;i>=0;i--) { userList[i].client.Close(); RemoveUser(userList[i]); } //myListener.Shutdown(SocketShutdown.Both); //myListener.Close(); button1.Enabled=true; button2.Enabled=false; CloseConnect(); //mhThread.Join(); } private delegate void AddrichTextBox1MassageDelegate(string str); private void sendrichTextBox1Massage(string str) { richTextBox1.AppendText(str "\n"); } private void button3_Click(object sender, EventArgs e) { AddrichTextBox1MassageDelegate d = sendrichTextBox1Massage; if (listBox1.SelectedIndex != -1) { //SendMessage("talk," listBox1.SelectedItem "," textBox2.Text); //---------------------------------------------------- if (listBox1.Items.Count > 0) { for (int i = 0; i < listBox1.SelectedItems.Count; i ) { for (int j = 0; j < userList.Count; j ) { if (userList[j].username == listBox1.SelectedItems[i].ToString()) { SendToClient(userList[j], "talk,Server," textBox1.Text); richTextBox1.Invoke(d, "[Server] 对 [" userList[j].username "]说:" textBox1.Text);} } //SendMessage("talk," listBox1.SelectedItems[i].ToString() "," textBox2.Text); //richTextBox1.Invoke(d, "我对[" listBox1.SelectedItems[i].ToString() "]说:" textBox2.Text); } } //---------------------------------------------------- /*for(int i=0;i<userList.Count;i ) { if(userList[i].username == listBox1.SelectedItem.ToString()) { SendToClient(userList[i], "talk,Server," textBox1.Text); richTextBox1.Invoke(d, "[Server] 对 [" userList[i].username "]说:" textBox1.Text); textBox1.Clear(); } }*/ textBox1.Clear(); } else { sendrichTextBox1Massage("请先选择一个对话者."); } } private delegate void ClearListBoxItemDelegate(); private void CloseConnect() { ClearListBoxItemDelegate d1 = ClearListBoxItemFunction; listBox1.Invoke(d1); usercount = 0; UserCount(usercount); } private void ClearListBoxItemFunction() { listBox1.Items.Clear(); } private void textBox1_TextChanged(object sender, EventArgs e) { } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { } private void richTextBox1_TextChanged(object sender, EventArgs e) { } }}
评论