PDA

View Full Version : Tạo ứng dụng chat đơn giản với Java



Cuni
10-09-2009, 10:05 AM
Làm chương trình phía Client
Trong ứng dụng này, chúng ta se thao tác với .Net Sockets. Chúng ta có 3 lớp chính là: TcpClient, TcpListener và NetworkStream. Trong đó, ứng dụng Listener luôn chạy đầu tiên bằng cách sử dụng phương thức start(): TcpListener.start(). Chúng ta sẽ viết ứng dụng TcpClient đầu tiên.

http://img501.imageshack.us/img501/7925/ungdungchatpictureib1.jpg

Đây là hàm có chức năng nhận tin nhắn:

public void ThreadProcReceive()
{
for (;;)
{
received = new byte[1024];
int readBytes = 0;

try
{
readBytes = tcp.GetStream().Read(received,0,received.Length);
}
catch (ObjectDisposedException) { return;
}
if (readBytes == 8)
{
StringBuilder shutMessage = new StringBuilder(8);
for (int count = 0; count < 8; count++)
{
char ch = (char)received[count];
shutMessage = shutMessage.Append(ch);
}
string shut = "shutdown";
string receivedMessage = shutMessage.ToString();
if (receivedMessage.Equals(shut))
{
MessageBox.Show(this,"Shutdown Request has arrived from the \nconnected party.\nYou cannot send message anymore.\nPlease close the window.","Shut down Request",MessageBoxButtons.OK,MessageBoxIcon.Information);
buttonSend.Enabled = false;
return;
}
}
StringBuilder str = new StringBuilder(1024);
for (int count = 0; count < readBytes; count++)
{
char ch = (char)received[count];
str = str.Append(ch);
str = str.Append(" ");
}
textBoxSendText.Text = str.ToString();
if (formClosing == true)
{
break;
}
}Đây là hàm xử lý sự kiện khi nhấn nút Connect:

private void buttonConnect_Click(object sender, System.EventArgs e)
{
textBoxIPAddress.Enabled = false;
IPAddress address = IPAddress.Parse(ipAddress);

tcp = new TcpClient((new IPEndPoint(Dns.Resolve(Dns.GetHostName()).AddressL ist[0],4002)));
LingerOption lingerOption = new LingerOption(false, 1);
tcp.LingerState = lingerOption;
tcp.Connect(new IPEndPoint(Dns.Resolve(ipAddress).AddressList[0],4001));
buttonSend.Enabled = true;
((Button)sender).Enabled = false;
receiveThread = new Thread(new ThreadStart(ThreadProcReceive));
receiveThread.Name = "Client's Receive Thread";
receiveThread.ApartmentState = ApartmentState.MTA;
receiveThread.Start();
}Đây là hàm xử lý sự kiện khi đóng Form1:

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
dataToSend = new byte[]{(byte)'s',(byte)'h',(byte)'u',(byte)'t',(byte)'d' ,(byte)'o',(byte)'w',(byte)'n'};
tcp.GetStream().Write(dataToSend,0,dataToSend.Leng th);
tcp.Close();
}

private void textBoxIPAddress_TextChanged(object sender, System.EventArgs e)
{
ipAddress = textBoxIPAddress.Text;
}Đây là hàm xử lý sự kiện khi nhấn nút Send:

private void buttonSend_Click(object sender, System.EventArgs e)
{
if (textBoxDataToSend.Text.Length != 0)
{
char[] charArray = textBoxDataToSend.Text.ToCharArray(0,textBoxDataTo Send.Text.Length);
dataToSend = new byte[textBoxDataToSend.Text.Length];
for (int charCount = 0; charCount < textBoxDataToSend.Text.Length; charCount++)
{
dataToSend[charCount] = (byte)charArray[charCount];
}
}
else
{
dataToSend = new byte[]{(byte)'e',(byte)'m',(byte)'p',(byte)'t',(byte)'y' };
}

tcp.GetStream().Write(dataToSend,0,dataToSend.Leng th);
textBoxDataToSend.Text = "";
}
Download mã nguồn:
http://www.mediafire.com/?dyymmmizmmm

