搜索

  • 好友链接

  • 链接表

  • Meta

    日志分类

    日志归档

    本月top点击

    历史top点击

    28

    [转贴]flash与后台数据交换方法整理4-XMLSocket篇

    四、XMLSocket
    XMLSocket主要用于与服务端进行即时通信,目前的应用领域主要是Flash文本聊天和Flash在线游戏等方面。

    XMLSocket的优点:

    1、能和服务端即时通信;

    2、Flash Player 5.0以上的版本内置类,不需另装组件或插件;

    3、因为XMLSocket就是相当于一个Socket客户端,所以一般的中间件都支持的(如java,.Net等)

    XMLSocket的缺点:

    1、XMLSocket只能传字符串或xml格式的文本,数据类型单一;

    2、XMLSocket服务端自行开发的话,需要对Socket技术比较了解才行,好在网上有现成的服务端软件(商业的XMLSocket Server 有Unity、Fortress;开源的XMLSocket Server 有Oregano Multiuser Server);

    3、还有就是XMLSocket的80端口与flash安全策略问题。(网上有一个解决方法,不知是否可行,请自行验证)

    1. //=======================================;
    2.  
    3. // Flash客户端(以Flash文本聊天为例);
    4.  
    5. //=======================================;
    6.  
    7. var paramObj:Object = new Object();
    8.  
    9. //命令分隔符;
    10.  
    11. paramObj.CommandDelimiters = "-@@##@@-";
    12.  
    13. //用户列表分隔符;
    14.  
    15. paramObj.PeopleDelimiters = "-@#@-";
    16.  
    17. //建立XMLSocket对象;
    18.  
    19. var socket:XMLSocket = new XMLSocket();
    20.  
    21. //连接状态事件;
    22.  
    23. socket.onConnect = function(success) {
    24.  
    25. trace("socket.onConnect:"+success);
    26.  
    27. if (!success) {
    28.  
    29. trace("服务器连接失败,请检查网络状态!");
    30.  
    31. }
    32.  
    33. };
    34.  
    35. //关闭事件;
    36.  
    37. socket.onClose = function() {
    38.  
    39. trace("服务端已关闭!");
    40.  
    41. logoutChat();
    42.  
    43. };
    44.  
    45. //数据通信事件;
    46.  
    47. socket.onData = function(src) {
    48.  
    49. //trace("socket.onData:"+src);
    50.  
    51. doCommand(getCmdArrayByMsg(trim(src)));
    52.  
    53. };
    54.  
    55. //用户登录;
    56.  
    57. function loginChat():Void {
    58.  
    59. //连接Socket服务端;
    60.  
    61. socket.connect(localhost”, “8888);
    62.  
    63. sendSocket("INFO"+paramObj.CommandDelimiters+msg);
    64.  
    65. }
    66.  
    67. //用户注销;
    68.  
    69. function logoutChat(b:Boolean):Void {
    70.  
    71. sendSocket("QUIT");
    72.  
    73. }
    74.  
    75. //显示聊天信息;
    76.  
    77. function showChat(msg:String):Void {
    78.  
    79. trace(“聊天信息:”+msg);
    80.  
    81. }
    82.  
    83. //发送聊天信息;
    84.  
    85. function sendChat(msg:String):Void{
    86.  
    87. sendSocket("MSG"+paramObj.CommandDelimiters+msg+paramObj.CommandDelimiters+msg);
    88.  
    89. }
    90.  
    91. //向服务端发送信息;
    92.  
    93. function sendSocket(msg:String):Void {
    94.  
    95. socket.send(msg+"\r");
    96.  
    97. }
    98.  
    99.  
    100.  
    101. //处理服务端返回信息;
    102.  
    103. function getCmdArrayByMsg(msg:String):Array {
    104.  
    105. if (msg.charCodeAt(0) == 13 && msg.charCodeAt(1) == 10) {
    106.  
    107. msg = msg.substr(2);
    108.  
    109. }
    110.  
    111. return msg.split(paramObj.CommandDelimiters);
    112.  
    113. }
    114.  
    115.  
    116.  
    117. function doCommand(arr:Array):Void {
    118.  
    119. switch (arr[0]) {
    120.  
    121. case "MSG" :
    122.  
    123. showChat(arr[1]);
    124.  
    125. break;
    126.  
    127. case "TAKEN" :
    128.  
    129. trace("你的登录名已经有了,请重新换一个登录名!");
    130.  
    131. break;
    132.  
    133. case "PEOPLE" :
    134.  
    135. doPeople(arr[1]);
    136.  
    137. break;
    138.  
    139. }
    140.  
    141. }
    142.  
    143. //显示在线用户列表;
    144.  
    145. function doPeople(msg:String):Void {
    146.  
    147. var people_arr:Array = msg.split(paramObj.PeopleDelimiters);
    148.  
    149. trace(people_arr);
    150.  
    151. }

    //上面与XMLSocket有关的主要代码,显示方面自己添加相关组件就行了!

    //有一个注意点,在flash向服务端发送的命令的最后一定要加上“\r”,否则服务端无法收到消息(我的服务端是用Java开发的)

    1. /=======================================;
    2.  
    3. // 服务端代码(我用java开发的,其他版本自行研究);
    4.  
    5. // ChatServer.java
    6.  
    7. //=======================================;
    8.  
    9. package com.klstudio.socket.chat;
    10.  
    11.  
    12.  
    13. import java.io.IOException;
    14.  
    15. import java.net.ServerSocket;
    16.  
    17. import java.net.Socket;
    18.  
    19. import java.util.Vector;
    20.  
    21.  
    22.  
    23. //import com.klstudio.util.Logger;
    24.  
    25.  
    26.  
    27. /**
    28.  
    29. * @author kinglong
    30.  
    31. *
    32.  
    33. * TODO 要更改此生成的类型注释的模板,请转至窗口-首选项- Java -代码样式-代码模板
    34.  
    35. */
    36.  
    37. public class ChatServer {
    38.  
    39. //private Logger logger;
    40.  
    41. private static Vector clients = new Vector();
    42.  
    43. private static ServerSocket server = null;
    44.  
    45. private static Socket socket = null;
    46.  
    47. public static String CommandDelimiters = "-@@##@@-";
    48.  
    49. public static String PeopleDelimiters = "-@#@-";
    50.  
    51.  
    52.  
    53. public ChatServer() {
    54.  
    55. }
    56.  
    57.  
    58.  
    59. public static void notifyRoom() {
    60.  
    61. StringBuffer people = new StringBuffer("PEOPLE"+CommandDelimiters+"所有的人");
    62.  
    63. for (int i = 0; i < clients.size(); i++) {
    64.  
    65. Client client = (Client) clients.elementAt(i);
    66.  
    67. people.append(PeopleDelimiters+client.getClientName());
    68.  
    69. }
    70.  
    71. sendClients(people);
    72.  
    73. }
    74.  
    75. public staticboolean checkName(Client newClient){
    76.  
    77. for(int i=0;i<clients.size();i++){
    78.  
    79. Client client = (Client) clients.elementAt(i);
    80.  
    81. if(client != newClient && client.getClientName().equals(newClient.getClientName())){
    82.  
    83. return false;
    84.  
    85. }
    86.  
    87. }
    88.  
    89. return true;
    90.  
    91. }
    92.  
    93. public static void closeAll(){
    94.  
    95. while(clients.size()>0){
    96.  
    97. Client client = (Client) clients.firstElement();
    98.  
    99. try {
    100.  
    101. client.getClientSocket().close();
    102.  
    103. } catch (IOException e) {
    104.  
    105. // TODO 自动生成 catch 块
    106.  
    107. //Logger logger = new Logger(System.out);
    108.  
    109. //logger.log("错误-" + e.toString());
    110.  
    111. } finally {
    112.  
    113. clients.removeElement(client);
    114.  
    115. }
    116.  
    117. }
    118.  
    119. }
    120.  
    121. public static synchronized void disconnect(Client client) {
    122.  
    123. client.send(new StringBuffer("QUIT"));
    124.  
    125. try {
    126.  
    127. client.getClientSocket().close();
    128.  
    129. } catch (IOException e) {
    130.  
    131. // TODO 自动生成 catch 块
    132.  
    133. //Logger logger = new Logger(System.out);
    134.  
    135. //logger.log("错误-" + e.toString());
    136.  
    137. } finally{
    138.  
    139. clients.removeElement(client);
    140.  
    141. }
    142.  
    143.  
    144.  
    145. }
    146.  
    147.  
    148.  
    149. public static synchronized void sendClients(StringBuffer sb) {
    150.  
    151. for(int i=0;i<clients.size();i++){
    152.  
    153. Client client = (Client) clients.elementAt(i);
    154.  
    155. client.send(sb);
    156.  
    157. }
    158.  
    159. }
    160.  
    161.  
    162.  
    163. public static synchronized void sendClients(StringBuffer sb,String ownerName,String toName) {
    164.  
    165. for(int i=0;i<clients.size();i++){
    166.  
    167. Client client = (Client) clients.elementAt(i);
    168.  
    169. if(toName.equals(client.getClientName()) || toName.equals("所有的人") || ownerName.equals(client.getClientName())){
    170.  
    171. client.send(sb);
    172.  
    173. }
    174.  
    175. }
    176.  
    177. }
    178.  
    179.  
    180.  
    181. public static synchronized void sendClients(Client ownerClient) {
    182.  
    183. for(int i=0;i<clients.size();i++){
    184.  
    185. Client client = (Client) clients.elementAt(i);
    186.  
    187. if(client.getClientName().equals(ownerClient.getClientName())){
    188.  
    189. client.send(new StringBuffer("MSG"+CommandDelimiters+"系统信息>欢迎你进入!"));
    190.  
    191. }else{
    192.  
    193. client.send(new StringBuffer("MSG"+CommandDelimiters+"系统信息>["+ownerClient.getClientName()+"]用户进入!"));
    194.  
    195. }
    196.  
    197. }
    198.  
    199. }
    200.  
    201. public static void main(String[] args) {
    202.  
    203. int port = 8888;
    204.  
    205. if(args.length>0){
    206.  
    207. port = Integer.parseInt(args[0]);
    208.  
    209. }
    210.  
    211. //Logger logger = new Logger(System.out);
    212.  
    213. //logger.log("信息-ChatServer["+port+"]服务正在启动...");
    214.  
    215. try {
    216.  
    217. server = new ServerSocket(port);
    218.  
    219. } catch (IOException e) {
    220.  
    221. // TODO 自动生成 catch 块
    222.  
    223. //logger.log("错误-"+e.toString());
    224.  
    225. }
    226.  
    227. while(true){
    228.  
    229. if(clients.size()<5){
    230.  
    231. try {
    232.  
    233. socket = server.accept();
    234.  
    235. if(socket != null){
    236.  
    237. //logger.log("信息-"+socket.toString()+"连接");
    238.  
    239. }
    240.  
    241. } catch (IOException e) {
    242.  
    243. // TODO 自动生成 catch 块
    244.  
    245. //logger.log("错误-"+e.toString());
    246.  
    247. }
    248.  
    249. int i=0;
    250.  
    251. do{
    252.  
    253. Client client = new Client(socket);
    254.  
    255. if(client.getClientName() != null){
    256.  
    257. clients.addElement(client);
    258.  
    259. if(checkName(client)){
    260.  
    261. //logger.log("信息-"+"目前有["+clients.size()+"]个用户已连接");
    262.  
    263. sendClients(client);
    264.  
    265. client.start();
    266.  
    267. notifyRoom();
    268.  
    269. }else{
    270.  
    271. client.send(new StringBuffer("TAKEN"));
    272.  
    273. disconnect(client);
    274.  
    275. }
    276.  
    277. i++;
    278.  
    279. }
    280.  
    281. break;
    282.  
    283. }while(i<clients.size());
    284.  
    285.  
    286.  
    287. }else{
    288.  
    289. try {
    290.  
    291. Thread.sleep(200);
    292.  
    293. } catch (InterruptedException e) {
    294.  
    295. // TODO 自动生成 catch 块
    296.  
    297. //logger.log("错误-"+e.toString());
    298.  
    299. }
    300.  
    301. }
    302.  
    303. }
    304.  
    305. }
    306.  
    307. }
    1. //=======================================;
    2.  
    3. // Client.java
    4.  
    5. //=======================================;
    6.  
    7. /*
    8.  
    9. * 创建日期2005-10-10
    10.  
    11. *
    12.  
    13. * TODO 要更改此生成的文件的模板,请转至
    14.  
    15. * 窗口-首选项- Java -代码样式-代码模板
    16.  
    17. */
    18.  
    19. package com.klstudio.socket.chat;
    20.  
    21.  
    22.  
    23. import java.io.BufferedReader;
    24.  
    25. import java.io.IOException;
    26.  
    27. import java.io.InputStreamReader;
    28.  
    29. import java.io.PrintStream;
    30.  
    31. import java.net.Socket;
    32.  
    33. //import com.klstudio.util.Logger;
    34.  
    35.  
    36.  
    37. /**
    38.  
    39. * @author kinglong
    40.  
    41. *
    42.  
    43. * TODO 要更改此生成的类型注释的模板,请转至窗口-首选项- Java -代码样式-代码模板
    44.  
    45. */
    46.  
    47. public class Client extends Thread {
    48.  
    49. private Socket clientSocket;
    50.  
    51. private String clientName;
    52.  
    53. private String clientIp;
    54.  
    55. private BufferedReader br;
    56.  
    57. private PrintStream ps;
    58.  
    59. //private Logger logger;
    60.  
    61. private ChatServer server;
    62.  
    63.  
    64.  
    65. public Client(Socket socket) {
    66.  
    67. //this.logger = new Logger(System.out);
    68.  
    69. this.clientSocket = socket;
    70.  
    71. try {
    72.  
    73. this.br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));
    74.  
    75. this.ps = new PrintStream(socket.getOutputStream(),true,"utf-8");
    76.  
    77. String info = this.br.readLine();
    78.  
    79.  
    80.  
    81. if(info!=null){
    82.  
    83. String[] info_arr = info.split(ChatServer.CommandDelimiters);
    84.  
    85. if(info_arr.length>1){
    86.  
    87. this.clientName = info_arr[1];
    88.  
    89. }
    90.  
    91. this.clientIp = socket.getRemoteSocketAddress().toString();
    92.  
    93. }else{
    94.  
    95. socket.close();
    96.  
    97. }
    98.  
    99. } catch (IOException e) {
    100.  
    101. // TODO 自动生成 catch 块
    102.  
    103. //this.logger.log("错误-" + e.toString());
    104.  
    105. }
    106.  
    107. }
    108.  
    109.  
    110.  
    111. /**
    112.  
    113. * @return 返回 ip。
    114.  
    115. */
    116.  
    117. public String getClientIp() {
    118.  
    119. return clientIp;
    120.  
    121. }
    122.  
    123. /**
    124.  
    125. * @return 返回 name。
    126.  
    127. */
    128.  
    129. public String getClientName() {
    130.  
    131. return clientName;
    132.  
    133. }
    134.  
    135.  
    136.  
    137. /**
    138.  
    139. * @return 返回 socket。
    140.  
    141. */
    142.  
    143. public Socket getClientSocket() {
    144.  
    145. return clientSocket;
    146.  
    147. }
    148.  
    149. public void send(StringBuffer msg){
    150.  
    151. this.ps.println(msg.toString()+"\0");
    152.  
    153. //this.ps.flush();
    154.  
    155. }
    156.  
    157. public void run() {
    158.  
    159. while (true) {
    160.  
    161. String line = null;
    162.  
    163. try {
    164.  
    165. line = this.br.readLine();
    166.  
    167. } catch (IOException e) {
    168.  
    169. // TODO 自动生成 catch 块
    170.  
    171. //this.logger.log("错误-" + e.toString());
    172.  
    173. ChatServer.disconnect(this);
    174.  
    175. ChatServer.notifyRoom();
    176.  
    177. return;
    178.  
    179. }
    180.  
    181. if (line == null) {
    182.  
    183. //this.logger.log("信息-[" + this.clientName + this.clientIp + "]用户离开!");
    184.  
    185. ChatServer.disconnect(this);
    186.  
    187. ChatServer.notifyRoom();
    188.  
    189. if(this.clientName != null){
    190.  
    191. ChatServer.sendClients(new StringBuffer("MSG"+ChatServer.CommandDelimiters+"系统信息>[" + this.clientName + "]用户离开!"));
    192.  
    193. }
    194.  
    195. return;
    196.  
    197. }
    198.  
    199. //this.logger.log("信息-"+line);
    200.  
    201. String[] cmd_arr = line.split(ChatServer.CommandDelimiters);
    202.  
    203. String keyword = cmd_arr[0];
    204.  
    205. keyword = keyword.substring(1);
    206.  
    207. if(keyword.equals("MSG")){
    208.  
    209. StringBuffer msg = new StringBuffer("MSG"+ChatServer.CommandDelimiters);
    210.  
    211. msg.append(this.clientName+">");
    212.  
    213. msg.append(cmd_arr[1]);
    214.  
    215. ChatServer.sendClients(msg,this.clientName,cmd_arr[2]);
    216.  
    217. }else if(keyword.equals("QUIT")){
    218.  
    219. //this.logger.log("信息-[" + this.clientName + this.clientIp + "]用户离开!");
    220.  
    221. ChatServer.disconnect(this);
    222.  
    223. ChatServer.notifyRoom();
    224.  
    225. ChatServer.sendClients(new StringBuffer("MSG"+ChatServer.CommandDelimiters+"系统信息>[" + this.clientName + "]用户离开!"));
    226.  
    227. this.stop();
    228.  
    229. return;
    230.  
    231. }
    232.  
    233. }
    234.  
    235. }
    236.  
    237. }

    //注意,服务端向客户端发送的信息,必需以”\0”,空字符结尾,否则客户端也无法接收到信息!

    相关日志

    1 条评论

    • order doxycycline 1楼

      I utilizedabated rozerum (you can what is the half-life of prilosec over the starvation melatonin and become about the controlar effect) and when nuclei were badly medieval took a hexamethyl of that plus a risperdal klonapin plus a unvaccinated seroquel.

      [回复此评论]

    留下评论