?? chatserver.cs
字號(hào):
}
catch(Exception ex)
{
this.rtbSocketMsg.AppendText(ex.Message.ToString()+ "\n");
}
}
}
private void tbSocketPort_TextChanged(object sender, System.EventArgs e)
{
this.btnSocketStart.Enabled = (this.tbSocketPort.Text != "");
}
private void btnSocketStop_Click(object sender, System.EventArgs e)
{
ClientSeverForm.SocketServiceFlag = false;
this.btnSocketStart.Enabled = true;
this.btnSocketStop.Enabled = false;
}
public void addUser(string username)
{
this.rtbSocketMsg.AppendText(username + " 已經(jīng)加入\n");
//將剛連接的用戶名加入到當(dāng)前在線用戶列表中
this.lbSocketClients.Items.Add(username);
this.tbSocketClientsNum.Text = System.Convert.ToString(clients.Count);
}
public void removeUser(string username)
{
this.rtbSocketMsg.AppendText(username + " 已經(jīng)離開(kāi)\n");
//將剛連接的用戶名加入到當(dāng)前在線用戶列表中
this.lbSocketClients.Items.Remove(username);
this.tbSocketClientsNum.Text = System.Convert.ToString(clients.Count);
}
public string GetUserList()
{
string Rtn="";
for(int i=0;i<lbSocketClients.Items.Count;i++)
{
Rtn=Rtn+lbSocketClients.Items[i].ToString() + "|";
}
return Rtn;
}
public void updateUI(string msg)
{
this.rtbSocketMsg.AppendText(msg + "\n");
}
private void ClientSeverForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
ClientSeverForm.SocketServiceFlag = false;
}
}
public class Client
{
private string name;
private Socket currentSocket = null;
private string ipAddress;
private ClientSeverForm server;
//保留當(dāng)前連接的狀態(tài):
//closed --> connected --> closed
private string state = "closed";
public Client(ClientSeverForm server, Socket clientSocket)
{
this.server = server;
this.currentSocket = clientSocket;
ipAddress = getRemoteIPAddress();
}
public string Name
{
get
{
return name;
}
set
{
name=value;
}
}
public Socket CurrentSocket
{
get
{
return currentSocket;
}
set
{
currentSocket=value;
}
}
public string IpAddress
{
get
{
return ipAddress;
}
}
private string getRemoteIPAddress()
{
return ((IPEndPoint)currentSocket.RemoteEndPoint).
Address.ToString();
}
//ServiceClient方法用于和客戶端進(jìn)行數(shù)據(jù)通信,包括接收客戶端的請(qǐng)求,
//根據(jù)不同的請(qǐng)求命令,執(zhí)行相應(yīng)的操作,并將處理結(jié)果返回到客戶端
public void ServiceClient()
{
string[] tokens=null;
byte[] buff=new byte[1024];
bool keepConnect=true;
//用循環(huán)來(lái)不斷地與客戶端進(jìn)行交互,直到客戶端發(fā)出“EXIT”命令,
//將keepConnect置為false,退出循環(huán),關(guān)閉連接,并中止當(dāng)前線程
while(keepConnect && ClientSeverForm.SocketServiceFlag)
{
tokens = null;
try
{
if (currentSocket == null ||
currentSocket.Available < 1)
{
Thread.Sleep(300);
continue;
}
//接收數(shù)據(jù)并存入buff數(shù)組中
int len = currentSocket.Receive(buff);
//將字符數(shù)組轉(zhuǎn)化為字符串
string clientCommand=System.Text.Encoding.Default.GetString(
buff, 0, len);
//tokens[0]中保存了命令標(biāo)志符(CONN、CHAT、PRIV、LIST或EXIT)
tokens=clientCommand.Split(new Char[]{'|'});
if (tokens == null)
{
Thread.Sleep(200);
continue;
}
}
catch(Exception e)
{
server.updateUI("發(fā)生異常:"+ e.ToString());
}
if(tokens[0]=="CONN")
{
//此時(shí)接收到的命令格式為:
//命令標(biāo)志符(CONN)|發(fā)送者的用戶名|,
//tokens[1]中保存了發(fā)送者的用戶名
this.name = tokens[1];
if (ClientSeverForm.clients.Contains(this.name))
{
SendToClient(this, "ERR|User " + this.name + " 已經(jīng)存在");
}
else
{
Hashtable syncClients = Hashtable.Synchronized(
ClientSeverForm.clients);
syncClients.Add(this.name,this);
//更新界面
server.addUser(this.name);
//對(duì)每一個(gè)當(dāng)前在線的用戶發(fā)送JOIN消息命令和LIST消息命令,
//以此來(lái)更新客戶端的當(dāng)前在線用戶列表
System.Collections.IEnumerator myEnumerator =
ClientSeverForm.clients.Values.GetEnumerator();
while (myEnumerator.MoveNext())
{
Client client = (Client)myEnumerator.Current;
SendToClient(client, "JOIN|"+tokens[1]+"|");
Thread.Sleep(100);
}
//更新?tīng)顟B(tài)
state = "connected";
SendToClient(this, "ok");
//向客戶端發(fā)送LIST命令,以此更新客戶端的當(dāng)前在線用戶列表
string msgUsers="LIST|"+server.GetUserList();
SendToClient(this, msgUsers);
}
}
else if(tokens[0]=="LIST")
{
if (state == "connnected")
{
//向客戶端發(fā)送LIST命令,以此更新客戶端的當(dāng)前在線用戶列表
string msgUsers="LIST|"+server.GetUserList();
SendToClient(this, msgUsers);
}
else
{
//send err to server
SendToClient(this, "ERR|state error,Please login first");
}
}
else if(tokens[0]=="CHAT")
{
if (state == "connected")
{
//此時(shí)接收到的命令的格式為:
//命令標(biāo)志符(CHAT)|發(fā)送者的用戶名:發(fā)送內(nèi)容|
//向所有當(dāng)前在線的用戶轉(zhuǎn)發(fā)此信息
System.Collections.IEnumerator myEnumerator =
ClientSeverForm.clients.Values.GetEnumerator();
while (myEnumerator.MoveNext())
{
Client client = (Client)myEnumerator.Current;
//將“發(fā)送者的用戶名:發(fā)送內(nèi)容”轉(zhuǎn)發(fā)給用戶
SendToClient(client, tokens[1]);
}
server.updateUI(tokens[1]);
}
else
{
//send err to server
SendToClient(this, "ERR|state error,Please login first");
}
}
else if(tokens[0]=="PRIV")
{
if (state == "connected")
{
//此時(shí)接收到的命令格式為:
//命令標(biāo)志符(PRIV)|發(fā)送者用戶名|接收者用戶名|發(fā)送內(nèi)容|
//tokens[1]中保存了發(fā)送者的用戶名
string sender=tokens[1];
//tokens[2]中保存了接收者的用戶名
string receiver=tokens[2];
//tokens[3]中保存了發(fā)送的內(nèi)容
string content=tokens[3];
string message=sender+" ---> "+receiver+": " + content;
//僅將信息轉(zhuǎn)發(fā)給發(fā)送者和接收者
if (ClientSeverForm.clients.Contains(sender))
{
SendToClient(
(Client)ClientSeverForm.clients[sender], message);
}
if (ClientSeverForm.clients.Contains(receiver))
{
SendToClient(
(Client)ClientSeverForm.clients[receiver], message);
}
server.updateUI(message);
}
else
{
//send err to server
SendToClient(this, "ERR|state error,Please login first");
}
}
else if(tokens[0]=="EXIT")
{
//此時(shí)接收到的命令的格式為:命令標(biāo)志符(EXIT)|發(fā)送者的用戶名
//向所有當(dāng)前在線的用戶發(fā)送該用戶已離開(kāi)的信息
if (ClientSeverForm.clients.Contains(tokens[1]))
{
Client client = (Client)ClientSeverForm.clients[tokens[1]];
//將該用戶對(duì)應(yīng)的Client對(duì)象從clients中刪除
Hashtable syncClients = Hashtable.Synchronized(
ClientSeverForm.clients);
syncClients.Remove(client.name);
server.removeUser(client.name);
//向客戶端發(fā)送QUIT命令
string message="QUIT|" + tokens[1];
System.Collections.IEnumerator myEnumerator =
ClientSeverForm.clients.Values.GetEnumerator();
while (myEnumerator.MoveNext())
{
Client c = (Client)myEnumerator.Current;
SendToClient(c, message);
}
server.updateUI("QUIT");
}
//退出當(dāng)前線程
break;
}
Thread.Sleep(200);
}
}
//SendToClient()方法實(shí)現(xiàn)了向客戶端發(fā)送命令請(qǐng)求的功能
private void SendToClient(Client client, string msg)
{
System.Byte[] message=System.Text.Encoding.Default.GetBytes(
msg.ToCharArray());
client.CurrentSocket.Send(message,message.Length,0);
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -