1. 程式人生 > >Flash Socket 程式設計 2

Flash Socket 程式設計 2

               

Flash Socket程式設計(1)

現在來寫一個flash 客戶端,這裡要解決的問題包括,

如何連線伺服器,

如何監聽伺服器的內容,

如何傳送資訊伺服器,

現在發一段簡單的程式碼,這個程式碼很簡單,功能不完整,為的是能夠清晰一點讓我們學習flash socket程式設計。

[c-sharp] view plain copy print?
  1. package   
  2. {  
  3.     import flash.net.Socket;  
  4.     import flash.events.*;  
  5.     import flash.display.Sprite;  
  6.     import flash.errors.*;  
  7.     import flash.display.SimpleButton;  
  8.     publicclass Client extends Sprite  
  9.     {  
  10.         private var mysocket:Socket;  
  11.         private var host:String="localhost";  
  12.         private var port:int=8001;  
  13.         public function Client()  
  14.         {  
  15.             btn.addEventListener(MouseEvent.CLICK,SendData);  
  16.             mysocket=new Socket();  
  17.             mysocket.addEventListener(Event.CONNECT,OnConnect);  
  18.             mysocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);  
  19.             mysocket.addEventListener(ProgressEvent.SOCKET_DATA , receivedata);  
  20.             //mysocket.addEventListener(SecurityError
  21.             mysocket.connect(host,port);  
  22.         }  
  23.         private function OnConnect(e:Event):void
  24.         {  
  25.             trace("連線成功");  
  26.             mysocket.writeUTFBytes("Test successful2/n");  
  27.             mysocket.flush();//傳送資料
  28.         }  
  29.         private function ioErrorHandler(e:IOErrorEvent):void
  30.         {  
  31.             trace("連線失敗");  
  32.         }  
  33.         private function receivedata(e:ProgressEvent):void
  34.         {  
  35.             trace("收到的位元組數"+mysocket.bytesAvailable);  
  36.             var msg:String;  
  37.             while (mysocket.bytesAvailable)  
  38.             {  
  39.                 msg+=mysocket.readMultiByte(mysocket.bytesAvailable,"utf8");  
  40.                 trace(msg);  
  41.             }  
  42.         }  
  43.         private function SendData(e:MouseEvent):void
  44.         {  
  45.             trace("傳送");  
  46.             mysocket.writeUTFBytes("i am flash/n");  
  47.             mysocket.flush();//傳送資料
  48.         }  
  49.     }  
  50. }  
