2013-02-26 78 views
0

我已經失去它...的Java套接字服務器

我已經通過的FlashDevelop(AS3)建立了一個簡單的Flash應用程序,我希望它傳達給服務器。我創建然後用代碼的簡單的Socket Java應用程序:

Main.java:

import org.xsocket.connection.*; 

public class Main 
{ 
    protected static IServer srv = null; 

    public static void main(String[] args) 
    { 
     try 
     { 
      srv = new Server(8090, new xSocketDataHandler()); 
      srv.run(); 
     } 
     catch(Exception ex) 
     { 
      System.out.println(ex.getMessage()); 
     } 
    } 

    protected static void shutdownServer() 
    { 
     try 
     { 
      srv.close(); 
     } 
     catch(Exception ex) 
     { 
      System.out.println(ex.getMessage()); 
     }   
    } 
} 

和xSocketDataHandler.java:

import java.io.IOException; 
import java.nio.BufferUnderflowException; 
import java.nio.channels.ClosedChannelException; 
import java.util.*; 
import org.xsocket.*; 
import org.xsocket.connection.*; 


public class xSocketDataHandler implements IDataHandler, IConnectHandler, IDisconnectHandler 
{ 
    private Set<INonBlockingConnection> sessions = Collections.synchronizedSet(new HashSet<INonBlockingConnection>()); 

    public boolean onData(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, ClosedChannelException, MaxReadSizeExceededException 
    { 
     try 
     { 
      String data = nbc.readStringByDelimiter("\0"); 

      if(data.trim().length() > 0) 
      { 
       System.out.println("Incoming data: " + data); 

       if(data.equalsIgnoreCase("<policy-file-request/>")) 
       { 
        nbc.write("<cross-domain-policy>" + 
          "<allow-access-from domain=\"*\" secure=\"false\" />" + 
          "<allow-access-from domain=\"*\" to-ports=\"8090\"/>" + 
          "</cross-domain-policy>\0"); 
        return true; 
       } 

       String[] message = data.split("~"); 

       sendMessageToAll(nbc, message[0], message[1]); 

       if(message[1].equalsIgnoreCase("SHUTDOWN")) 
        Main.shutdownServer();     
      } 
     } 
     catch(Exception ex) 
     { 
      System.out.println("onData: " + ex.getMessage()); 
     } 

     return true; 
    } 

    private void sendMessageToAll(INonBlockingConnection nbc, String user, String message) 
    { 
     try 
     { 
      synchronized(sessions) 
      { 
       Iterator<INonBlockingConnection> iter = sessions.iterator(); 

       while(iter.hasNext()) 
       { 
        INonBlockingConnection nbConn = (INonBlockingConnection) iter.next(); 

        if(nbConn.isOpen()) 
         nbConn.write("<b>" + user + "</b>: " + message + "<br />\0"); 
       } 
      } 

      System.out.println("Outgoing data: " + user + ": " + message); 
     } 
     catch(Exception ex) 
     { 
      System.out.println("sendMessageToAll: " + ex.getMessage()); 
     }    
    } 

    public boolean onConnect(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, MaxReadSizeExceededException 
    { 
     try 
     { 
      synchronized(sessions) 
      { 
       sessions.add(nbc);    
      } 

      System.out.println("onConnect"); 
     } 
     catch(Exception ex) 
     { 
      System.out.println("onConnect: " + ex.getMessage()); 
     } 

     return true; 
    } 

    public boolean onDisconnect(INonBlockingConnection nbc) throws IOException 
    { 
     try 
     { 
      synchronized(sessions) 
      { 
       sessions.remove(nbc);    
      } 

      System.out.println("onDisconnect"); 
     } 
     catch(Exception ex) 
     { 
      System.out.println("onDisconnect: " + ex.getMessage()); 
     }   

     return true; 
    } 
} 

所以,問題是:

我啓動Java應用程序,它運行完美。我開始我的Flash應用程序,它運行,創建Socket對象,連接到我的服務器(在我的電腦)的服務器獲取連接嘗試,但在:

nbc.readStringByDelimiter("\0"); 

它說,NBC被關閉,服務器發現異常: "onData: channel is closed (read buffer size=0)"

有誰知道爲什麼我總是得到這個?無論我如何編寫它,使用Socket,XMLSocket,xSocketDataHandler或anyhting,我都會收到關閉的通道錯誤。

我在做什麼錯?

謝謝。

EDIT1:

的AS3代碼:

這是我的Socket類:

import flash.events.Event; 
import flash.events.IOErrorEvent; 
import flash.events.ProgressEvent; 
import flash.events.SecurityErrorEvent; 
import flash.net.Socket; 
/** 
* ... 
* @author 9MS 
*/ 
public class GameSocket extends Socket 
{ 
private var host:String; 
private var port:int; 

public function GameSocket(host:String="187.127.89.158", port:int=8090) 
{ 
super(host, port); 

socketConnect(); 
} 

public function socketConnect():Boolean { 


addEventListener(Event.CONNECT, onConnect); 
addEventListener(ProgressEvent.SOCKET_DATA, onResponse); 
addEventListener(Event.CLOSE, onClose); 
addEventListener(IOErrorEvent.IO_ERROR, onError); 
addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecError); 

try { 
connect(this.host, this.port); 
} 
catch (e:Error) { 
trace("Error on connect: " + e); 
return false; 
} 
return true; 
} 

public function sendData(msg:String):void { 
msg += "\0"; 

try { 
writeUTFBytes(msg); 
flush(); 
trace("Message sent: " + msg); 
} 
catch(e:Error) { 
trace("Error sending data: " + e); 
} 

} 

private function onConnect(e:Event):void { 
trace("Connected: "+e); 
} 

private function onResponse(e:ProgressEvent):void { 
trace("Receiving Data: " + e); 

var resp:String = readUTFBytes(bytesAvailable); 

} 

private function onClose(e:Event):void { 
trace("Connection Closed: " + e); 
close(); 
} 

private function onError(e:IOErrorEvent):void { 
trace("IO Error: " + e.text); 
close(); 
} 

private function onSecError(e:SecurityErrorEvent):void { 
trace("Security Error: " + e.text); 
close(); 
} 

} 
+0

您是否看過這篇文章http://www.giantflyingsaucer.com/blog/?p=205 – shazin 2013-02-26 05:25:08

+0

是的,這是我第一次使用的教程,但您可以在帖子中看到更多人遇到我的問題評論... – 2013-02-26 05:27:11

+0

你可以發佈和AS3代碼。也許閃光燈關閉連接? (即使用本地變量插座或超出範圍) – 2013-02-26 09:57:11

回答

0

所以,我已經解決了這個問題。閃存通信套接字中一個非常重要的事情是Flash打開套接字橋,詢問策略文件,然後關閉它。因此,在您的服務器中,您必須接收連接,檢查策略文件請求,發送策略文件並關閉網橋。接收到策略文件後,Flash將再次打開連接,並正常通信而不再詢問策略文件。

因此,獲得新連接後,您必須正常啓動您的邏輯,但如果您收到策略文件請求,請回答策略文件並關閉連接。