首页 > AIR/RIA > Flex+Socket+Java聊天室模型(练习作品)

Flex+Socket+Java聊天室模型(练习作品)

闲来无事,做个基于Java Socket套接字通讯的Flex聊天室,代码也简单,就两份代码:SocketServer.java 和 FlexConnectSocket.mxml

先看看Java的部分:

package com.hyj.socket;

import java.net.*;
import java.util.Vector;
import java.io.*;

public class SocketServer {
 private BufferedReader reader;
 private PrintWriter writer;
 private ServerSocket server;
 private Vector socketManager = new Vector();

 public SocketServer() {
 }

 void startServer() {
  try {
   server = new ServerSocket(886);
   System.out.println(“Socket Server Created!”);
   while (true) {
    System.out.println(“待命中……”);
    Socket socket = server.accept();
    new Socket_Thread(socket).start();
    socketManager.add(socket);
    System.out.println(“當前共有” + socketManager.size() + “個客戶端鏈接進來了”);
    for (int i = 0; i < socketManager.size(); i++) {
     Socket sock = (Socket) socketManager.get(i);
     writer = new PrintWriter(sock.getOutputStream(), true);
     writer.println(“NO當前共有” + socketManager.size()
       + “個客戶端鏈接進來了”);
     writer.flush();
    }
   }
  } catch (Exception e) {
   System.out.println(e);
  } finally {
   try {
    if (server != null)
     server.close();
    System.out.println(“服務關閉!”);
   } catch (IOException ie) {
   }
  }
 }

 class Socket_Thread extends Thread {
  Socket socket;
  private BufferedReader reader;

  Socket_Thread(Socket socket) {
   this.socket = socket;
  }