package { import flash.net.Socket; import flash.events.*; import flash.display.Sprite; import flash.errors.*; import flash.display.SimpleButton; public class Client extends Sprite {  private var mysocket:Socket;  private var host:String="localhost";  private var port:int=8001;  public function Client()  {   btn.addEventListener(MouseEvent.CLICK,SendData);   mysocket=new Socket();   mysocket.addEventListener(Event.CONNECT,OnConnect);   mysocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);   mysocket.addEventListener(ProgressEvent.SOCKET_DATA , receivedata);   //mysocket.addEventListener(SecurityError   mysocket.connect(host,port);  }  private function OnConnect(e:Event):void  {   trace("連線成功");   mysocket.writeUTFBytes("Test successful2/n");   mysocket.flush();//傳送資料  }  private function ioErrorHandler(e:IOErrorEvent):void  {   trace("連線失敗");  }  private function receivedata(e:ProgressEvent):void  {   trace("收到的位元組數"+mysocket.bytesAvailable);   var msg:String;   while (mysocket.bytesAvailable)   {    msg+=mysocket.readMultiByte(mysocket.bytesAvailable,"utf8");    trace(msg);   }  }  private function SendData(e:MouseEvent):void  {   trace("傳送");   mysocket.writeUTFBytes("i am flash/n");   mysocket.flush();//傳送資料  } }}

我們首先解決第一個問題:(其實在cookbook那裡已經有說的)這裡簡單演示一下

一.連線伺服器:

mysocket=new Socket();mysocket.addEventListener(Event.CONNECT,OnConnect);

mysocket.connect(host,port);

host :是連線的ip端,這裡連線本地所以使用localhost 或者127.0.0.1 就ok

port:埠號只有大於1024的時候基本上可以順利,小於1024還要進行一些配置

監聽連線是否成功:

private function OnConnect(e:Event):void  {   trace("連線成功");   mysocket.writeUTFBytes("Test successful2/n");   mysocket.flush();//傳送資料

  }

連線成功後,我們可以傳送一個簡單資訊給伺服器:

mysocket.writeUTFBytes("Test successful2/n");mysocket.flush();//傳送資料

注意,有個/n沒有這個回車符,看看會有一些什麼發生呢。

使用writeUTFBytes 是不可能立刻傳送資料給伺服器的,還要使用flush方法才能傳送給伺服器。

二.處理錯誤:

mysocket.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);

private function ioErrorHandler(e:IOErrorEvent):void  {   trace("連線失敗");  }

三.接收伺服器返回的資訊

mysocket.addEventListener(ProgressEvent.SOCKET_DATA , receivedata);

private function receivedata(e:ProgressEvent):void  {   trace("收到的位元組數"+mysocket.bytesAvailable);   var msg:String;   while (mysocket.bytesAvailable)   {    msg+=mysocket.readMultiByte(mysocket.bytesAvailable,"utf8");    trace(msg);   }  }

這樣我們可以接收到伺服器傳送來的資訊,但是存在一個問題,接收資料會存在一個回車符合的問題,需要我們去解決。這裡暫時不多說

看上面的

參考:

[read-only] 輸入緩衝區中可讀取的資料的位元組數。使用指定的字符集,從該位元組流讀取一個多位元組字串。四,傳送資訊給伺服器 問題:我們希望傳送資訊給伺服器解決:使用writeUTFBytes 方法private function SendData(e:MouseEvent):void  {   trace("傳送");   mysocket.writeUTFBytes("i am flash/n");   mysocket.flush();//傳送資料  }在場景上放一個按鈕上去,通過點選按鈕事件,傳送資訊給伺服器socket埠。參考:
將一個 UTF-8 字串寫入套接字。
五:伺服器程式這裡寫一個簡單伺服器程式,使用一個簡單的執行緒,不過執行緒並不完善,有缺點,但不影響程式演示:[c-sharp] view plain copy print?
  1. package com;  
  2. import java.net.*;  
  3. import java.io.*;  
  4. publicclass Server implements Runnable {  
  5.     publicvoid run()  
  6.     {  
  7.          PrintWriter os=null;  
  8.             try{  
  9.             ServerSocket ss=new ServerSocket(8001);  
  10.             System.out.println("等待連線....");  
  11.             Socket sk=ss.accept();  
  12.             System.out.println("連線成功....");  
  13.             BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream(),"utf-8"));   
  14.             System.out.println("獲取裡面的內容......");   
  15.             //等待接受資訊 
  16.             os = new PrintWriter(sk.getOutputStream());   
  17.             String word=null ;  
  18.           //傳送資訊 
  19.           while((word=br.readLine())!=null)  
  20.           {      
  21.            System.out.println("內容:" + word);  
  22.            os.println("你好我是伺服器");   
  23.            os.flush();   
  24.           }  
  25.         }  
  26.             catch(IOException ex)  
  27.             {  
  28.                 ex.printStackTrace();  
  29.             }  
  30.     }  
  31.     publicstaticvoid main(String[] args) {  
  32.       new Thread(new Server()).start();  
  33.     }  
  34. }  
package com;import java.net.*;import java.io.*;public class Server implements Runnable {     public void run() {   PrintWriter os=null;   try{   ServerSocket ss=new ServerSocket(8001);   System.out.println("等待連線....");   Socket sk=ss.accept();   System.out.println("連線成功....");   BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream(),"utf-8"));       System.out.println("獲取裡面的內容......");       //等待接受資訊          os = new PrintWriter(sk.getOutputStream());       String word=null ;    //傳送資訊     while((word=br.readLine())!=null)    {           System.out.println("內容:" + word);     os.println("你好我是伺服器");      os.flush();     }  }   catch(IOException ex)   {    ex.printStackTrace();       }   }  public static void main(String[] args) {   new Thread(new Server()).start(); }}接收結果:等待連線....連線成功....獲取裡面的內容......內容:Test successful2內容:i am flash內容:i am flash內容:i am flash內容:i am flash內容:i am flash為了讓程式更加完善,我們可以將程式修改得更加完善客戶端傳送的內容:連線成功收到的位元組數16null你好我是伺服器注意:出現null這個結果,也許在服務出現一些小毛筆,但基本傳送資料的和接收資料都成功了程式需要完善的地方:包括客戶端和伺服器 處理回車符合問題最後發現原來在var msg:String="";寫上這樣null 就不會出現了