2 Java多线程服务器
基本的通信做到以后就是修改代码增加功能了,这里我们必须让Java能支持多个线程的连接,这才是服务器呀。
import java.io.*; import java.net.*; public class Server extends ServerSocket{ //服务端口号常量(as要求必须大于1024,小于65535) private static final int SERVER_PORT = 10086; //构造函数 public Server() throws IOException{ super(SERVER_PORT); //监听新连接,为每个连接分配一个线程,将新的连接传入独立线程 Socket socket = accept(); new SocketThread(socket); } //入口函数... public static void main (String[] args) throws IOException{ new Server(); } //建一个类,该类属于独立的线程,他的每个实例都会在独立的线程里运行 class SocketThread extends Thread{ //申明流的空间在独立线程里了,因为他属于传送时所需,主线程只是监听有没有新连接 private Socket client; private BufferedReader in; private PrintWriter out; private String src; //构造函数 public SocketThread(Socket socket) throws IOException{ //初始客户端的连接为该线程传入的连接 client = socket; //初始流在进来后读取前,和写入后发送前所存放的空间 in = new BufferedReader(new InputStreamReader(client.getInputStream())); out = new PrintWriter(client.getOutputStream(),true); //准备工作完毕,启动该线程 start(); } public void run(){try { //循环等待读取信息 while(true){ //读取行信息,注意是以换行符结束的 src = in.readLine(); //如果发送"close",就跳出循环(断开连接) if(src.equals("close")){ break; } //在收到的信息前加是标识并发回(注意结尾加"\0",这是as的XMLSocket读入每条信息的条件.as3的Socket不需要) out.println("rev: "+src+"\0"); //以上out.println("xx")相当于out.write("xx");out.flush();的执行效果 System.out.println("msg is "+src) } //关闭连接 close(); }catch(IOException e){ }catch(NullPointerException e){ System.out.println("client closed"); }} } }
修改后的Java主线程监听是否有新的连接,如果有就把这个连接分配到新的线程,让他去监听消息,而自己继续监听连接,这样的思路是不是很清晰呢? 仔细看看其实不是很难,大部分的代码都和前面的一样,只是循环监听信息的代码被放到的独立的线程里面。 关于多线程和一些Java的技术问题,为了对大家负责,我依然谨慎言语,以免误导大家。 现在你可以启动多个as对Java进行连接,并且他们之间互不干扰。一个线程对应一个连接,底层的工作非常透明,管理非常容易。
出处:蓝色理想
责任编辑:bluehearts
上一页 Flash P2P 通信技巧(AS-Java-AS) [3] 下一页 Flash P2P 通信技巧(AS-Java-AS) [5]
◎进入论坛RIA设计与应用版块参加讨论
|