▼ActionScript 3.0メモ▼
ソケットの使用


Flashでチャットクライアントを作成する。Java版チャットサーバとJava版チャットクライアントも作成する。
SocketEx


参考リンク

ソースコード
SocketEx.as
package {
    import flash.display.*;
    import flash.events.*;
    import flash.net.*;
    import flash.ui.*;
    import flash.utils.*;
    import flash.text.*

    //ソケットを使用する
    public class SocketEx extends Sprite {
        private var socket:Socket;   //ソケット
        private var tfView:TextField;//表示テキストフィールド
        private var tfSend:TextField;//送信テキストフィールド
        
        //コンストラクタ
        public function SocketEx() {
            //テキストフィールドの生成
            tfView=addTextField(10,10,220,160);
            tfSend=addTextField(10,180,220,20);
            
            //ソケットの生成
            socket=new Socket("localhost",16000);

            //???X?iリスナーの追加
            socket.addEventListener(Event.CONNECT,connectHandler);
            socket.addEventListener(Event.CLOSE, closeHandler);
            socket.addEventListener(ProgressEvent.SOCKET_DATA,socketDataHandler);
            socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
            socket.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
            tfSend.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler);
        }

        //キーダウンイベントの処理
        private function keyDownHandler(evt:KeyboardEvent):void {
            if (!socket.connected) return;
            if (evt.keyCode==Keyboard.ENTER) {
                socket.writeUTFBytes(tfSend.text);
                socket.flush();
                tfSend.text="";
            }
        }

        //接続イベントの処理
        private function connectHandler(evt:Event):void {
            trace("接続");
        }
    
        //??切断イベントの処理
        private function closeHandler(evt:Event):void {
            trace("切断");
        }
    
        //読み込み中イベントの処理?f?
        private function socketDataHandler(evt:ProgressEvent):void {
            var text:String=socket.readUTFBytes(socket.bytesAvailable);
            tfView.text=text+"\n"+tfView.text;
        }
    
        //セキュリティエラーイベントの処理?Z?L?????e?B?G???
        private function securityErrorHandler(evt:SecurityErrorEvent):void {
            trace("セキュリティエラー");
        }
    
        //IOエラーイベントの処理
        private function ioErrorHandler(evt:IOErrorEvent):void {
            trace("IOエラー");
        }

        //テキストフィールドの追加
        private function addTextField(x:int,y:int,w:uint,h:uint):TextField {
            var textField:TextField=new TextField();
            addChild(textField);
            textField.x=x;
            textField.y=y;
            textField.width=w;
            textField.height=h;
            textField.text="";
            textField.selectable=true;
            textField.border=true;
            textField.type=TextFieldType.INPUT;
            return textField;
        }
    }
}


Java版のチャットサーバ

ChatServer.java
import java.io.*;
import java.net.*;
import java.util.*;

//チャットサーバ
public class ChatServer {

    //開始
    public void start(int port) {
        ServerSocket     server;//サーバソケット
        Socket           socket;//ソケット
        ChatServerThread thread;//スレッド

        try {
            server=new ServerSocket(port);
            System.err.println("チャットサーバ実行開始");
            while(true) {
                try {
                    //接続待機
                    socket=server.accept();
                    
                    //チャットサーバスレッド開始
                    thread=new ChatServerThread(socket);
                    thread.start();
                } catch (IOException e) {
                }
            }
        } catch (IOException e) {
            System.err.println(e);
        }
    }

    //メイン
    public static void main(String[] args) {
        ChatServer server=new ChatServer();
        server.start(16000);
    }
}

ChatServerThread.java
import java.io.*;
import java.net.*;
import java.util.*;

//チャットサーバスレッド
public class ChatServerThread extends Thread { 
    private static List<ChatServerThread> threads=
        new ArrayList<ChatServerThread>();//スレッド郡
    private Socket socket;//ソケット

    // コンストラクタ
    public ChatServerThread(Socket socket) {
        super();
        this.socket=socket;
        threads.add(this);
    }

    //処理
    public void run() {
        InputStream in =null;
        String message;
        int size;
        byte[] w=new byte[10240];
        try {
            //ストリーム
            in =socket.getInputStream();
            while(true) {
                try {
                    //受信待ち
                    size=in.read(w);

                    //切断
                    if (size<=0) throw new IOException();

                    //読み込み
                    message=new String(w,0,size,"UTF8");
                    
                    //全員にメッセージ送信
                    sendMessageAll(message);
                } catch (IOException e) {
                    socket.close();
                    threads.remove(this);
                    return;
                }
            }
        } catch (IOException e) {
            System.err.println(e);
        }
    }

    //全員にメッセージ送信
    public void sendMessageAll(String message) {
        ChatServerThread thread;
        for (int i=0;i<threads.size();i++) {
            thread=(ChatServerThread)threads.get(i);
            if (thread.isAlive()) thread.sendMessage(this,message);
        }
        System.out.println(message);
    }

    //メッセージ送信
    public void sendMessage(ChatServerThread talker,String message){
        try {
            OutputStream out=socket.getOutputStream();
            byte[] w=message.getBytes("UTF8");
            out.write(w);
            out.flush();
        } catch (IOException e) {
        }
    }
}


Java版のチャットクライアント

ChatClient.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

//チャットクライアント
class ChatClient extends JFrame implements ActionListener {
    //変数
    private JTextArea    edtView;//表示テキストフィールド
    private JTextField   edtSend;//送信テキストフィールド
    private Socket       socket; //ソケット
    private InputStream  in;     //入力ストリーム
    private OutputStream out;    //出力ストリーム
    
    //コンストラクタ
    public ChatClient() {
        //画面
        setSize(300,300);
        Container pane=getContentPane();
        pane.setLayout(new FlowLayout());

        //メッセージテキストフィールド
        edtView=new JTextArea("",10,25);
        edtView.setEditable(false);
        pane.add(new JScrollPane(edtView,
            ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER));

        //送信テキストフィールド
        edtSend=new JTextField("", 25);
        pane.add(edtSend);
        edtSend.addActionListener(this);
    }

    //アクションイベントの処理
    public void actionPerformed(ActionEvent ae) {
        try {
            if (socket!=null && socket.isConnected()) {
                out.write(edtSend.getText().getBytes("UTF8"));
                out.flush();
                edtSend.setText("");
            }
        } catch (Exception e) {
        }
    }

    //接続
    public void connect(String host,int port) {
        String text;
        int size;
        byte[] w=new byte[10240];
        try {
            //接続
            InetAddress addr=InetAddress.getByName(host);
            socket=new Socket(addr,port);
            in =socket.getInputStream();
            out=socket.getOutputStream();

            //受信ループ
            while (socket!=null && socket.isConnected()) {
                size=in.read(w);
                if (size<=0) continue;
                text=new String(w,0,size,"UTF8");
                edtView.append(text + "\n");
                System.out.println(text);
            }
        } catch (UnknownHostException e) {
            System.err.println(e);
        } catch (IOException e) {
            System.err.println(e);
        }
    }
    
    //表示
    public void append_edtView(String mess) {
        edtView.append(mess);
        edtView.setCaretPosition(edtView.getText().length());
    }

    //メイン
    public static void main(String[] args) {
        ChatClient client=new ChatClient();
        client.setVisible(true);
        client.connect("localhost",16000);
    }
}



−戻る−