- PR -

XMLソケットとLinuxサーバについて

投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2004-09-23 23:01
引用:

おばけさんの書き込み (2004-09-20 20:07) より:
もしくは、XMLSocketとやらの仕様が分かっている場合、代替物を作り出すことも
不可能ではないかも知れません。


かなりオフですが、Flashと「XMLサーバーもどき」で通信するプログラムを考えてみました。必要なものですが、サーバーサイド相当はJDKだけですのでLinuxでもいけます。なお、マルチユーザー環境にするためには、あれこれ工夫が必要です

成功しますと、Flashのtraceウィンドウに1秒おきにメッセージが追加されていきます。

サーバーサイドもどき(mainメソッド)
コード:
import java.io.*;
import java.net.*;

public class xmlSocket {

	public static void main(String[] args) {
		ServerSocket server = null;
		Socket socket = null;
		PrintWriter out = null;
		char eof = 0;
		String xml = "Test Data ";
		try {
			server = new ServerSocket(8081);
			socket = server.accept();
			out = new PrintWriter(socket.getOutputStream());
			for (int i = 0; i < 20; i++){
				Thread.sleep(1000);
				out.print(xml + i + eof);
				out.flush();
			}
		} catch (Exception e) {
			System.out.println(e.toString());
		} finally {
			try {
				out.close();
				socket.close();
				server.close();
			} catch (Exception e) {
			}
		}
	}

}



Flashクライアント(Action Script)
コード:
myXMLSocket = new XMLSocket();
myXMLSocket.connect("localhost", 8081);
myXMLSocket.onConnect = function(status) {
	trace(status);
};
myXMLSocket.onData = function(source) {
	trace(source);
};

おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-09-23 23:13
引用:

かなりオフですが、Flashと「XMLサーバーもどき」で通信するプログラムを考えてみました。


おお凄い!
ちなみに、HTTPに限定してしまえばサーバサイドはServletでも行けますかね?
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2004-09-23 23:31
おばけ様、お世話になります。
引用:

おばけさんの書き込み (2004-09-23 23:13) より:
ちなみに、HTTPに限定してしまえばサーバサイドはServletでも行けますかね?


うーーん、どうでしょう??考えてみたのですが、通常のrequest、responseの場合ですと、ひとかたまりのデータを吐いてしまうと接続が切れてしまうので、それを防ぐ(切断しない)方法があれば不可能ではないかもしれません。何か良い方法ありますでしょうか?
#追記
ソケットを使わない、ServletによるFlashクライアントでのチャットでしたら簡単です。
Servlet側は普通に組んで、Flashでは loadVariables か sendAndLoad を使い、テキストデータでやりとりします。

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2004-09-24 00:31 ]
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2004-09-25 23:27
Ken-Labです。
既にお気づきかと思いますが(汗)、以下の実験コードでServlet (Tomcat4) によるXML Socket通信が可能であることを確認しましたので一応残しておきます。これでチャットはおろか、対戦ゲームもOKかと 。(但しPort割り当て機能やaccept()にタイムアウト設定が必要。)

コード:

package xmlSocket;

import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class index extends HttpServlet {

private static int port = 8081;

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain; charset=Shift_JIS");
PrintWriter out = response.getWriter();
out.print("&port=" + port + "&statusFlag=1&");
xmlSocket socketObject = new xmlSocket(port);
++port; // 制限が必要。
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}

}

class xmlSocket extends Thread {

private int port;

public xmlSocket(int port) {
this.port = port;
start();
}

public void run() {
ServerSocket server = null;
Socket socket = null;
PrintWriter sout = null;
InputStream sin = null;
char eof = 0;
String xml = "Test data";
String readStr;
try {
server = new ServerSocket(port);
server.setSoTimeout(30000);
socket = server.accept();
sout = new PrintWriter(socket.getOutputStream());
sin = socket.getInputStream();
BufferedReader bin = new BufferedReader(new InputStreamReader(sin));
for (int i = 0; i < 20; i++) {
Thread.sleep(1000);
sout.print(xml + i + eof);
sout.flush();
readStr = bin.readLine(); // Flashからは送信データ + \nを投げる。
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
socket.close();
server.close();
} catch (Exception e) {
}
}
}

}



※Action Scriptはすみませんが省略します。

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2004-09-25 23:30 ]

ソースコードを全面書替しました。(別スレッドでソケットを扱うのが自然かと。。。)

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2004-09-26 17:11 ]
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-09-25 23:48
引用:

既にお気づきかと思いますが(汗)、以下の実験コードでServlet
(Tomcat4) によるXML Socket通信が可能であることを確認しました
ので一応残しておきます。


すごいっす・・・
手元にFlash開発環境が無いんで、残念ながら試せないんですけど・・・。

話は変わりますが、やっぱりリッチクライアントの本命はFlashなんでしょうか。
そろそろリッチクライアントにも手を染めないといけなそうな雰囲気がチラホラ

スキルアップ/キャリアアップ(JOB@IT)