0

我有一个关于 GWT 的问题。假设我的 GWT 客户端应用程序需要连接到 TCP 套接字,做一些事情并关闭它。现在它在 GWT 中几乎不可能,因为套接字在客户端不起作用。

但实际上我可以在应用程序的服务器端创建套接字,如下所示:

package com.kurjerzy.testGWT.server;

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.Socket;

import com.kurjerzy.testGWT.client.GreetingService;
import com.kurjerzy.testGWT.shared.FieldVerifier;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

/**
 * The server side implementation of the RPC service.
 */
@SuppressWarnings("serial")
public class GreetingServiceImpl extends RemoteServiceServlet implements
        GreetingService {

    public String greetServer(String input) throws IllegalArgumentException {
        // Verify that the input is valid. 
        if (!FieldVerifier.isValidName(input)) {
            // If the input is not valid, throw an IllegalArgumentException back to
            // the client.
            throw new IllegalArgumentException(
                    "Name must be at least 4 characters long");
        }

        String serverInfo = getServletContext().getServerInfo();
        String userAgent = getThreadLocalRequest().getHeader("User-Agent");

        // Escape data from the client to avoid cross-site script vulnerabilities.
        input = escapeHtml(input);
        userAgent = escapeHtml(userAgent);

        String rStr = null;

        try {
            InetAddress addr = Inet4Address.getByName( "google.com" );
            Socket s = new Socket( addr , 80 );
            rStr = "connected!";
        } catch ( Exception e ) {
            rStr = "e: " + e.getMessage();
        }

        return "Hasdasdello, " + input + "!<br><br>I am running " + serverInfo
                + ".<br><br>It looks like you are using:<br>" + userAgent + "<br>rStr=" + rStr;
    }

    /**
     * Escape an html string. Escaping data received from the client helps to
     * prevent cross-site script vulnerabilities.
     * 
     * @param html the html string to escape
     * @return the escaped string
     */
    private String escapeHtml(String html) {
        if (html == null) {
            return null;
        }
        return html.replaceAll("&", "&amp;").replaceAll("<", "&lt;")
                .replaceAll(">", "&gt;");
    }
}

但不幸的是,serverlet 没有创建套接字连接的权限,它会引发异常。

任何想法如何实现这一点?

我想要实现的是:

1) 拥有与服务器建立连接的 native-java、android 和 gwt 实时游戏客户端

2) 拥有一台服务器,一次性为所有客户端提供逻辑服务

因此 native-java 和 android 客户端可以使用传统的 tcp 套接字连接到服务器。现在我想允许从 html5 环境连接到同一个游戏服务器,但我不知道应该使用什么连接传输......

我可能的想法是:

a) 使 serverlet 接受 rpc 调用并使用套接字与游戏服务器通信(但如何传递被拒绝的权限?..)

b) 让 gwt 客户端使用一些第 3 方 javascript 套接字库并直接连接到游戏服务器(但哪个好用?)

也许你有更好的想法?

游戏是回合制的,所以它的代码不是时间关键的,但数据是实时传输的(延迟是可以接受的,但必须始终保持连接,以通知第二个玩家第一个玩家的动作)

提前致谢。

4

1 回答 1

0

您是否调查过 html5 中的 Web Sockets API -

1) http://code.google.com/p/gwt-comet/wiki/WebSockets(仅限 Chrome)

2)哪些浏览器支持 HTML5 WebSocket API?

3) http://www.html5rocks.com/en/tutorials/websockets/basics/

此外,PlayN , Titanium , PhoneGAP如果您还没有,您可以快速浏览一下。您的问题表明您正在尝试手动处理低级别的东西。浏览上述技术。他们可能已经解决了这些问题。

于 2012-12-05T10:49:30.417 回答