Professional Documents
Culture Documents
Huong Dan Lam Chuong Trinh Chat Don Gian
Huong Dan Lam Chuong Trinh Chat Don Gian
Lp K2C6
}
#endregion
if (readBytes == 0)
break;
cmdTarget = System.Text.Encoding.ASCII.GetString(buffer);
//c kch thc ca Metadata
string cmdMetaData = "";
buffer = new byte[4];
readBytes = this.networkStream.Read(buffer, 0, 4);
if (readBytes == 0)
break;
int metaDataSize = BitConverter.ToInt32(buffer, 0);
//c metadata
buffer = new byte[metaDataSize];
readBytes = this.networkStream.Read(buffer, 0, metaDataSize);
if (readBytes == 0)
break;
cmdMetaData = System.Text.Encoding.Unicode.GetString(buffer);
//ng gi thnh kiu command
Command cmd = new Command(cmdType, IPAddress.Parse(cmdTarget), cmdMetaData);
cmd.SenderIP = this.IP;
cmd.SenderName = this.ClientName;
//pht s kin nhn xong 1 command
this.OnCommandReceived(new CommandEventArgs(cmd));
}
catch
{
break;//gp bt k li no s t thot
}
}
//pht s kin mt kt ni
this.OnDisconnected(new ClientEventArgs(this.socket));
//ngt kt ni
this.Disconnect();
}
GC.Collect();
this.networkStream.Write(metaBuffer, 0, metaBuffer.Length);
this.networkStream.Flush();
semaphor.Release();
return true;
}
catch
{
semaphor.Release();
return false;
}
Bc 11: Chuyn qua file Server.cs v lp trnh cc chc nng c bn cho 1 server
chat. Bao gm forward tin nhn, qun l cc client, v cc hm h tr.
Trc tin l khai bo cc thuc tnh nh sau:
private List<ClientManager> listClient;//danh sach cc client online
private Socket listenerSocket;//socket nghe cc kt ni mi
private int port = 1024;//port c nh nhn Command
V Contructor.
public Server()
{
serverIp = Dns.GetHostAddresses(Dns.GetHostName())[0];
listClient = new List<ClientManager>();
}
10
if (index != -1)
{
string name = listClient[index].ClientName;
listClient.RemoveAt(index);
SendUserOnlineList();
return true;
}
return false;
}
}
//kim tra xem tn ng nhp c cha
private bool IsNameExists(IPAddress remoteClientIP, string nameToFind)
{
foreach (ClientManager mngr in this.listClient)
if (mngr.ClientName == nameToFind && !mngr.IP.Equals(remoteClientIP))
return true;
return false;
}
11
2. Lp trnh Client:
Bc 1: Tng t bn Server, ta to 1 project mi c tn l UITChatClient dng
Windows Form. Trong cng Solution ta to thm 1 project mi c dng Class
Library tn l ChatClient, ng thi add thm project Command ca Server v client v
server phi ng b v Command. Thm 1 file c tn l EventArgs.cs cho project
ChatClient.
Bc 2: M file EventArgs.cs ca ChatClient v tin hnh nh ngha 1 s
EventArg, delegate cho ChatClient.
//Nhn c Command
public delegate void
//Mt kt ni server
public delegate void
//Kt ni thnh cng
public delegate void
//kt ni b li
public delegate void
12
private
private
private
private
13
try
{
//to socket
this.clientSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
IPEndPoint serverEP = new IPEndPoint(remoteAddress, port);
//kt ni ti IP ca server
this.clientSocket.Connect(serverEP);
e.Result = true;
//to 1 lun nhn v ghi d liu ln socket
this.networkStream = new NetworkStream(this.clientSocket);
//to 1 thread nhn Command
this.bwReceiver = new BackgroundWorker();
this.bwReceiver.WorkerSupportsCancellation = true;
this.bwReceiver.DoWork += new DoWorkEventHandler(Receive);
this.bwReceiver.RunWorkerAsync();
}
catch
{
e.Result = false;//kt ni ko thnh cng
}
}
private void Receive(object sender, DoWorkEventArgs e)
{
Tng t bn pha Server
}
Gi Command:
public void SendCommandToDestination(Command cmd)
{
if (this.clientSocket != null && this.clientSocket.Connected)
{
BackgroundWorker bwSender = new BackgroundWorker();
bwSender.DoWork += new DoWorkEventHandler(bwSender_DoWork);
bwSender.RunWorkerCompleted += new
RunWorkerCompletedEventHandler(bwSender_RunWorkerCompleted);
bwSender.RunWorkerAsync(cmd);
}
}
private void bwSender_DoWork(object sender, DoWorkEventArgs e)
{
Command cmd = (Command)e.Argument;
e.Result = this.SendCommand(cmd);
}
private void bwSender_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
((BackgroundWorker)sender).Dispose();
GC.Collect();
}
System.Threading.Semaphore semaphor = new System.Threading.Semaphore(1, 1);
private bool SendCommand(Command cmd)
{
Tng t nh bn Server
}
14
15
this.Close();
Bc 6: To form frmChat.
Thit k giao din v t tn nh hnh v.
Form ny c chc nng hin th tn tt c cc
client ang online v c th chat vi bt k client
no bng cch click vo tn client v bm vo
nt chat.
- u tin trnh li Cross-thread ta to 2
delegate cho vic update li list useronline v chn
Message vo form frmInstantChat tng ng.
V 2 hm tng ng nh sau:
private void InsertMessage(string Targetname, string Message)
{
frmInstantChat IM=null;
//duyt qua tt c cc form ang m
foreach (Form form in Application.OpenForms)
{
//gn cho form thnh frmIntantChat
IM = form as frmInstantChat;
if (IM == null)
continue;
if (IM.TargetName == Targetname)//kim tra targetname ng khi
form chat c m sn
{
break;
}
}
if (IM == null)
{
IM = new frmInstantChat(client.UserName,Targetname, this);
IM.Show();
}
//chn message vo form
IM.InsertMessage(Targetname,Message);
IM.Focus();
}
private void UpdateUserList(string[] UserName)
{
lsbUserOnline.Items.Clear();
foreach (string s in UserName)
16
17
MessageBox.Show("Connecting failed");
this.Close();
18
19
III. Kt lun:
-
20