我决定出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 }
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 }