//インポート領域---------------------------------------------------------------- import javax.swing.*; import java.awt.*; import javax.swing.border.*; import java.awt.event.*; import java.net.*; import java.io.*; //----------------------------------------------------------------------------- public class CC extends JFrame implements Runnable, ActionListener{ public static void main(String[] args){ CC frame = new CC(); frame.setVisible(true); frame.setResizable(false); } private Thread thread; private Socket socket; private String roomName; private JTextArea msgTextArea; private JTextField msgTextField; private JTextField Name; private JTextField ip; private JTextField port; private JButton submitButton; private JButton howtouse; private JButton enterButton; private JButton exitButton; CC(){//-------コンストラクタの定義----------------------- setBounds(100,100,506,580); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ try{close();} catch(Exception err){} } }); //パネルエリア---------------------------------------------------------- JPanel toppanel =new JPanel(); BevelBorder border0 = new BevelBorder(BevelBorder.RAISED); toppanel.setPreferredSize(new Dimension(500,35)); toppanel.setBorder(border0); toppanel.setBackground(Color.DARK_GRAY); JPanel leftpanel = new JPanel(); BevelBorder border1 = new BevelBorder(BevelBorder.RAISED); leftpanel.setPreferredSize(new Dimension(250,300)); leftpanel.setBorder(border1); leftpanel.setBackground(Color.GREEN); JPanel rightpanel = new JPanel(); BevelBorder border2 = new BevelBorder(BevelBorder.RAISED); rightpanel.setPreferredSize(new Dimension(250,200)); rightpanel.setBorder(border2); rightpanel.setBackground(Color.BLUE); JPanel buttompanel = new JPanel(); BevelBorder border3 = new BevelBorder(BevelBorder.RAISED); buttompanel.setPreferredSize(new Dimension(500,45)); buttompanel.setBorder(border3); buttompanel.setBackground(Color.DARK_GRAY); //ラベルエリア(パネル1)----------------------------------------------- JLabel label1 = new JLabel(" Chat Client "); label1.setFont(new Font("Century",Font.BOLD,20)); label1.setPreferredSize(new Dimension(250,30)); label1.setHorizontalAlignment(JLabel.CENTER); JLabel label2 = new JLabel("■ Chat Area"); label2.setFont(new Font("Century",0,18)); label2.setPreferredSize(new Dimension(250,25)); label2.setHorizontalAlignment(JLabel.CENTER); JLabel label2_1 = new JLabel(" ■ Message"); label2_1.setPreferredSize(new Dimension(250,20)); label2_1.setHorizontalAlignment(JLabel.LEFT); msgTextArea = new JTextArea(20,20); msgTextArea.setBorder(new LineBorder(Color.gray,4,false)); msgTextArea.setLineWrap(true); msgTextArea.setEditable(false); JScrollPane scrollpane1 = new JScrollPane(msgTextArea); msgTextField = new JTextField(15); submitButton = new JButton("送信"); submitButton.addActionListener(this); submitButton.setActionCommand("submit"); //ラベルエリア(パネル2)----------------------------------------------- JLabel label3 = new JLabel("■ Client Name"); label3.setPreferredSize(new Dimension(250,25)); label3.setHorizontalAlignment(JLabel.CENTER); label3.setFont(new Font("Century",0,15)); label3.setForeground(Color.white); Name = new JTextField(15); Name.setPreferredSize(new Dimension(250,25)); JLabel label4 = new JLabel("■ Surver IP Address"); label4.setPreferredSize(new Dimension(250,25)); label4.setHorizontalAlignment(JLabel.CENTER); label4.setFont(new Font("Century",0,15)); label4.setForeground(Color.white); ip = new JTextField(15); ip.setPreferredSize(new Dimension(250,25)); JLabel label5 = new JLabel("■ Port Number"); label5.setPreferredSize(new Dimension(250,25)); label5.setHorizontalAlignment(JLabel.CENTER); label5.setFont(new Font("Century",0,15)); label5.setForeground(Color.white); port = new JTextField(15); port.setPreferredSize(new Dimension(250,25)); ImageIcon icon = new ImageIcon("cat.png"); JLabel label6 = new JLabel(icon); label6.setPreferredSize(new Dimension(250,238)); howtouse = new JButton("How to use"); howtouse.addActionListener(this); howtouse.setActionCommand("howto"); //ラベルエリア(パネル3)----------------------------------------------- enterButton = new JButton("入室"); enterButton.addActionListener(this); enterButton.setActionCommand("enter"); exitButton = new JButton("退室"); exitButton.addActionListener(this); exitButton.setActionCommand("exit"); //ラベルをパネル1に接続------------------------------------------------- leftpanel.add(label1,BorderLayout.NORTH); leftpanel.add(label2,BorderLayout.NORTH); leftpanel.add(scrollpane1,BorderLayout.CENTER); leftpanel.add(label2_1,BorderLayout.SOUTH); leftpanel.add(msgTextField,BorderLayout.SOUTH); leftpanel.add(submitButton); //ラベルをパネル2に接続------------------------------------------------- rightpanel.add(label3,BorderLayout.NORTH); rightpanel.add(Name,BorderLayout.NORTH); rightpanel.add(label4,BorderLayout.NORTH); rightpanel.add(ip,BorderLayout.NORTH); rightpanel.add(label5,BorderLayout.NORTH); rightpanel.add(port,BorderLayout.NORTH); rightpanel.add(label6,BorderLayout.SOUTH); rightpanel.add(howtouse,BorderLayout.SOUTH); //ラベルをパネル3に接続------------------------------------------------- buttompanel.add(enterButton,BorderLayout.CENTER); buttompanel.add(exitButton,BorderLayout.CENTER); //パネルをフレームに接続------------------------------------------------ Container contentPane = getContentPane(); contentPane.add(toppanel,BorderLayout.NORTH); contentPane.add(leftpanel,BorderLayout.WEST); contentPane.add(rightpanel,BorderLayout.EAST); contentPane.add(buttompanel,BorderLayout.SOUTH); //---------------------------------------------------------------------- thread = new Thread(this); exitedRoom("ChatClient_out");//コンストラクタ起動時にコンポーネントを退室状態へ } //サーバーへの接続メソッド(ソケット作成)--------------- public void connectServer(){ try{ socket = new Socket( ip.getText() , Integer.parseInt(port.getText()) ); msgTextArea.append(">サーバーに接続しました\n"); thread.start(); } catch(Exception err){ msgTextArea.append("ERROR0>" + err + "\n"); } } //サーバーとの接続を解除--------------------------------- public void close() throws IOException{ send("close"); socket.close(); } //サーバーにメッセージを送信----------------------------- public void send(String msg){ try{ OutputStream output = socket.getOutputStream(); PrintWriter writer = new PrintWriter(output); writer.println(msg); writer.flush(); } catch(Exception err){ msgTextArea.append("ERROR1>" + err + "\n"); } } //受信受付スレッド--------------------------------------- public void run(){ try { InputStream input = socket.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(input)); while(!socket.isClosed()){ String line = reader.readLine(); String[] msg = line.split(" ",2); String msgflag = msg[0]; String msgValue = (msg.length < 2 ? "" : msg[1]); reached(msgflag,msgValue); } } catch(Exception err){} } public void reached(String flag,String value){ //相手が退室した場合flag=closeがvalue=""がサーバーから送られてくる if(flag.equals("close")){ if(value.equals("")){ msgTextArea.append("相手が退室しました\n"); } } //相手が送信ボタンを押すと内容が、入室、退室ボタンを押すとその状況が送られてくる else if(flag.equals("msg")){ msgTextArea.append(value + "\n"); } } //ボタンコマンドの処理----------------------------------- public void actionPerformed(ActionEvent e){ String command = e.getActionCommand(); if(command.equals("submit")){ send("msg " + Name.getText() + ">>" +msgTextField.getText());//msgの後に半角のスペース msgTextField.setText(""); } else if(command.equals("enter")){ connectServer(); enteredRoom("ChatClient_in"); send("msg " + Name.getText() + "さんが入室しました\n"); } else if(command.equals("exit")){ send("msg " + Name.getText() + "さんが退室しました\n"); exitedRoom("ChatClient_out"); try{close();} catch(Exception err){} } else if(command.equals("howto")){ try{ Runtime rt = Runtime.getRuntime(); rt.exec("explorer http://www.rs.kagu.tus.ac.jp/yamalab/2013/suzuki/tcp.html"); }catch(IOException ex){ ex.printStackTrace(); } } } //入室状態------------------------------ private void enteredRoom(String roomName){ this.roomName = roomName; setTitle(roomName); msgTextField.setEditable(true); submitButton.setEnabled(true); enterButton.setEnabled(false); exitButton.setEnabled(true); } //退室状態------------------------------ private void exitedRoom(String roomName){ this.roomName = roomName; setTitle(roomName); msgTextField.setEditable(false); submitButton.setEnabled(false); exitButton.setEnabled(false); } }