PDA

View Full Version : [Q] XIN CHỈ CÁCH LÀM CHATROOM bằng Java!



LAPTRINHVIEN
27-02-2003, 18:07
Xin "các cao nhân" giúp đỡ tôi cách làm một chatroom thiệt hay!

Bởi vì hơi bị "ngố" nên xin quý vị vui lòng chỉ tôi từ những chi tiết nhỏ nhất.

Xin cám ơn quý vị rất nhiều!

No Mercy
27-02-2003, 23:24
Bạn muốn setup 1 chat room hay 1 viết 1 chat room? Cái đầu dễ hơn cái sau nhiều ah.

LAPTRINHVIEN
28-02-2003, 15:19
Cám ơn bạn đã quan tâm.

Tôi muốn viết một chương trình Chat bằng Java, và tạo một giao diện chat (bằng tiếng Việt càng hay).

Mong rằng tôi sẽ nhận được những giúp đỡ của bạn.

No Mercy
28-02-2003, 17:07
Thế bạn đã học Java chưa? Hì, thật ra thì sắp tới mình cũng phải làm project là 1 chat application đây. Hy vọng sẽ giúp được bạn.

winter20
06-03-2003, 15:29
Xin chào nếu bạn đang muốn làm một chương trình chat bằng Java
thì xin email về cho tớ ,tớ sẽ chỉ cho đảm bảo bạn sẽ có một chương trình chat xịn .Nhưng với điều kiện bạn phải biết lập trình mạng bằng java nhé . Nếu không thì không hiểu đâu

winter20
06-03-2003, 15:30
ldthoang@yahoo.com

trannam136
06-03-2003, 19:40
Bài viết được gửi bởi winter20
ldthoang@yahoo.com
bạn có code chương trình ah ? Post lên cho mọi người coi được không ???:D

winter20
09-03-2003, 12:20
Chương trình chat bằng Java sẽ có hai phần phần thứ nhất la chương trình Server phục vụ cho việc truyền thông giữa các client , có thể nói đây là giai đoạn xử lí rất quan trọng . Mấu chốt của vấn đề là ở chỗ Server phải xử lí được việc lưu và kiểm tra luồng (Thread) mà các client gửi đến . Có thể nói nôm na là khi một Client kết nối thành công đến Server thì Server sẽ lưu luồng kết nối đó lại để cho lần sau có thể gửi một message từ một client khác đến Client đó . Sau đây là đoạn chương trình minh hoạ cho điều đó .

public class AppServer extends Thread
{
ServerSocket serverSocket;
public AppServer()
{
try
{
serverSocket = new ServerSocket(2001);
}
catch(IOException e)
{
fail(e,"Could not start server.");
}
System.out.println("Server started . . .");
this.start(); // Starts the thread
}

public static void fail(Exception e, String str)
{
System.out.println(str + "." + e);
}

public void run()
{
try
{
while(true)
{
Socket client = serverSocket.accept();
Connection con = new Connection(client);
}
}
catch(IOException e)
{
fail(e,"Not listening");
}
}

public static void main(String args[])
{
new AppServer();
}
}

đoạn chương trình trên cho phép thiết lập một Server thông qua hàm accept() . Nhưng vẫn chưa đủ vì để các client kết nối được cần phải tạo một luồng gủi nhận của riêng Server

