java與as3的socket通訊

  • 2020 年 1 月 10 日
  • 筆記

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(); } } }