转载的,java与AS3实现的聊天室

来源:互联网 发布:内存卡恢复数据软件 编辑:程序博客网 时间:2024/05/19 05:32

java:

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


AS3:

      var userName:String = "FL 车在臣";
var out_txt:String = new String();
// ************ 组件参数初始化 ************
submit_btn.label = "发送消息";
output_txt.editable = false;

// 设置各组件中字体的大小
input_txt.setStyle("textFormat", new TextFormat(null, 15));
output_txt.setStyle("textFormat", new TextFormat(null, 15));
submit_btn.setStyle("textFormat", new TextFormat(null, 15, null, true));

// 当按下回车或点击 submit_btn 按钮后调用事件处理函数
submit_btn.addEventListener(MouseEvent.CLICK, sendMessage);
addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);

// 事件处理函数
function onKeyDown(evt:KeyboardEvent):void {
    if (evt.keyCode == Keyboard.ENTER) {
        sendMessage(null);
    }
}

function sendMessage(evt:Event):void {
    if (input_txt.text == "") {
        return;
    }
    
    var bytes:ByteArray = new ByteArray();
    bytes.writeUTFBytes("<font color='#0000FF'>" + userName + " : </font>" + input_txt.text + "\n");
    socket.writeBytes(bytes);
    socket.flush();
    
    // 清空 input_txt,并设置焦点到 input_txt
    input_txt.text = "";
    stage.focus = input_txt;
}

// ************ 客户端 Socket ************
var socket:Socket = new Socket();
socket.connect("127.0.0.1", 8888);

// 当客户端 socket 收到数据后调用 readMessage() 函数
socket.addEventListener(ProgressEvent.SOCKET_DATA, readMessage);
socket.addEventListener(IOErrorEvent.IO_ERROR, socketIOError);

function readMessage(evt:ProgressEvent):void {
    out_txt += socket.readUTF() + "\n";
    output_txt.htmlText = out_txt;
    output_txt.verticalScrollBar.scrollPosition = output_txt.verticalScrollBar.maxScrollPosition;
}

function socketIOError(evt:IOErrorEvent):void {
    out_txt += "服务器端尚未开启,请稍后再试\n";
    output_txt.htmlText = out_txt;
}

0 0
原创粉丝点击