Cuni
10-09-2009, 10:06 AM
Làm chương trình phía server

Đối tượng NetworkStream được sử dụng cho việc gửi và nhận dữ liệu thông qua giao thức TCP/IP. Các dữ liệu truyền đến sẽ được chuyển thành dạng chuỗi và được hiển thị trong Textbox.

Ứng dụng phía Server gồm 2 form. Form1 có giao diện như hình vẽ sau và một sự kiện với đoạn code sau.

private String hostPort = "";

private void button1_Click(object sender, System.EventArgs e)
{
button1.Enabled = false;
this.Hide();
Form2 blockedForm = new Form2(hostPort, this);
blockedForm.ShowDialog();
if (blockedForm.formClosed == true)
{
this.Close();
}
}
http://img169.imageshack.us/img169/5681/ungdungchatform1mc1.jpg
Form 2 có giao diện gần giống với ứng dụng Client.

private void ThreadProcPollOnEthernet()
{
for (;; )
{
Thread.Sleep(100);
byte[] msg = new Byte[Constants.maxNoOfBytes];
byte count1 = 0x01;
for (int i = 0; i < msg.Length; i++)
{
msg[i] = count1++;
}
try
{
if (formClosing == true)
{
return;
}

int readBytes = tcp.GetStream().Read(msg, 0, msg.Length);

if (readBytes == 8)
{
StringBuilder shutMessage = new StringBuilder(8);
for (int count = 0; count < 8; count++)
{
char ch = (char)msg[count];
shutMessage = shutMessage.Append(ch);
}
string shut = "shutdown";
string receivedMessage = shutMessage.ToString();
if (receivedMessage.Equals(shut))
{
MessageBox.Show(this, "Shutdown Request has arrived from the \nconnected party.\nYou cannot send message anymore.\nPlease close the window.", "Shut Down Request", MessageBoxButtons.OK, MessageBoxIcon.Information);
buttonSend.Enabled = false;
return;
}
}

StringBuilder str = new StringBuilder(Constants.maxNoOfBytes);
for (int count = 0; count < readBytes; count++)
{
char ch = (char)msg[count];
str = str.Append(ch);
str = str.Append(" ");
}
textBox1.Text = str.ToString();
}
catch (IOException)
{
return;
}
}
}

private void Form2_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
dataToSend = new byte[] { (byte)'s', (byte)'h', (byte)'u', (byte)'t', (byte)'d', (byte)'o', (byte)'w', (byte)'n' };
tcp.GetStream().Write(dataToSend, 0, dataToSend.Length);
tcpListener.Stop();
formClosed = true;
refToForm1.Close();
}

private void textBox2_TextChanged(object sender, System.EventArgs e)
{
dataReadyToSend.Set();
}

private void buttonSend_Click(object sender, System.EventArgs e)
{
if (textBox2.Text.Length != 0)
{
char[] charArray = textBox2.Text.ToCharArray(0, textBox2.Text.Length);
dataToSend = new byte[textBox2.Text.Length];
for (int charCount = 0;
charCount < textBox2.Text.Length;
charCount++)
{
dataToSend[charCount] = (byte)charArray[charCount];
}
}
else
{
dataToSend = new byte[] { (byte)'e', (byte)'m', (byte)'p', (byte)'t', (byte)'y' };
}
tcp.GetStream().Write(dataToSend, 0, dataToSend.Length);
textBox2.Text = "";
}
http://img291.imageshack.us/img291/63/ungdungchatform2ft6.jpg


Download mã nguồn:
http://www.mediafire.com/?ytmw1mmu0yt

nguoicodon
10-09-2009, 01:45 PM
Cho xin bản demo đi bạn ơi :confuse:

Cuni
10-09-2009, 02:13 PM
Cho xin bản demo đi bạn ơi :confuse:
Hình giao diện demo có, Code cũng có vậy mà còn xin cái bản demo gì nữa :tire:
Nhưng mình cũng đã cập nhật code mã nguồn trong bài viết download về vọc nha :byebye:

nguoicodon
10-09-2009, 02:18 PM
Sorry nha, không thấy...đễ dơn về dùng thử xem...