私はすでにそれを失っています...
FlashDevelop(AS3)を介して単純なFlashアプリケーションを構築し、それをサーバーと通信させたい。次に、次のコードを使用して単純なSocketJavaアプリケーションを作成しました。
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アプリケーションを起動すると、実行され、ソケットオブジェクトが作成され、サーバーに接続されます(すべてコンピューター内にあります)。サーバーは接続を試行しますが、次の場合に実行されます。
nbc.readStringByDelimiter("\0");
nbcが閉じていることを示し、サーバーは例外をキャッチします。
"onData: channel is closed (read buffer size=0)"
なぜ私がいつもこれを手に入れるのか誰かが知っていますか?どのように記述しても、Socket、XMLSocket、xSocketDataHandlerなどを使用しても、クローズドチャネルエラーが発生し続けます。
私は何が間違っているのですか?
ありがとう。
編集1:
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();
}
}