我决定出1.0的时候改名叫OIFaQ

  不过目前就算了。

 

  练练Socket,还有一点GUI

  这次直接用了默认包。

  原理很简单,客户端想办法搞到用户输入的内容,然后把用户ID和输入内容拿一个数组装起来,然后用ObjectOutputStream送到服务器端。

  服务器端接到了之后原样拆开,打印一下就行了。

 

  其实我根本不知道聊天程序该怎么实现……每个人都有一份server和一份client?

  写一点是一点吧……

  总之之后再学学。

  另外目前因为用的是TCP,似乎只能一对一,之后再研究研究UDP。

  

  Server的输入流名字起错了,不要在意。

  另外代码这么简单,没有注释也没关系的嘛,是吧。

 1 import java.io.*;
 2 import java.net.*;
 3 
 4 /**服务器端,目前是单纯的解包并在命令行打印,下个版本改。
 5  * 
 6  * @author mlxy
 7  * @version 0.4
 8  * */
 9 public class SimChatServer {
10     public static void main(String[] args) {
11         try {
12             @SuppressWarnings("resource")
13             ServerSocket ss = new ServerSocket(2333);
14             
15             System.out.println("Waiting...");
16             Socket s = ss.accept();
17             System.out.println("Client connected.");
18             
19             ObjectInputStream dis;
20             
21             boolean flag = true;
22             while(flag) {
23                 dis = new ObjectInputStream(s.getInputStream());
24                 try {
25                     String[] packReceived = (String[]) dis.readObject();
26                     System.out.println(packReceived[0] + ": " + packReceived[1]);
27                 }
28                 catch (ClassNotFoundException e) {e.printStackTrace(); System.exit(-1);}
29             }
30             
31         } catch(IOException e) {
32             e.printStackTrace();
33             System.exit(-1);
34         }
35         
36     }
37 }
Server端
  1 import java.awt.*;
  2 import java.awt.event.*;
  3 
  4 import javax.swing.*;
  5 
  6 import java.io.*;
  7 import java.net.*;
  8 
  9 /**客户端程序。之后加上打开的时候先弹窗初始化用户ID的功能。
 10  * 
 11  * @author mlxy
 12  * @version 0.7
 13  * */
 14 public class SimChatClient extends JFrame {
 15     private static final long serialVersionUID = 1685352502599359548L;
 16     private JPanel panel;
 17     private JTextArea area;
 18     private JTextField field;
 19     private String userID;
 20     private StringBuffer chatRecord = new StringBuffer("");
 21     
 22     private Socket socket;
 23     private ObjectOutputStream oos;
 24     
 25     /**默认构造方法,初始化用户ID及框架内容。*/
 26     public SimChatClient() {
 27         try {socket = new Socket("192.168.1.104", 2333);}
 28         catch(IOException e) {e.printStackTrace(); System.out.println(-1);}
 29         
 30         setUserID("Default User");
 31         
 32         panel = new JPanel();
 33         panel.setLayout(new BorderLayout());
 34 
 35         area = new JTextArea();
 36         area.setLineWrap(true);
 37         area.setWrapStyleWord(true);
 38         area.setEditable(false);
 39         area.setBackground(new Color(255, 204, 255));
 40         JScrollPane scrollPane = new JScrollPane(area);
 41         
 42         field = new JTextField();
 43         field.setBackground(new Color(66, 204, 255));
 44         field.addActionListener(new FieldListener());
 45         
 46         panel.add(scrollPane, BorderLayout.CENTER);
 47         panel.add(field, BorderLayout.SOUTH);
 48         
 49         this.add(panel);
 50         this.addWindowListener(new WindowAdapter() {
 51             @Override
 52             public void windowActivated(WindowEvent e) {
 53                 super.windowActivated(e);
 54                 field.requestFocusInWindow();
 55             }
 56         });
 57         //this.pack();
 58     }
 59     
 60     /**自定义用户ID的构造方法。*/
 61     public SimChatClient(String userID) {
 62         this();
 63         this.setUserID(userID);
 64     }
 65     
 66     /**主运行方法。*/
 67     public static void main(String[] args) {
 68         try {
 69             UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
 70         } catch (UnsupportedLookAndFeelException e) {
 71             e.printStackTrace();
 72         } catch (ClassNotFoundException e) {
 73             e.printStackTrace();
 74         } catch (InstantiationException e) {
 75             e.printStackTrace();
 76         } catch (IllegalAccessException e) {
 77             e.printStackTrace();
 78         }
 79         
 80         launchFrame();
 81     }
 82     
 83     /**框架参数初始化。*/
 84     private static void launchFrame() {
 85         SimChatClient frame = new SimChatClient("mlxy");
 86         
 87         frame.setTitle("Simple Chat Online");
 88         frame.setSize(300, 400);
 89         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 90         frame.setLocationRelativeTo(null);
 91         frame.setVisible(true);
 92     }
 93     
 94     /**输入框的监听器。*/
 95     class FieldListener implements ActionListener {
 96         
 97         @Override
 98         public void actionPerformed(ActionEvent e) {
 99             //向服务器发送包。
100             String[] packToSend = {userID, field.getText()};
101             try {
102                 oos = new ObjectOutputStream(socket.getOutputStream());
103                 oos.writeObject(packToSend);
104             }
105             catch (IOException ex) {ex.printStackTrace(); System.exit(-1);}
106             
107             //更新单机窗口内容。###之后加上发送时间。
108             chatRecord.append(userID + ": " + field.getText() + "\n");
109             area.setText(chatRecord.toString());
110             field.setText("");
111         }
112     }
113 
114     public String getUserID() {return userID;}
115     public void setUserID(String userID) {this.userID = userID;}
116 }
Client端

 

posted @ 2014-01-17 12:56  Chihane  阅读(199)  评论(0编辑  收藏  举报