2 Java多線程服務(wù)器
基本的通信做到以后就是修改代碼增加功能了,這里我們必須讓Java能支持多個線程的連接,這才是服務(wù)器呀。
import java.io.*; import java.net.*; public class Server extends ServerSocket{ //服務(wù)端口號常量(as要求必須大于1024,小于65535) private static final int SERVER_PORT = 10086; //構(gòu)造函數(shù) public Server() throws IOException{ super(SERVER_PORT); //監(jiān)聽新連接,為每個連接分配一個線程,將新的連接傳入獨立線程 Socket socket = accept(); new SocketThread(socket); } //入口函數(shù)... public static void main (String[] args) throws IOException{ new Server(); } //建一個類,該類屬于獨立的線程,他的每個實例都會在獨立的線程里運行 class SocketThread extends Thread{ //申明流的空間在獨立線程里了,因為他屬于傳送時所需,主線程只是監(jiān)聽有沒有新連接 private Socket client; private BufferedReader in; private PrintWriter out; private String src; //構(gòu)造函數(shù) public SocketThread(Socket socket) throws IOException{ //初始客戶端的連接為該線程傳入的連接 client = socket; //初始流在進來后讀取前,和寫入后發(fā)送前所存放的空間 in = new BufferedReader(new InputStreamReader(client.getInputStream())); out = new PrintWriter(client.getOutputStream(),true); //準(zhǔn)備工作完畢,啟動該線程 start(); } public void run(){try { //循環(huán)等待讀取信息 while(true){ //讀取行信息,注意是以換行符結(jié)束的 src = in.readLine(); //如果發(fā)送"close",就跳出循環(huán)(斷開連接) if(src.equals("close")){ break; } //在收到的信息前加是標(biāo)識并發(fā)回(注意結(jié)尾加"\0",這是as的XMLSocket讀入每條信息的條件.as3的Socket不需要) out.println("rev: "+src+"\0"); //以上out.println("xx")相當(dāng)于out.write("xx");out.flush();的執(zhí)行效果 System.out.println("msg is "+src) } //關(guān)閉連接 close(); }catch(IOException e){ }catch(NullPointerException e){ System.out.println("client closed"); }} } }
修改后的Java主線程監(jiān)聽是否有新的連接,如果有就把這個連接分配到新的線程,讓他去監(jiān)聽消息,而自己繼續(xù)監(jiān)聽連接,這樣的思路是不是很清晰呢? 仔細(xì)看看其實不是很難,大部分的代碼都和前面的一樣,只是循環(huán)監(jiān)聽信息的代碼被放到的獨立的線程里面。 關(guān)于多線程和一些Java的技術(shù)問題,為了對大家負(fù)責(zé),我依然謹(jǐn)慎言語,以免誤導(dǎo)大家。 現(xiàn)在你可以啟動多個as對Java進行連接,并且他們之間互不干擾。一個線程對應(yīng)一個連接,底層的工作非常透明,管理非常容易。
出處:藍色理想
責(zé)任編輯:bluehearts
上一頁 Flash P2P 通信技巧(AS-Java-AS) [3] 下一頁 Flash P2P 通信技巧(AS-Java-AS) [5]
◎進入論壇RIA設(shè)計與應(yīng)用版塊參加討論
|