很久以前就写了,, AS3与C#的Socket的通信,C#服务端没什么说的。
as端以前用的XMLSocket,做聊天功能的时候功能基本可以用,但准备把通信内容进行加密的时候,却出现问题了
C#收到的ByteArray 值总是不对。即XMLSocket以String+\0的方式发送数据。编辑后很空间出问题。最后发现XMLSocket
是对Socket进行了一次封装的,针对XML文件,字符串传输没问。
现在AS端改成Socket 代码如下:
package
{
import flash.events.*;
import flash.net.Socket;
import flash.utils.ByteArray;
import mx.collections.ArrayCollection;
import mx.controls.Alert;
import mx.events.CloseEvent;
import mx.events.ListEvent;
public class MySocket
{
public function MySocket()
{
}
private var _hostname:String = "192.168.13.9";//客户端的人
private var _port:int = 6060;//私聊对象
private var isConn:Boolean;//连接到服务器 表示是否连接成功
public static var AcceptData:ArrayCollection;
//Socket
private var mySocket:Socket;
public function InitConnent():void
{
try
{ //Socket连接
mySocket = new Socket();
mySocket.addEventListener(Event.CONNECT,mySocketOnConnect);
mySocket.addEventListener(IOErrorEvent.IO_ERROR,mySocketOnError);
mySocket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,mySocketOnSecurityError);
mySocket.addEventListener(ProgressEvent.SOCKET_DATA, mySocketOnDataGet);
if(_hostname && _port)
{
mySocket.connect(_hostname, _port);//设置端口
}
}
catch(ex:Error)
{
Alert.show("InitConnent error:"+ex.message);
}
}
//Socket连接成功
private function mySocketOnConnect( event:Event ):void
{
Alert.show("Socket已经连接.");
SendData("myname"+"|<policy-file-xxquest/>\n");
Alert.show("发送:myname | <policy-file-xxquest/>\n:请求连接");
}
//Socket连接失败
private function mySocketOnError( event:Event ):void {
Alert.show("Socket连接失败.");
}
//安全错误
private function mySocketOnSecurityError( event:Event ):void {
Alert.show("发生SecurityError.");
}
//Socket获取数据
private function mySocketOnDataGet( event:ProgressEvent ):void
{
var strTemp : String ="";
strTemp +="\r\n";
strTemp +="Socket received " + mySocket.bytesAvailable + " byte(s) of data:\r\n";
while(mySocket.bytesAvailable)
{
var msg:String = mySocket.readUTFBytes(mySocket.bytesAvailable);
strTemp +=msg+"\r\n";
//强制使用utf8格式,避免中文乱码
msg+=mySocket.readMultiByte(mySocket.bytesAvailable,"utf8");
//使用n换行符号把信息切开
var arr:Array=msg.split('n');
for(var i:int=0;i<arr.length;i++)
{
if(arr[i].length>1)
{
//正则表达式,回车符
var myPattern:RegExp=/r/;
//删除回车符
arr[i]=arr[i].replace(myPattern,'');
//在聊天框中输出
}
}
//myText.verticalScrollPosition = myText.maxVerticalScrollPosition;//滚动到最下面
}
Alert.show("ProgressEvent: " + strTemp);
}
//Socket发送数据
public function SendData(data:String):void
{
if(mySocket.connected)
{
if(AcceptData == null)
{
AcceptData = new ArrayCollection();
}
AcceptData.addItem(data.toString());
//加密
var inputbyte:ByteArray;
if (data)
{
inputbyte = new ByteArray(); // 可以进行优化 inputbyte 设计成全局 不用每次分配内存
inputbyte.writeUTFBytes(data.toString());
}
var arrkey:ByteArray = new ByteArray(); // 可以进行优化 Key 设计成静态 DesKey设计成静态函数
arrkey.writeUTFBytes("fucktheworld");
var mydes:DesKey = new DesKey(arrkey);
for (var i:uint = 0; i < inputbyte.length; i++)
{
trace(i+"inputbyte:"+inputbyte[i]);
}
mydes.encrypt(inputbyte, 0);
for (var j:uint = 0; j < inputbyte.length; j++)
{
trace(j+"inputbyte:"+inputbyte[j]);
}
//mySocket.writeUTFBytes(data + "fuck,,,");
mySocket.writeBytes(inputbyte);
mySocket.flush()
}
}
protected function sendMessage(msg:String):void //发送数据到服务器
{
//新建一个ByteArray来存放数据
var message:ByteArray=new ByteArray();
//写入数据,使用writeUTFBytes以utf8格式传数据,避免中文乱码
message.writeUTFBytes(msg+"n");
//写入socket的缓冲区
mySocket.writeBytes(message);
//调用flush方法发送信息
mySocket.flush();
}
/*flash.net.Socket类
方法:返回值类型 描述 字节数
readBoolean( ):Boolean 从Socket读取一个Boolean值. 1
readByte( ):int 从Socket读取一个byte值. 1
readDouble( ):Number 从Socket读取一个IEEE 754双精度浮点数. 8
readFloat( ):Number 从Socket读取一个IEEE 754单精度浮点数. 4
readInt( ):int 从Socket读取一个有符号32-bit整数值. 4
readObject( ):* 从Socket读取一个AMF-encoded对象. n
readShort( ):int 从Socket读取一个有符号16-bit整数值. 2
readUnsignedByte( ):uint 从Socket读取一个无符号字节. 1
readUnsignedInt( ):uint 从Socket读取一个无符号32-bit整数 4
readUnsignedShort( ):uint 从Socket读取一个无符号16-bit整数. 2
readUTF( ):String 从Socket读取一个一个UTF8字符串. n
readBytes方法:
一个flash.util.ByteArray实例读取从socket中收到的数据
一个uint值,指定从什么位置开始读取socket中收到数据的偏移量.默认值为0
一个uint值,用于指定读取bytes的数量.默认值为0,意思就是说将所有的可用的数据都放入ByteArray中
readUTFBytes方法:只需要一个长度参数用于指定UTF-8字节的读入数量,并且该方法会将所有读入的字节码转换成为字符串类型
为ocketData事件添加一个事件监听器,任何时候只要有新的数据从一个socket服务器发送过来,都会触发事件控制器.在事件处理器的内部我们写入我们要执行的代码去读取和处理收到的数据
在从一个Socket读数据之前,首先要判断bytesAvailable的属性.如果你不知道要读入的数据类型是什么就去读数据的话,将会产生一个错误(flash.errors.EOFError).*/
}
}
其实加密算法用的以下链接
http://www.cnblogs.com/alala666888/archive/2011/05/09/2040861.html
C#服务端 不变测试通过 。