▼ActionScript 3.0メモ▼
ソケットの使用
Flashでチャットクライアントを作成する。Java版チャットサーバとJava版チャットクライアントも作成する。
参考リンク
ソースコード
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); } }