サーバープログラムですが、やっぱり、ソケットポリシーファイル用のサーバーもログインサーバーもひとつにすることにします。
そうする と、flash上でのサーバーの処理がややこしくならずにすむのと、いちいち、コマンドラインでプログラムをいくつもいくつも起動する面倒なことがないの です。
そういえば、外部からアクセスできない件に関してはまだまだ調査中です。
でも、ローカルで実行できれば、多分、オンライン でも実行できるだろうという、根拠もクソも無い思いで製作しています。
さて、Flashのソケット通信はJAVAのほうで行き詰っている 人が多いのではないでしょうか?
こちらが参考になります。
とはいえ、ログインなどの処理となりますと、MySQLなどのDBも必要になってきます。
そういう方のために、まだ完成しているところまでですが、サーバーのソースを公開します。
普通なら、いろいろな攻撃にあわないように、こんなソースを乗っけないですが、FlashのほうでSQLインジェクション攻撃などは対策がされているので、大丈夫・・・のはずです。
んで、こんな感じ
<MainServer.jar>
import java.net.*;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.io.*;
import com.mysql.jdbc.Connection;
/* -------------------------------------------------
メイン処理
------------------------------------------------- */
public class MainServer
{
public static void main(String[] args){
try{
// 8816ポートを使ってサーバソケットを作成
ServerSocket sarver = new ServerSocket(8816);
System.out.println("サーバを起動しました。");
while(true){
// Flashからの接続待ち(接続があればソケットを作成
Socket socket = sarver.accept();
// クライアントクラスを生成
new ClientSoc(socket);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
/* -------------------------------------------------
クライアント処理
------------------------------------------------- */
class ClientSoc extends Thread
{
Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
java.sql.Connection con=null;
PreparedStatement ps=null;
int Command=0;
String str=null;
ClientSoc(Socket soc){
System.out.println("接続されました。" + soc);
socket = soc;
try{
// 入力ストリームを作成
in = new BufferedReader(
new InputStreamReader(socket.getInputStream(), "UTF8"));
// 出力ストリームを作成
out = new PrintWriter(
new OutputStreamWriter(socket.getOutputStream(), "UTF8"), true);
}catch (Exception e){
e.printStackTrace();
}
// スレッド開始
this.start();
}
public void run(){
try{
out.println("<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\"><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\"/></cross-domain-policy>");
out.flush();
Class.forName("org.gjt.mm.mysql.Driver"); // MySQLの場合
con = DriverManager.getConnection("jdbc:mysql://localhost/pgame_system","root","14148814");
while (true){
String str = "";
// 一文字だけ読み込む(Flashから転送されるまでここで止まる
int c = in.read();
// クライアントから切断
if (c == -1){
break;
}
// 終了コードである'\0'が来るまで繰り返す
while (c != '\0'){
str += (char)c; // 文字列に結合する
c = in.read(); // 次の1文字を読み込む
}
this.str=str;
System.out.println(str.indexOf("PgameProjects:ServerCommand::MakeNewAccount"));
this.MoveFase();
}
System.out.println("切断されました。" + socket);
in.close(); // 入力ストリームを閉じる
out.close(); // 出力ストリームを閉じる
socket.close(); // ソケットを閉じる
}catch (Exception e){
e.printStackTrace();
}
}
//インスタンス偏移
private void MoveFase(){
if(str.indexOf("PgameProjects:ServerCommand::MakeNewAccount")==0){
System.out.println("インスタンス偏移::新規アカウント作成");
this.Command=2;
}
this.SendFase();
}
//インスタンス判定
private void SendFase(){
if(Command==2){
this.DupeCheckAccount();
}
}
//アカウントのデュープチェックプログラム
private void DupeCheckAccount(){
String sql=null;
String[] Data=null;
//デュープチェック
Data=this.str.split("|");
System.out.println("ユーザー操作:新規アカウント作成");
System.out.println("希望ID::"+Data[0]);
System.out.println("希望パスワード::"+Data[1]);
System.out.println("ユーザーのメールアドレス::"+Data[2]);
sql="SELECT ID FROM pgame_system.accountsystem WHERE ID=\""+Data[0]+"\";";
try{
ps=con.prepareStatement(sql);
ResultSet rs=ps.executeQuery();
//デュープチェック条件分岐
if(rs.next()==false){
System.out.println("リクエストされたID("+Data[0]+")は、現在使われていません。使用可能です。");
this.MakeAccount();
}else{
System.out.println("リクエストされたID("+Data[0]+")は使用済みです。使用不可能");
this.out.println("Dupe\0");
}
}catch(SQLException e){
//エラー(#0001)
System.out.println("デュープチェック中にエラーが発生しました。#0001");
}
}
//アカウント作成プログラム
private void MakeAccount(){
String sql=null;
String[] Data=null;
Data=this.str.split("|");
sql="INSERT INTO pgame_system.accountsystem (ID,Pass,Mail)VALUES(\""+Data[0]+"\",\""+Data[1]+"\",\""+Data[2]+"\");";
this.out.println("Sucsess\0");
this.out.flush();
try{
ps=con.prepareStatement(sql);
ps.executeUpdate();
}catch(SQLException e){
//エラー(#0002)
System.out.println("新規アカウント作成中にエラーが発生しました。#0002");
}
}
}
[4回]
PR