2010-10-29 25 views
7

Tôi hiện đang tạo một bot IRC bằng Java (tôi biết, có các khung công tác ở đó) và tôi đang cố gắng kết nối nó với nhiều máy chủ. Vấn đề tôi gặp phải với điều này không phải là phần kết nối, tôi chỉ đang chạy lớp Connect của mình với số lượng x chủ đề. Mỗi luồng sẽ kết nối bot với máy chủ/cổng được chỉ định. Bây giờ vấn đề của tôi là khi một số văn bản được xuất ra bởi người dùng bot được cho là sẽ nhắn tin cho kênh nói rằng "bạn đã gõ lệnh này" (ví dụ). Bây giờ tôi muốn bot nhắn tin cho tất cả các máy chủ nói rằng "bạn đã gõ lệnh này". Đây chỉ đơn giản là một ví dụ (đó là lý do tại sao nó không có ý nghĩa nhiều).Làm thế nào để có 2 Chủ đề Nói chuyện với nhau?

Connect f = new Connect(irc.freenode.net, 6667); 
Thread ft = new Thread(f); 
ft.start(); 
Connect q = new Connect(irc.quakenet.org, 6667); 
Thread qt = new Thread(q); 
qt.start(); 

Bây giờ có mã ví dụ ở trên, tôi muốn một chủ đề nói chuyện với nhau khi văn bản nhất định được nhập. Một cái gì đó như:

if (lineReader.substring(lineReader.indexOf(":"), lineReader.length()).equals("hello")) { 
    message both servers "Hello World!" 
} 

Nếu có ai có thể giúp, tôi rất cảm kích điều đó. Cảm ơn!

Trả lời

1

Bạn nên cung cấp cho mỗi luồng một Hàng đợi của các thư đến mà các luồng khác có thể đẩy theo cách không đồng bộ; java.util.concurrent.ConcurrentLinkedQueue có lẽ sẽ là một lớp tốt để sử dụng cho điều đó.

Sau đó, bạn sẽ cần một cá thể lớp MessageSender duy nhất có tham chiếu đến tất cả các chuỗi của bạn. Nếu một luồng muốn gửi một thông điệp đến tất cả các luồng khác, nó sẽ gọi send (msg) trên đối tượng MessageSender toàn cục này, và nó sẽ lần lượt lặp qua tất cả các luồng và đẩy thông điệp đến hàng đợi tương ứng của chúng (bỏ qua chuỗi của người gửi).

Các chủ đề có thể tự kiểm tra hàng đợi của riêng mình theo thời gian (tùy thuộc vào bất kỳ logic nào khác mà họ có thể thực hiện) và xóa tin nhắn khi họ đã xử lý chúng.

+0

Lúc đầu, tôi đã do dự với cách tiếp cận này nhưng nó chắc chắn là dễ nhất/hiệu quả nhất để thực hiện. Cảm ơn: D – zamN

0

Giải pháp đơn giản nhất là chuyển đối tượng chung cho cả hai luồng. Trong trường hợp này, nó có thể chỉ là String. Ví dụ:

String messagePasser; 
Connect f = new Connect(irc.freenode.net, 6667, messagePasser); 
Thread ft = new Thread(f); 
ft.start(); 
Connect q = new Connect(irc.quakenet.org, 6667, messagePasser); 
Thread qt = new Thread(q); 
qt.start(); 

dụ khác của bạn sau đó trở thành:

if (lineReader.substring(lineReader.indexOf(":"), lineReader.length()).equals("hello")){ 
    messagePasser = "Hello, World!"; 
} 

Mỗi thread sau đó liên tục nên kiểm tra messagePasser để xem khi nó thay đổi và sau đó sản lượng tin nhắn. Điều này rõ ràng là một gợi ý rất đơn giản và hoàn toàn bỏ qua nhiều mối quan tâm về đồng bộ hóa và an toàn luồng.

EDIT: Trong ánh sáng học được rằng String s được truyền theo giá trị (tìm hiểu điều gì đó mới mỗi ngày ...), Bạn chỉ cần tạo đối tượng MessagePasser đơn giản đóng gói String và bất kỳ dữ liệu nào khác bạn muốn.

+0

Vì vậy, sau đó bạn đang nói rằng trong khi nghe một số lệnh nhất định từ máy chủ, tôi cũng nên nghe xem có thay đổi từ phiên bản phổ biến hay không và nếu có thì tôi sẽ phát ra cả hai máy chủ. Tôi thích ý tưởng này nhưng điều đó đòi hỏi tôi phải có một thời gian bên trong một thời gian và tôi không chắc nó đáng tin cậy như thế nào. – zamN

3

Tôi nghĩ rằng một phương pháp đơn giản sẽ là một Observer pattern nơi mỗi thread biết về tất cả các chủ đề khác

0

Giải pháp messagePasser sẽ không làm việc vì các đối tượng chuỗi trong java được truyền theo giá trị, chứ không phải bằng cách tham khảo.

+1

Quan sát tốt nhưng hãy làm cho nhận xét này thành câu trả lời và sau đó xóa câu trả lời này. Cảm ơn và chào mừng bạn đến với SO! –

+0

Tôi đã thử nhưng không thể tìm hiểu cách thực hiện. Sau khi đọc các faq tôi nhận ra rằng tôi cần ít nhất 50 điểm danh tiếng để lại ý kiến ​​về bài viết mà không được tạo ra bởi tôi. –

0

Từ mô tả của bạn, tôi đảm bảo rằng mỗi chủ đề đang đợi một tin nhắn từ một số người dùng khác trò chuyện. Chờ đợi có nghĩa là nó gọi một số phương thức mạng trả về chỉ khi một tin nhắn đến. Ngay sau khi tin nhắn đó đến, luồng (tùy chọn) tạo ra một câu trả lời, đăng nó và sau đó tiếp tục chờ. Đó là lý do tại sao bạn có nhiều chủ đề, phải không?

Điều đó có nghĩa là, tuy nhiên, chủ đề chỉ có thể gửi nội dung sau khi họ nhận được nội dung nào đó. Bởi vì chỉ sau đó họ bị đánh thức khỏi trạng thái chờ đợi của họ. Điều đó có nghĩa là không thể thực hiện "phát sóng" câu lệnh trả lời cho tất cả các luồng. Thay vào đó, luồng nhận phải gửi nó đến tất cả các máy chủ (trong khi các luồng khác vẫn đang chờ đọc từ các máy chủ này).

Nói cách khác: chia nhỏ nhiệm vụ nghiêm ngặt của máy chủ cho chuỗi. Cho phép bất kỳ chủ đề nào gửi đến bất kỳ máy chủ nào.

+0

Xem tôi đã nghĩ đến việc làm điều này nhưng nó chỉ làm cho mã của tôi không linh hoạt ... ở tất cả, và điều đó làm tôi sợ hãi. Tôi thích mã linh hoạt quá nhiều: x. – zamN

0

Thêm từng chuỗi vào bộ sưu tập, đọc danh sách và xem các bản cập nhật. Ngay sau khi có bản cập nhật, hãy gửi cho mỗi chủ đề. (Nghe như một người quan sát ...)!

Các vấn đề liên quan