【问题标题】:communication between java server and javascriptjava服务器和javascript之间的通信
【发布时间】:2014-03-27 12:27:39
【问题描述】:

我有一个多线程聊天 Java 服务器,可以处理多个客户端 (java)。他们可以同时互相交谈。它们通过网络套接字连接。除了他们自己的对话词之外,我的目的是通过网络应用程序在网络浏览器中显示他们所做的对话词。我正在考虑 JavaScript,但无法弄清楚如何为 Web 应用程序实现 javascript,因为我需要将对象或数据从服务器(java)端传递到 javascript 端。

以下是多线程服务器,它适用于多个客户端。

        public class GoodChatServer {
         ………
public static void main(String[] args) throws Exception {
    System.out.println("The chat server is running.");
    ServerSocket listener = new ServerSocket(PORT);
    try {
        ….
        }
    } finally {
    …..
    }
}
private static class Handler extends Thread {


   ……….
        this.socket = socket;
    }

   public void run() {
        try {

            in = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);
            while (true) {
                out.println("SUBMITNAME");
                name = in.readLine();
                if (name == null) {
               ..
                }

                synchronized (names) {
                    if (!names.contains(name)) {
                        names.add(name);
                        break;
                    }

【问题讨论】:

  • 您可以使用 javascript 创建一个 GUI 来执行此操作并在那里显示该转换。
  • 感谢 A5I-IE5 !!但问题是我的 java 服务器中有 protbuf 数据,我想将其传递给 javascript ....意味着我如何从 javascript 访问我的服务器(java)的类或对象....并且还通过 protobuf。
  • 你想使用 js rite 调用 java 吗?
  • @ A5I-IE5,技术上是的。我想从 JavaScript 调用 java 以在 javascript(也可以是其他语言)中获取 protobuf 数据以进行显示。我寻找了 AJAX,但它们支持 xml 或 JSON 数据,这在我的情况下不支持 ..
  • 您可以使用DWR

标签: java javascript web-applications


【解决方案1】:

有很多方法可以使用 JavaScript 在浏览器中显示来自 Java 服务器的聊天信息。由于您已经在为 Java 客户端使用套接字,因此一种选择是使用 WebSocketsOracle provides an introduction to Java Websockets here,它应该可以帮助您处理服务器端的事情。 Mozilla 也有a tutorial for writing browser-based websockets here

您可以考虑的另一个选择是通过全球实时网络(例如 PubNub)中继您的数据。 PubNub 提供了Java APIJavaScript API,这将允许您使用以下代码将消息从 Java 服务器发布到 JavaScript 客户端:

<script src="http://cdn.pubnub.com/pubnub.min.js"></script>
<script>(function(){

var pubnub = PUBNUB.init({
    publish_key   : 'demo',
    subscribe_key : 'demo'
})

pubnub.subscribe({
    channel : "my_chat_channel",
    message : function(m){ alert(m) }, //Display the chat message
})});</script>

在 Java 服务器上,您将编写发布代码:

Pubnub pubnub = new Pubnub("demo", "demo");

Callback callback = new Callback() {
    public void successCallback(String channel, Object response) {
        System.out.println(response.toString());
    }
    public void errorCallback(String channel, PubnubError error) {
        System.out.println(error.toString());
    }
};
pubnub.publish("my_chat_channel", "Here is my amazing chat message!" , callback);

PubNub 目前是free for up to 1 million messages per month。祝你好运!

【讨论】:

  • @drnugent,感谢您的建议...我肯定会寻找 PubNub..但我还有一个疑问,它是否支持传输 PROTBUF 数据?
  • 您应该能够序列化和反序列化任何数据,但是您可以考虑使用 JSON,因为您的消息将被 JavaScript 客户端读取。