WEB开发网
开发学院图形图像Flash flash 聊天室 阅读

flash 聊天室

 2009-05-30 12:07:50 来源:WEB开发网   
核心提示: 以上是ServerSocket 与 AS 3 Socket 通信的基本原理,在实际应用中,flash 聊天室(4),会有多个客户端连接这个ServerSocket,因此要创建一个多线程的 Socket 服务器,当客户端有消息发来就读取,否则就一直等待 String msg = reade

以上是ServerSocket 与 AS 3 Socket 通信的基本原理。在实际应用中,会有多个客户端连接这个ServerSocket,因此要创建一个多线程的 Socket 服务器。

下面简述一下多线程 Socket 服务器原理:当socketServer.accept() 之后就需要实例化一个线程对象,在该对象中持有socketServer.accept() 返回的 Socket 对象,然后让线程跑起来执行读写操作。如果再来一个客户端就再跑一个线程,同样执行读写操作。同时,用一个 List 容器来管理这些对象。

最终服务器端的代码如下:

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class FlashScoket {
    private List<Client> clientList = new ArrayList<Client>();
  
    public static void main(String[] args) {
        new FlashScoket().runSocket();
    }
  
    private void runSocket() {
        try {
            ServerSocket socketServer = new ServerSocket(8888);
            System.out.println("服务器已启动,等待客户端连接");
          
            while (true) {
                // accept() 方法是阻塞式的,当有客户端连接成功后才继续执行
                Socket socket = socketServer.accept();
                System.out.println("客户端连接成功");
              
                // 实例化一个 Client 对象,并启动该线程
                Client client = new Client(socket);
                clientList.add(client);
                client.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  
    class Client extends Thread {
        private Socket socket;
      
        private BufferedReader reader;
        private DataOutputStream writer;
      
        private Client(Socket socket) {
            this.socket = socket;
            try {
         // 获得输入流和输出流,输入流为 BufferedReader 类型,输出流为 DataOutputStream 类型
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
                writer = new DataOutputStream(socket.getOutputStream());
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
      
        @Override
        public void run() {
            try {
                while (true) {
                    // readLine() 方法也是阻塞式的,当客户端有消息发来就读取,否则就一直等待
                    String msg = reader.readLine();
                  
                    // 当客户端发送的字符串为 null 时,说明客户端已经关闭,此时退出循环
                    if (msg == null) {
                        clientList.remove(this);
                        System.out.println("客户端已离开");
                        break;
                    }
                  
                    // 将读入的内容写给每个客户端
                    for (Iterator<Client> it = clientList.iterator(); it.hasNext();) {
                        Client client = it.next();
                        client.getWriter().writeUTF(msg);
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 关闭 socket 及相关资源
                try {
                    if (reader != null) {
                        reader.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (writer != null) {
                            writer.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            if (socket != null) {
                                socket.close();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }

        public DataOutputStream getWriter() {
            return writer;
        }
    }
}

上一页  1 2 3 4 5  下一页

Tags:flash 聊天室

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接