  public void run() {
   try {
    reader = new BufferedReader(new InputStreamReader(socket
      .getInputStream(), “UTF-8″));

    String msg;
    while ((msg = reader.readLine()) != null) {
     for (int i = 0; i < socketManager.size(); i++) {
      Socket sock = (Socket) socketManager.get(i);
      writer = new PrintWriter(sock.getOutputStream(), true);
      writer.println(msg);
      writer.flush();
      System.out.println(“接收到的信息為:” + msg);
     }
    }
   } catch (Exception e) {
    e.printStackTrace();
   } finally {
    socketManager.remove(socket);
    try {
     if (reader != null) {
      reader.close();
     }
     if (socket != null) {
      socket.close();
     }
     reader = null;
     socket = null;
     System.out.println(“客戶機離開了!還剩下” + socketManager.size()
       + “人”);

    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }

 public static void main(String[] args) {
  SocketServer server = new SocketServer();
  server.startServer();
 }
}

内容也比较简单,随便看看就会了吧,接下来是Flex客户端的代码,关键只有三个地方:
socket.addEventListener(Event.CONNECT,connectedHandler);
socket.addEventListener(Event.CLOSE,closeHandler);
socket.addEventListener(ProgressEvent.SOCKET_DATA,getSocketDataHandler);
代码如下:

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”
http://www.adobe.com/2006/mxml
    layout=”absolute”
    horizontalCenter=”0″
    creationComplete=”initApp()”
    horizontalAlign=”center”
    width=”516″
    height=”516″>

 <mx:Style>
  Application{
   font-family:”MS YaHei”;
   background-color:#FFFFFF;
   theme-color:#FFFFFF;
   padding-left:5;
   padding-top:5;
  }
  Panel{
   header-style-name:”fontStyle”;
  }
  .fontStyle{
   font-size:14;
   font-family:”MS YaHei”;
  }
  Alert{
   font-family:”MS YaHei”;
   font-size:12;
   color:#000000;
   theme-color:#FFFFFF;
   background-color:#FFFFFF;
   background-alpha:0.6;
  }
 </mx:Style>
 <mx:Script>
  <![CDATA[
   import mx.controls.Alert;
   import flash.utils.setTimeout;
   internal var socket:Socket=new Socket;

   private function initApp():void
   {
    currentState="GetName";

   }

   private function getSocketDataHandler(evt:ProgressEvent):void
   {
    while (socket.bytesAvailable)
    {
     var msg:String=socket.readMultiByte(socket.bytesAvailable, "utf8");
     //var msg:String = socket.readUTF();

     if (msg.substring(0, 2) == "NO")
     {
      userSize.text=msg.substring(2, msg.length - 1);
     }
     else
     {
      socket_txt.text+=msg;
      socket_txt.verticalScrollPosition=socket_txt.maxVerticalScrollPosition;
     }

    }
   }

   private function connectedHandler(evt:Event):void
   {
    Chat.title="鏈接服務器成功!";
   }

   private function closeHandler(evt:Event):void
   {

    Chat.title="鏈接已經關閉!";

   }

   public function sendMessage(msg:String):void
   {
    if (message_txt.text == "")
    {
     Alert.show("不能發送空信息,謝謝!");
    }
    else
    {

     if (socket.connected)
     {
      var message:ByteArray=new ByteArray();
      message.writeUTFBytes(msg + "\r\n"); //避免亂碼
      socket.writeBytes(message); //寫入socket緩沖區
      socket.flush(); //發送信息
      //socket_txt.text += msg+"\r\n";
      message_txt.text="";
     }
    }
   }

   private function login()
   {
    currentState='';
    socket.connect("10.129.90.27", 886);
    socket.addEventListener(Event.CONNECT, connectedHandler);
    socket.addEventListener(Event.CLOSE, closeHandler);
    socket.addEventListener(ProgressEvent.SOCKET_DATA, getSocketDataHandler);
   }
  ]]>
 </mx:Script>
 <mx:states>
  <mx:State name=”GetName”>
   <mx:RemoveChild target=”{Chat}”/>
   <mx:AddChild position=”lastChild”>
    <mx:Panel id=”reg”
        x=”1″
        y=”5″
        height=”448″
        width=”502″
        layout=”absolute”>
     <mx:TextInput id=”user”
          fontSize=”12″
          x=”161″
          y=”116″/>
     <mx:Button enabled=”{user.text==”?false:true}”
          fontSize=”12″
          x=”329″
          y=”116″
          label=”Button”
          click=”login()”/>
     <mx:Label fontSize=”12″
         x=”112″
         y=”118″
         text=”姓名:”/>
    </mx:Panel>
   </mx:AddChild>
  </mx:State>
 </mx:states>
 <mx:transitions>
  <mx:Transition fromState=”*”
        toState=”*”>
   <mx:Parallel>
    <mx:Iris target=”{Chat}”
       duration=”1200″/>
    <mx:Iris target=”{reg}”
       duration=”1200″/>
   </mx:Parallel>
  </mx:Transition>
 </mx:transitions>
 <mx:Panel fontSize=”12″
     layout=”absolute”
     id=”Chat”
     x=”1″
     y=”5″
     height=”501″
     width=”502″>
  <mx:TextArea id=”socket_txt”
      x=”34″
      y=”10″
      width=”400″
      height=”343″
      fontSize=”12″/>
  <mx:TextInput id=”message_txt”
       enter=”sendMessage(user.text+’:'+message_txt.text)”
       x=”105″
       y=”361″
       width=”259″
       fontSize=”12″/>
  <mx:Button click=”sendMessage(user.text+’:'+message_txt.text)”
       x=”372″
       y=”361″
       label=”Send”
       id=”button1″
       fontSize=”12″/>
  <mx:Label x=”34″
      y=”363″
      id=”userLabel”
      text=”{user.text+’:'}”/>
  <mx:Label x=”34″
      y=”392″
      id=”userSize”
      width=”400″/>
 </mx:Panel>
</mx:Application>

这只是一个模型,后续扩展基于这两个就可以了!~

欢迎转载,转载请注明来源和作者,谢谢!

评论暂缺

  • (Required)
  • (Required, will not be published)

Verify Code   If you cannot see the CheckCode image,please refresh the page again!