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(">", ">");
}
}
残念ながら、サーバーレットにはソケット接続を作成する権限がなく、例外が発生します。
これを実装する方法はありますか?
私が達成したいことは次のとおりです。
1) サーバーに接続するネイティブ Java、Android、および gwt リアルタイム ゲーム クライアントを持つ
2) 一度にすべてのクライアントにロジックを提供するサーバーを持つ
そのため、ネイティブ Java および Android クライアントは、従来の tcp ソケットを使用してサーバーに接続できます。今、html5環境から同じゲームサーバーへの接続を許可したいのですが、どの接続トランスポートを使用すればよいかわかりません...
可能な鉱山のアイデアは次のとおりです。
a)サーバーレットにrpc呼び出しを受け入れさせ、ソケットを使用してゲームサーバーと通信させます(ただし、拒否された許可を渡す方法は?..)
b) gwt クライアントにサードパーティの JavaScript ソケット ライブラリを使用させ、ゲームサーバーに直接接続します (ただし、どれを使用するのが適切でしょうか?)
多分あなたはより良いアイデアを持っていますか?
ゲームはターン制なのでタイム クリティカルなコードではありませんが、データはリアルタイムで転送されます (遅延は許容されますが、最初のプレーヤーの動きを 2 番目のプレーヤーに通知するために、常に接続を維持する必要があります)。
前もって感謝します。