java與as3的socket通信

as3 與java 都提供了Socket類用於網絡通信, 但兩者的使用也有較大的不同. 爲了方便兩者的通信, 我在做了一些實驗的基礎上, 寫下獲得的經驗,以免忘記.

as3 的socket 讀寫數據方法常用的有四個: readUTF, writeUTF, readUTFBytes, writeUTFBytesjava 的socket 輸入輸出流常用BufferedReader 和 DataOutputStream 包裝, 以提高讀寫效率
如:
    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(),     "UTF-8"));
    DataOutputStream writer = new DataOutputStream(socket.getOutputStream());

as3 方寫數據時用writeUTFBytes 方法, 此時java 方讀數據用reader.readLine() 阻塞式方法.
as3 方寫數據時用writeUTF方法, 此時java 方應改用DataInputStream 類包裝輸入流, 因爲BufferedReader 不提供讀取UTF數據的方法.
java 方寫數據時用writeUTF方法此時as3 方讀數據用readUTF方法, 但此種模式有個弊端, 就是如果java方連續調用了n(n >= 2)次writeUTF方法,而as3方因來不及讀取, 則最後只是第一次寫入的數據被讀取.
java 方寫數據時用writeBytes, 此時as3 方讀數據用readUTFBytes方法讀取數據, 可以這樣讀取: msg = socket.readUTFBytes(socket.bytesAvailable).

一個簡單的例子:
// as3 寫的客戶端

package test
{
   
   
    import flash.display.MovieClip;
    import flash.net.Socket;
    import flash.events.ProgressEvent;
    import flash.events.IOErrorEvent;
   
    public class  TestSocket extends MovieClip
    {
        private var socket:Socket;
        private var msg:String;
       
        public function TestSocket() {
            init();
        }
       
        private function init() {
            socket = new Socket("localhost", 60000);
            socket.addEventListener(ProgressEvent.SOCKET_DATA, readMsg);
            socket.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
        }
       
        private function readMsg(e:ProgressEvent{
            msg = socket.readUTF();
            trace("message:" + msg);
        }
       
        private function errorHandler(e:IOErrorEvent{
            trace(e.toString);
        }
    }
   
}


//java 寫的服務器端

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;


public class TestSocket {
   
    private ServerSocket socketServer;
    private Socket client;
    private DataOutputStream writer;
    private BufferedReader reader;
   
    public static void main(String[] args{
        int socketPort = 60000;
        TestSocket test1 = new TestSocket(socketPort);
    }
   
    public TestSocket(int socketPort{
        try {
            socketServer = new ServerSocket(socketPort);
            System.out.println("server is setted up");
            while (true{
                client = socketServer.accept();
               
                //wrap input and output stream
                writer = new DataOutputStream(client.getOutputStream());
                reader = new BufferedReader(newInputStreamReader(client.getInputStream()));
               
                //send message to client
                writer.writeUTF("hello client");
               
            }
        } catch (IOException e{
            e.printStackTrace();
        }
    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章