我有一个关于 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("&", "&").replaceAll("<", "<")
.replaceAll(">", ">");
}
}
但不幸的是,serverlet 没有创建套接字连接的权限,它会引发异常。
任何想法如何实现这一点?
我想要实现的是:
1) 拥有与服务器建立连接的 native-java、android 和 gwt 实时游戏客户端
2) 拥有一台服务器,一次性为所有客户端提供逻辑服务
因此 native-java 和 android 客户端可以使用传统的 tcp 套接字连接到服务器。现在我想允许从 html5 环境连接到同一个游戏服务器,但我不知道应该使用什么连接传输......
我可能的想法是:
a) 使 serverlet 接受 rpc 调用并使用套接字与游戏服务器通信(但如何传递被拒绝的权限?..)
b) 让 gwt 客户端使用一些第 3 方 javascript 套接字库并直接连接到游戏服务器(但哪个好用?)
也许你有更好的想法?
游戏是回合制的,所以它的代码不是时间关键的,但数据是实时传输的(延迟是可以接受的,但必须始终保持连接,以通知第二个玩家第一个玩家的动作)
提前致谢。