socket编程 简介
Socket 套接字连接允许Flash播放器通过指定的端口与服务器通信,socket连接与其他通信技术
最大的不同是socket连接在数据传输完成后不会自动关闭。
当socket连接创建后,连接会一直保持,直到客户端(Flash播放器)和服务端主动关闭,因此
服务器可在任何时间不用客户端请求即可发送数据给客户端。
Socket连接被普遍用于创建多用户应用程序,比如说一个在线聊天室,它有一个服务端程序和
无数个Flash客户端组成。每次客户端发送消息给服务器,服务器检测那些用户可以收到这些消
息并把消息传给指定客户端,这种情况下接收客户端并没有提前请求数据而是通过服务器主动
推送数据的。当客户端关闭时,服务端提示其他客户端某客户端已离线。
Flash播放器提供了两种类型的socket连接。一种是早期版本就有的XMLSocket,Flash播放器9增
加了二进制socket连接。
使用flash.net.XMLSocket类创建XML数据格式的socket连接,使用flash.net.Socket类创建二进制数
据格式socket连接。
XML socket连接以XML数据报交换数据,二进制socket连接是ActionScript 3.0新增的功能,相比
之下更低级,但功能很强大,几乎可以连接任意类型的socket服务端程序。例如二进制sockets 可
连接邮件服务端程序(POP3, SMTP, 和IMAP), 新闻服务器(NNTP), 聊天室服务器或远程桌面
VNC服务器( RFB)。
不管是哪种类型的socket 连接,其通信方式都是异步的,也就是说你不能直接从socket 连接中
读取数据,而是通过事件处理函数进行读取处理。
以上问第三方翻译
下面贴出我写的一段代码没有什么实在意思仅为学习之用,写得不好不请各位多指教
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<mx:Application xmlns:mx=
"http://www.adobe.com/2006/mxml"
layout=
"vertical"
verticalAlign=
"middle"
fontSize=
"12"
creationComplete=
"onInit()"
>
<mx:ViewStack id=
"viewstack1"
width=
"454"
height=
"338"
selectedIndex=
"0"
>
<mx:Canvas
label
=
"View 1"
width=
"100%"
height=
"100%"
>
<mx:TitleWindow width=
"100%"
height=
"100%"
layout=
"absolute"
title=
"连接设置"
>
<mx:Button x=
"181"
y=
"186"
label
=
"连 接"
click=
"onConnect()"
id=
"btnCon"
/>
<mx:TextInput x=
"181"
y=
"31"
id=
"txtHost"
text=
"127.0.0.1"
width=
"184"
/>
<mx:TextInput x=
"181"
y=
"94"
id=
"txtPort"
width=
"184"
text=
"6000"
/>
<mx:Label x=
"74"
y=
"31"
text=
"链接地址:"
/>
<mx:Label x=
"74"
y=
"94"
text=
"连接端口:"
/>
<mx:Button x=
"297"
y=
"186"
label
=
"清 空"
click=
"onEmpty()"
/>
</mx:TitleWindow>
</mx:Canvas>
<mx:Canvas
label
=
"View 1"
width=
"100%"
height=
"100%"
>
<mx:TitleWindow width=
"100%"
height=
"100%"
layout=
"absolute"
title=
"消息窗口"
>
<mx:TextArea x=
"10"
y=
"10"
width=
"414"
height=
"176"
id=
"txtRec"
/>
<mx:Button x=
"160"
y=
"262"
label
=
"发 送"
fontSize=
"12"
click=
"onSendData()"
/>
<mx:Button x=
"260"
y=
"262"
label
=
"断 开"
fontSize=
"12"
click=
"onClose()"
/>
<mx:TextInput x=
"10"
y=
"194"
width=
"414"
id=
"txtSend"
height=
"45"
/>
<mx:Text x=
"201"
y=
"202"
text=
"正在断开,请稍后..."
visible=
"false"
id=
"msg"
/>
<mx:Button x=
"355"
y=
"262"
label
=
"关 闭"
click=
"onCloseWindow()"
/>
</mx:TitleWindow>
</mx:Canvas>
</mx:ViewStack>
<mx:Script>
<![CDATA[
import
mx.controls.Alert;
import
flash.net.Socket;
import
flash.utils.ByteArray;
import
flash.events.SecurityErrorEvent;
import
flash.events.IOErrorEvent;
import
flash.events.ProgressEvent;
//全局变量
private
var
socket:Socket=
new
Socket();
//连接
private
function
onInit():
void
{
socket.addEventListener(Event.CONNECT,connect);
socket.addEventListener(Event.CLOSE,onClosed);
socket.addEventListener(IOErrorEvent.IO_ERROR,onIoError);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,onSeurity);
socket.addEventListener(ProgressEvent.SOCKET_DATA,onReceiveData);
}
private
function
connect(e:Event):
void
{
this
.viewstack1.selectedIndex=
1
;
}
private
function
onClosed(e:Event):
void
{
}
//连接服务器
private
function
onConnect():
void
{
var
host:
String
=
this
.txtHost.text;
var
port:
Number
=
Number
(
this
.txtPort.text);
if
(!(host&&port))
{
Alert.show(
"服务器地址和端口不能为空!"
,
"提示"
);
return
;
}
socket.connect(host,port);
}
//关闭服务器
private
function
onClose():
void
{
socket.close();
this
.viewstack1.selectedIndex=
0
;
}
//IO错误
private
function
onIoError(evt:IOErrorEvent):
void
{
Alert.show(evt.text,
"IO错误!"
);
}
//安全策略错误
private
function
onSeurity(evt:SecurityErrorEvent):
void
{
Alert.show(evt.text,
"安全策略错误"
);
}
//发送
private
function
onSendData():
void
{
var
buff:ByteArray=
new
ByteArray();
buff.writeUTF(
this
.txtSend.text);
socket.writeBytes(buff,
0
,buff.length);
socket.flush();
//发送数据
}
//接收
private
function
onReceiveData(evt:ProgressEvent):
void
{
while
(socket.bytesAvailable)
{
this
.txtRec.text+=socket.readMultiByte(socket.bytesAvailable,
"utf8"
)+
"\n"
;
}
}
/**ui操作**/
//清空
private
function
onEmpty():
void
{
this
.txtHost.text=
""
;
this
.txtPort.text=
""
;
this
.txtHost.setFocus();
}
//关闭浏览器
private
function
onCloseWindow():
void
{
var
request:URLRequest =
new
URLRequest(
"javascript:window.close()"
);
navigateToURL(request,
"_self"
);
}
]]>
</mx:Script>
</mx:Application>
|