class Connection extends Thread
{
protected Socket netClient;
protected ObjectInputStream fromClient;
protected PrintStream toClient;

Service servicedet;

static Vector vector_online = new Vector(1,1);//Method to check chatrer online
static Vector vector_toclient = new Vector(1,1);//Method to retrieve/send message
private int localMsgCount;// To count local messages
String listonline="";//userOnline
static int messageCount;//To count the total number of messages stored

String nickname;//ten cua user dang su dung Thread nay , quan trong!!!

public Connection(Socket client)
{
netClient = client;
try
{
fromClient = new ObjectInputStream(netClient.getInputStream());
toClient = new PrintStream(netClient.getOutputStream());
}
catch(IOException e)
{
try
{
netClient.close();
}
catch(IOException e1)
{
System.err.println("Unable to set up streams" + e1);
return;
}
}
this.start();
}

cần để ý là Thread muốn hoạt dộng được thì cần phải có hàm run() được triệu gọi một cách mặc định theo sau hàm start() và trong hàm start chúng ta sẽ tiến hành việc lưu lại các luồng như đã nói trên bằng lớp Vector (kế thừa từ lớp Colection) và khi cần chúng ta sẽ tìm ra luồng đã lưu bằng hàm elementAt(); Nên nhớ là phải có sự liên lac giữa hai vector một lưu nickname và một lưu luồng mà nickname đó sử dụng

public void run()
{
boolean stop = false;
while(!stop)
{
try
{ MessageChat chat = (MessageChat)servicedet.info;
String to = chat.to;
String message = chat.message;
String from = chat.from;

int kq11 = findnick(to);
if (kq11 >= 0)
{
PrintStream toclient =
(PrintStream)vector_toclient.elementAt(kq11);
toclient.println("<" + from + ">" + message);
}

ở đây mình chỉ đề cập đến việc xủ lí dữ liệu đương nhiên là các bạn phải có các lớp lưu trữ dũ liệu khi clien gửi tới một kết nối . Đoạn chương trình trên có sử dụng các lớp lưu trữ dữ liệu sẽ được khai báo ở đầu của chương trình . mình sẽ nói đến việc đó trong bài viết khác . Còn đây là 2 đoạn chương trình phục vụ việc lưu luồng và xử lí luồng

LƯU LUỒNG

boolean a = CheckNick(nick);
if (a)
{
nickname = nick;
writeMessage(nick); // lưu luồng và tên nickname sử dụng luồng
toClient.println("OK!!!");
sendToAll();
}




synchronized void writeMessage(String x)
{
vector_online.addElement(x);
vector_toclient.addElement(toClient); // LUU LUONG
++messageCount;
++localMsgCount;
notifyAll();
}//close writeMessag

XỬ LÍ

public int findnick(String str)
{
int result = -1;
for (int i = 0 ; i < messageCount ; i++ )
{
String temp = (String)vector_online.elementAt(i);
if (temp.equals(str))
return i;
}
return result;
}//close find nick

Trên đây chỉ mới là giải thuật xử lí luồng mà thôi còn việc để viết thành một chương trình chat thì còn rất dài . Mình hi vọng sẽ có dịp giải thích kĩ hơn cho các bạn

Chúc các bạn vui vẻ

LAPTRINHVIEN
10-03-2003, 14:23
:) :) :) :) :) :)

Cám ơn đề nghị của bạn Winter20. Mình đã gửi mail cho bạn.

trannam136
11-03-2003, 21:02
Cảm ơn Winter20 rất nhiều.

Typn84
11-04-2003, 21:38
Nếu bạn có thể thì bạn hãy gửi luôn cho mình code của chương trình javachat mà bạn đã sử dụng và chạy ngon rrồi không....tôi muốn xem qua cái code đó chứ ngồi đây đọc ít thế này không được hay cho lắm.....mail của mình là:
n_vanminh@hotmail.com
Thank you trước nhá

tranhoang_2005
25-10-2009, 17:59
xin cam on anh winter20 winter20 rat nhieu

donalcute88
05-05-2011, 16:25
Chào cả nhà. t cũng đang học java và rất cần code chương trình chat. cả nhà có thể gửi code chương trình hoàn chỉnh giúp t được k? t đang phải làm đề tài nên rất gấp. Thanks!
Mail của t là: minhhueit@gmail.com

LiquidSnake
05-05-2011, 19:29
Viết chương trình chat thì bạn nên viết bằng RMI (Remote Method Invocation), sẽ nhanh và dễ kiểm soát hơn so với dùng socket.

sonC0609k
05-05-2011, 21:27
:D RMI là mô hình phát triển từ socket làm sao nhanh hơn được :)) đồng ý là dễ kiểm soát hơn.

Có n cách để làm 1 chat room . Bạn có thể dùng UDP hoặc TCP để send message.
Với UDP bạn có thể tìm ví dụ về MulticastSocket hoặc Datagramsocket để gửi message vào broadcast. Cách này rất chi là dễ làm :)
TCP thì nhiều bạn ở trên đã nói :)