Flash Socket 程式設計 2
Flash Socket程式設計(1)
現在來寫一個flash 客戶端,這裡要解決的問題包括,
如何連線伺服器,
如何監聽伺服器的內容,
如何傳送資訊伺服器,
現在發一段簡單的程式碼,這個程式碼很簡單,功能不完整,為的是能夠清晰一點讓我們學習flash socket程式設計。
[c-sharp] view plain copy print?- package
- {
- import flash.net.Socket;
- import flash.events.*;
- import flash.display.Sprite;
- import flash.errors.*;
- import flash.display.SimpleButton;
- publicclass 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 字串寫入套接字。 |
- package com;
- import java.net.*;
- import java.io.*;
- publicclass Server implements Runnable {
- publicvoid 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();
- }
- }
- publicstaticvoid main(String[] args) {
- new Thread(new Server()).start();
- }
- }