AIR android serversocket仅在ADL(AIR调试启动器)中工作
我的问题是,我正在开发一个air应用程序,它通过serversocket(服务器)socket(客户端)彼此通信 当我在Air debug launcher中测试它时,一切都在服务器端工作(我可以从不同的internet连接看到服务器) 但当我尝试从Android设备托管时,它只能在LAN上工作(无法从不同的连接中看到托管服务器) 我的问题是为什么它可以在测试环境中工作,而不能在内置应用程序中工作。。苏很沮丧 这是我的服务器端代码:AIR android serversocket仅在ADL(AIR调试启动器)中工作,android,actionscript-3,air,Android,Actionscript 3,Air,我的问题是,我正在开发一个air应用程序,它通过serversocket(服务器)socket(客户端)彼此通信 当我在Air debug launcher中测试它时,一切都在服务器端工作(我可以从不同的internet连接看到服务器) 但当我尝试从Android设备托管时,它只能在LAN上工作(无法从不同的连接中看到托管服务器) 我的问题是为什么它可以在测试环境中工作,而不能在内置应用程序中工作。。苏很沮丧 这是我的服务器端代码: package AS { import flash.disp
package AS {
import flash.display.MovieClip;
import AS.Constants;
import flash.net.ServerSocket;
import flash.net.Socket;
import flash.events.ServerSocketConnectEvent;
import flash.events.ProgressEvent;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import flash.text.TextFieldType;
import flash.net.SharedObject;
import fl.data.DataProvider;
import flash.net.URLRequest;
import flash.media.Sound;
import flash.desktop.NativeApplication;
import flash.desktop.SystemIdleMode;
import flash.text.TextFormat;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
public class chatPage extends MovieClip {
private var server:ServerSocket;
private var clients:Vector.<Socket> = new Vector.<Socket>;
private var clientUsernames:Array = new Array();
private var autoScroll:Boolean=true;
private var autoClean:Boolean=false;
private var counter:int=900;
private var soundwarn:Boolean=true;
private var myformat:TextFormat=new TextFormat();
public function chatPage(address:String="0.0.0.0",port:uint=8888):void {
server = new ServerSocket();
server.bind(port,address);
server.addEventListener(ServerSocketConnectEvent.CONNECT, serverConnectHandler);
server.listen();
if(!server.listening){
die();
Constants.mainRef.initLoginScreen("not listening");
}else if(!server.bound){
die();
Constants.mainRef.initLoginScreen("not bound");
}
myformat.color=0xffffff;
client_list.setRendererStyle("textFormat",myformat);
soundButton.gotoAndStop(1);
chat_txt.text = String("");
chat_txt.scrollV=chat_txt.maxScrollV;
scrollBar.update();
scrollBar.addEventListener(Event.SCROLL, scrollingListener);
send_txt.addEventListener(KeyboardEvent.KEY_DOWN, commandHandler);
autoClean_btn.addEventListener(Event.CHANGE, autoCleanHandler);
soundButton.addEventListener(MouseEvent.CLICK, soundClickHandler);
close_btn.addEventListener(MouseEvent.CLICK, closeHandler);
kick_btn.addEventListener(MouseEvent.CLICK, kickHandler);
ban_btn.addEventListener(MouseEvent.CLICK, banHandler);
burn_btn.addEventListener(MouseEvent.CLICK, burnHandler);
share_btn.addEventListener(MouseEvent.CLICK, shareHandler);
scroll_down_btn.addEventListener(MouseEvent.CLICK, scrollDownHandler);
preventSleep_check.addEventListener(Event.CHANGE, sleepChangeHandler);
}
private function burnHandler(e:MouseEvent):void {
//burn all evidence for you and all your clients
if(chat_txt.length > 0){
send(4,Constants.mainRef.encrypt("burn"));
chat_txt.text = String("");
chat_txt.scrollV=chat_txt.maxScrollV;
scrollBar.update();
}
}
private function shareHandler(e:MouseEvent):void {
//share the contents of your chat_txt to all your clients
if(chat_txt.length > 0){
send(5,Constants.mainRef.encrypt(chat_txt.text));
}
}
private function banHandler(e:MouseEvent):void {
var tempIpArr:Array = new Array();
for (var i: uint = 0; i < clients.length; i++) {
tempIpArr.push(clients[i].remoteAddress);
}
Constants.STAGE.addChild(new listDialog(clientUsernames, tempIpArr, this) );
}
private function sleepChangeHandler(e:Event):void{
if(this.preventSleep_check.selected){
NativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.KEEP_AWAKE;
}else{
NativeApplication.nativeApplication.systemIdleMode = SystemIdleMode.NORMAL;
}
}
private function kickHandler(e:MouseEvent):void {
if(client_list.selectedIndex > -1){
clients[client_list.selectedIndex].close();
clients[client_list.selectedIndex].removeEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
clients[client_list.selectedIndex].removeEventListener(Event.CLOSE, socketDisconnectHandler);
clients.splice(client_list.selectedIndex,1);
//send("▼"+clientUsernames[client_list.selectedIndex]);
send(3,String(clientUsernames[client_list.selectedIndex]));
clientUsernames.splice(client_list.selectedIndex,1);
client_list.dataProvider = new DataProvider( clientUsernames );
}
}
public function remoteKick(index:uint):void{
clients[index].close();
clients[index].removeEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
clients[index].removeEventListener(Event.CLOSE, socketDisconnectHandler);
clients.splice(index,1);
send(3,String(clientUsernames[index]));
clientUsernames.splice(index,1);
client_list.dataProvider = new DataProvider( clientUsernames );
}
private function scrollDownHandler(e:MouseEvent):void {
autoScroll=true;
chat_txt.scrollV=chat_txt.maxScrollV;
scrollBar.update();
}
private function closeHandler(e:MouseEvent):void {
die();
Constants.mainRef.initLoginScreen("Chat room terminated!");
//Constants.STAGE.addChild(new logInScreen("Chat room terminated!"));
}
private function soundClickHandler(e:MouseEvent):void {
if(soundButton.currentFrame == 1){
soundwarn=false;
soundButton.gotoAndStop(2);
}else{
soundwarn=true;
soundButton.gotoAndStop(1);
}
}
private function autoCleanFrameListener(e:Event):void {
if(autoClean){
counter--;
counter_txt.text = String( Math.floor( counter / 30 ) + "s" );
if(counter <= 0){
counter_txt.text = String("30s");
chat_txt.text = String("");
chat_txt.scrollV=chat_txt.maxScrollV;
scrollBar.update();
currentDataStr = String("");
counter=900;
}
}
}
private function autoCleanHandler(e:Event):void {
if(autoClean_btn.selected){
autoClean=true;
counter_txt.text = String("30s");
this.addEventListener(Event.ENTER_FRAME, autoCleanFrameListener);
}else{
this.removeEventListener(Event.ENTER_FRAME, autoCleanFrameListener);
autoClean=false;
counter_txt.text = String("");
counter=900;
}
}
private function scrollingListener(e:Event):void {
if(chat_txt.scrollV!=chat_txt.maxScrollV){
autoScroll=false;
}
}
private function serverConnectHandler(e:ServerSocketConnectEvent):void {
var socket:Socket = e.socket;
var banned:Boolean;
if(Constants.banList.length > 0){
for (var i: uint = 0; i < Constants.banList.length; i++) {
if(Constants.banList[i] == socket.remoteAddress){
banned=true;
break;
}else{
banned=false;
}
}
}else{
banned=false;
}
if(!banned){
clients.push(socket);
clients[clients.length-1].addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
clients[clients.length-1].addEventListener(Event.CLOSE, socketDisconnectHandler);
send(2,Constants.mainRef.encrypt(Constants.mainRef.username));
}else{
socket.close();
}
}
private function socketDisconnectHandler(e:Event):void {
send(3,Constants.mainRef.encrypt( clientUsernames[clients.indexOf(e.target)] ) );
clientUsernames.splice(clients.indexOf(e.target),1);
client_list.dataProvider = new DataProvider( clientUsernames );
clients.splice(clients.indexOf(e.target),1);
e.target.close();
e.target.removeEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
e.target.removeEventListener(Event.CLOSE, socketDisconnectHandler);
}
private var currentDataStr:String;
private var currentDataType:uint;
private function socketDataHandler(e:ProgressEvent):void {
var socket:Socket = e.currentTarget as Socket;
currentDataType = socket.readUnsignedInt();
currentDataStr = socket.readUTFBytes(socket.bytesAvailable);
send(currentDataType, currentDataStr);
if(currentDataType == 1){
chat_txt.appendText(Constants.mainRef.decrypt(currentDataStr) );
if(autoScroll){
chat_txt.scrollV=chat_txt.maxScrollV;
}
scrollBar.update();
if(soundwarn){
//give sound warning
var snd:Sound = new Sound(new URLRequest("sound/ding.mp3"));
snd.play();
}
}else if(currentDataType == 2){
var tempString:String = Constants.mainRef.decrypt(currentDataStr);
clientUsernames.push(tempString);
client_list.dataProvider = new DataProvider( clientUsernames );
}
tempString=String("");
currentDataStr=String("");
currentDataType=0;
}
private function commandHandler(e:KeyboardEvent):void {
if(e.keyCode==13){
//ENTER GOT PRESSED
var commandStr:String = send_txt.text;
if(commandStr.indexOf(".") == 0){
if(commandStr.indexOf(".del") > -1 ){
chat_txt.text = String("");
currentDataStr = String("");
chat_txt.scrollV=chat_txt.maxScrollV;
scrollBar.update();
}else if(commandStr.indexOf(".burn") > -1 ){
if(chat_txt.length > 0){
send(4,Constants.mainRef.encrypt("burn"));
chat_txt.text = String("");
chat_txt.scrollV=chat_txt.maxScrollV;
scrollBar.update();
}
}else if(commandStr.indexOf(".share") > -1 ){
if(chat_txt.length > 0){
send(5,Constants.mainRef.encrypt(chat_txt.text));
}
}else if(commandStr.indexOf(".ip") > -1 ){
getIpOnline();
}else if(commandStr.indexOf(".roll") > -1 ){
var rngMax:int = parseInt( commandStr.slice(commandStr.indexOf(" ")) );
if(rngMax > 0){
var rawString:String = Constants.mainRef.username + " rolled " + String(Constants.mainRef.randomNum(1,rngMax)) + " out of " + String(rngMax) + "\n";
send(1, Constants.mainRef.encrypt( rawString ) );
chat_txt.appendText( rawString );
if(autoScroll){
chat_txt.scrollV=chat_txt.maxScrollV;
}
scrollBar.update();
}
}else if(commandStr.indexOf(".kick") > -1 && client_list.selectedIndex > -1){
clients[client_list.selectedIndex].close();
clients[client_list.selectedIndex].removeEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
clients[client_list.selectedIndex].removeEventListener(Event.CLOSE, socketDisconnectHandler);
clients.splice(client_list.selectedIndex,1);
send(3,Constants.mainRef.encrypt( clientUsernames[client_list.selectedIndex] ) );
clientUsernames.splice(client_list.selectedIndex,1);
client_list.dataProvider = new DataProvider( clientUsernames );
}
}else if(commandStr.length > 0){
send(1, Constants.mainRef.encrypt(Constants.mainRef.username + ": " + commandStr + "\n"));
chat_txt.appendText(Constants.mainRef.username + ": " + commandStr + "\n");
if(autoScroll){
chat_txt.scrollV=chat_txt.maxScrollV;
}
scrollBar.update();
}
send_txt.text = String("");
commandStr = String("");
Constants.STAGE.focus = null;
}
}
public function send(typeIndex:uint, data:String):void {
for each(var client:Socket in clients){
client.writeUnsignedInt(typeIndex);
client.writeUTFBytes(data);
client.flush();
}
}
private function getIpOnline():void{
var phpFileRequest:URLRequest = new URLRequest("https://api.ipify.org/");
phpFileRequest.method = URLRequestMethod.GET;
var phpLoader:URLLoader = new URLLoader();
phpLoader.addEventListener(Event.COMPLETE, showResult);
phpLoader.load(phpFileRequest);
}
private function showResult(e:Event):void{
send_txt.text = String(e.target.data);
e.target.removeEventListener(Event.COMPLETE, showResult);
}
public function die():void{
var i:uint
for(i = 0; i < clients.length; i++) {
clients[i].close();
clients[i].removeEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
clients[i].removeEventListener(Event.CLOSE, socketDisconnectHandler);
}
server.removeEventListener(ServerSocketConnectEvent.CONNECT, serverConnectHandler);
server.close();
chat_txt.text = String("");
send_txt.text = String("");
kick_btn.removeEventListener(MouseEvent.CLICK, kickHandler);
ban_btn.removeEventListener(MouseEvent.CLICK, banHandler);
preventSleep_check.removeEventListener(Event.CHANGE, sleepChangeHandler);
close_btn.removeEventListener(MouseEvent.CLICK, closeHandler);
burn_btn.removeEventListener(MouseEvent.CLICK, burnHandler);
share_btn.removeEventListener(MouseEvent.CLICK, shareHandler);
scroll_down_btn.removeEventListener(MouseEvent.CLICK, scrollDownHandler);
soundButton.removeEventListener(MouseEvent.CLICK, soundClickHandler);
autoClean_btn.removeEventListener(Event.CHANGE, autoCleanHandler);
this.removeEventListener(Event.ENTER_FRAME, autoCleanFrameListener);
scrollBar.removeEventListener(Event.SCROLL, scrollingListener);
send_txt.removeEventListener(KeyboardEvent.KEY_DOWN, commandHandler);
clients.length=0;
clientUsernames.length=0;
if(Constants.cardIndexer.length > 0){
for (i = 0; i < Constants.cardIndexer.length; i++) {
Constants.cardIndexer[i].die(4);
}
Constants.cardIndexer.length=0;
Constants.deckRef.length=0;
}
this.parent.removeChild(this);
}
private function chatText(texty:String,chat:Boolean=true):void{
if(chat){
send(1, Constants.mainRef.encrypt(Constants.mainRef.username + ": " + texty + "\n"));
chat_txt.appendText(Constants.mainRef.username + ": " + texty + "\n");
if(autoScroll){
chat_txt.scrollV=chat_txt.maxScrollV;
}
scrollBar.update();
}else{
send(1, Constants.mainRef.encrypt(texty + "\n"));
chat_txt.appendText(texty + "\n");
if(autoScroll){
chat_txt.scrollV=chat_txt.maxScrollV;
}
scrollBar.update();
}
}
}
打包为{
导入flash.display.MovieClip;
导入为常数;
导入flash.net.ServerSocket;
导入flash.net.Socket;
导入flash.events.ServerSocketConnectEvent;
导入flash.events.ProgressEvent;
导入flash.events.Event;
导入flash.events.MouseEvent;
导入flash.events.KeyboardEvent;
导入flash.text.TextFieldType;
导入flash.net.SharedObject;
导入fl.data.DataProvider;
导入flash.net.URLRequest;
导入flash.media.Sound;
导入flash.desktop.NativeApplication;
导入flash.desktop.SystemIdleMode;
导入flash.text.TextFormat;
导入flash.net.urloader;
导入flash.net.URLRequest;
导入flash.net.URLRequestMethod;
公共类聊天页扩展了MovieClip{
私有var服务器:ServerSocket;
私有var客户端:向量。=新向量。;
private var clientUsernames:Array=new Array();
私有变量autoScroll:Boolean=true;
私有变量自动清理:布尔值=false;
专用var计数器:int=900;
私有变量soundwarn:Boolean=true;
私有变量myformat:TextFormat=newtextformat();
公共函数聊天页(地址:String=“0.0.0.0”,端口:uint=8888):无效{
server=newserversocket();
绑定(端口、地址);
addEventListener(ServerSocketConnectEvent.CONNECT,serverConnectHandler);
server.listen();
如果(!server.listing){
模具();
常量.mainRef.initLoginScreen(“未侦听”);
}else如果(!server.bound){
模具();
常量.mainRef.initLoginScreen(“未绑定”);
}
myformat.color=0xffffff;
client_list.setRenderStyle(“textFormat”,myformat);
soundButton.gotoAndStop(1);
chat_txt.text=字符串(“”);
chat_txt.scrollV=chat_txt.maxsollv;
scrollBar.update();
scrollBar.addEventListener(Event.SCROLL,scrollingListener);
send_txt.addEventListener(KeyboardEvent.KEY_DOWN,commandHandler);
autoClean_btn.addEventListener(Event.CHANGE,autoCleanHandler);
soundButton.addEventListener(MouseEvent.CLICK,soundClickHandler);
close_btn.addEventListener(MouseEvent.CLICK,closeHandler);
kick_btn.addEventListener(MouseEvent.CLICK,kickHandler);
ban_btn.addEventListener(MouseEvent.CLICK,banHandler);
burn_btn.addEventListener(MouseEvent.CLICK,burnHandler);
share_btn.addEventListener(MouseEvent.CLICK,shareHandler);
向下滚动\u btn.addEventListener(MouseEvent.CLICK,scrollDownHandler);
preventSleep\u check.addEventListener(Event.CHANGE,sleepChangeHandler);
}
私有函数burnHandler(e:MouseeEvent):void{
//为你和你所有的客户烧掉所有的证据
如果(chat_txt.length>0){
发送(4,Constants.mainRef.encrypt(“burn”);
chat_txt.text=字符串(“”);
chat_txt.scrollV=chat_txt.maxsollv;
scrollBar.update();
}
}
私有函数shareHandler(e:MouseeEvent):void{
//将聊天内容分享给所有客户
如果(chat_txt.length>0){
发送(5,Constants.mainRef.encrypt(chat_txt.text));
}
}
私有函数banHandler(e:MouseEvent):void{
var tempIpArr:Array=new Array();
对于(变量i:uint=0;i-1){
客户机[client_list.selectedIndex].close();
客户机[客户机列表。selectedIndex].removeEventListener(ProgressEvent.SOCKET\u数据,socketDataHandler);
客户端[客户端列表。selectedIndex].removeEventListener(Event.CLOSE,socketDisconnectHandler);
clients.splice(client\u list.selectedIndex,1);
//发送(”▼"+客户端用户名[客户端列表.selectedIndex]);
发送(3,字符串(clientUsernames[client_list.selectedIndex]);
clientUsernames.splice(客户机列表,selectedIndex,1);
client_list.dataProvider=新的数据提供程序(clientUsernames);
}
}
公共函数remoteKick(索引:uint):无效{
客户端[index].close();
客户端[索引].removeEventListener(ProgressEvent.SOCKET_数据,socketDataHandler);
客户端[索引].removeEventListener(Event.CLOSE,socketDisconnectHandler);
客户。拼接(索引,1);
发送(3,字符串(clientUsernames[index]);
clientUsernames.splice(索引,1);
client_list.dataProvider=新的数据提供程序(clientUsernames);
}
私有函数scrollDownHandler(e:MouseEvent):void{
autoScroll=true;
chat_txt.scrollV=chat_txt.maxsollv;
scrollBar.update();
}
私有函数closeHandler(e:MouseEvent):void{
模具();
常量.mainRef.initLoginScreen(“聊天室终止!”);
//常量.STAGE.addChild(新登录屏幕(“聊天室终止!”);
}
私有函数soundClickHandler(e:MouseeEvent):无效{
如果(