客戶端java
package sockettest; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.PrintWriter; import java.net.Socket; import java.sql.Date; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; import javax.swing.JSplitPane; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Image; import java.awt.Toolkit; import javax.swing.DefaultCellEditor; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.JToolBar; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.SwingUtilities; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.Panel; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JScrollPane; import javax.swing.JTextPane; import javax.swing.table.DefaultTableModel; import javax.swing.text.Element; import javax.swing.text.StyleConstants; import javax.swing.JTable; import test.TextAreaRenderer; public class Client extends JFrame { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new Client().setVisible(true); } }); } private JSplitPane splitPane; private JToolBar toolBar; private JButton btnNewButton; private JButton btnNewButton_1; private JPanel panel; private JPanel panel_1; private Panel panel_2; private Panel panel_3; private JButton btnNewButton_2; private JScrollPane scrollPane; private JButton btnNewButton_3; private Socket st = null; private PrintWriter pw = null; private BufferedReader ReaderServer = null; public Client() { initialize(); try { st = new Socket("127.0.0.1", 8899); pw = new PrintWriter(st.getOutputStream()); ReaderServer = new BufferedReader(new InputStreamReader( st.getInputStream())); } catch (IOException e) { e.printStackTrace(); } initTable(new ArrayList<Object>()); } private void initialize() { addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { dispose(); } }); this.setTitle("客戶端"); this.setBounds(200, 200, 467, 532); getContentPane().add(getSplitPane(), BorderLayout.CENTER); getContentPane().add(getToolBar(), BorderLayout.NORTH); } private JSplitPane getSplitPane() { if (splitPane == null) { splitPane = new JSplitPane(); splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); splitPane.setLeftComponent(getPanel()); splitPane.setRightComponent(getPanel_1()); splitPane.setDividerLocation(300); splitPane.setDividerSize(3); } return splitPane; } private JToolBar getToolBar() { if (toolBar == null) { toolBar = new JToolBar(); toolBar.add(getBtnNewButton()); toolBar.add(getBtnNewButton_1()); } return toolBar; } private JButton getBtnNewButton() { if (btnNewButton == null) { btnNewButton = new JButton("菜單"); } return btnNewButton; } private JButton getBtnNewButton_1() { if (btnNewButton_1 == null) { btnNewButton_1 = new JButton("工具"); } return btnNewButton_1; } private JPanel getPanel() { if (panel == null) { panel = new JPanel(); panel.setLayout(new BorderLayout(0, 0)); panel.add(getPanel_3(), BorderLayout.SOUTH); panel.add(getScrollPane(), BorderLayout.CENTER); panel.setBackground(Color.white); } return panel; } private JPanel getPanel_1() { if (panel_1 == null) { panel_1 = new JPanel(); panel_1.setLayout(new BorderLayout(0, 0)); panel_1.add(getTextPane(),BorderLayout.CENTER); panel_1.add(getPanel_2_1(), BorderLayout.SOUTH); } return panel_1; } private Panel getPanel_2_1() { if (panel_2 == null) { panel_2 = new Panel(); panel_2.setPreferredSize(new Dimension(467, 30)); panel_2.setLayout(null); panel_2.add(getBtnNewButton_2()); } return panel_2; } private Panel getPanel_3() { if (panel_3 == null) { panel_3 = new Panel(); panel_3.setPreferredSize(new Dimension(467, 30)); panel_3.setLayout(null); panel_3.add(getBtnNewButton_3()); JButton btnNewButton_4 = new JButton("發送圖片"); btnNewButton_4.setBounds(116, 4, 93, 23); panel_3.add(btnNewButton_4); } return panel_3; } int i = 0; private JTable table; private JTextPane textPane_1; private JButton getBtnNewButton_2() { if (btnNewButton_2 == null) { btnNewButton_2 = new JButton("發送"); btnNewButton_2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { send(); if (i == 0) { i++; Send send = new Send(); send.start(); } } }); btnNewButton_2.setBounds(346, 3, 93, 23); } return btnNewButton_2; } public void send() { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); String inputString = textPane_1.getText(); List<ImageIcon> list = getImgs(); if (list.size() > 0) { oos.writeObject(new Message(inputString, list)); } else { oos.writeObject(new Message(inputString)); } byte[] by = baos.toByteArray(); oos.close(); baos.close(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < by.length; i++) { sb.append(by[i]); sb.append(","); } pw.print(sb.toString().substring(0, sb.toString().length() - 1)); pw.print("\n"); pw.flush(); } catch (IOException e) { e.printStackTrace(); } } public class Send extends Thread { @Override public void run() { super.run(); try { List<Object> list = new ArrayList<Object>(); while (true) { String clientMessage = ReaderServer.readLine(); String[] string = clientMessage.split(","); byte[] by = new byte[string.length]; for (int i = 0; i < string.length; i++) { by[i] = (byte) Integer.parseInt(string[i]); } ByteArrayInputStream ba = new ByteArrayInputStream(by); ObjectInputStream ois = new ObjectInputStream(ba); Message ent = (Message) ois.readObject(); list.add(""); list.add(" 服務端的信息 " + (new Date(System.currentTimeMillis())).toString()); if ((ent.getMessageString() != null) || !("".equals(ent.getMessageString().trim()))) { list.add(ent.getMessageString()); } if (ent.getMessageImageIcons() != null) { List<ImageIcon> imgList = ent.getMessageImageIcons(); for (int i = 0; i < imgList.size(); i++) { JLabel label = new JLabel(); label.setIcon(imgList.get(i)); list.add(label); } } initTable(list); } } catch (IOException e1) { e1.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } private void close() { try { ReaderServer.close(); pw.close(); st.close(); } catch (IOException e) { e.printStackTrace(); } } private JScrollPane getScrollPane() { if (scrollPane == null) { scrollPane = new JScrollPane(); scrollPane.setViewportView(getTable()); scrollPane.setBackground(Color.white); } return scrollPane; } private JButton getBtnNewButton_3() { if (btnNewButton_3 == null) { btnNewButton_3 = new JButton("添加圖片"); btnNewButton_3.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ImageIcon img = getImg(getbyte()); textPane_1.insertIcon(img); } }); btnNewButton_3.setBounds(10, 4, 93, 23); } return btnNewButton_3; } public byte[] getbyte() { byte[] by = null; try { // file = new File("./classes/test/icon.gif"); // image = new ImageIcon(file.getAbsoluteFile().toString()); File file = new File( "C:\\Users\\Administrator\\Desktop\\iReport\\QQ截圖20131022163001.png"); FileInputStream fis = new FileInputStream(file); by = new byte[fis.available()]; // 循環讀取 fis.read(by); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return by; } public ImageIcon getImg(byte[] by) { Image img = Toolkit.getDefaultToolkit().createImage(by); ImageIcon image = new ImageIcon(); image.setImage(img.getScaledInstance(230, 150, Image.SCALE_DEFAULT)); return image; } public List<ImageIcon> getImgs() { List<ImageIcon> list = new ArrayList<ImageIcon>(); for (int i = 0; i < this.textPane_1.getDocument().getRootElements()[0] .getElementCount(); i++) { Element root = this.textPane_1.getDocument().getRootElements()[0] .getElement(i); for (int j = 0; j < root.getElementCount(); j++) { ImageIcon icon = (ImageIcon) StyleConstants.getIcon(root .getElement(j).getAttributes()); if (icon != null) { list.add(icon); } } } // System.out.println(list.size()+"==="); return list; } private JTable getTable() { if (table == null) { table = new JTable(); table.setShowGrid(false); table.setShowHorizontalLines(false); table.setShowVerticalLines(false); table.setSurrendersFocusOnKeystroke(false); } return table; } public void initTable(List list) { DefaultTableModel dtm = new DefaultTableModel(); dtm.addColumn(""); JTextField tf = new JTextField(); table.setModel(dtm); table.getColumnModel().getColumn(0).setCellEditor( new DefaultCellEditor(tf)); table.getColumnModel().getColumn(0).setCellRenderer( new TextAreaRenderer()); for (int i = 0; i < list.size(); i++) { dtm.addRow(new Object[] { list.get(i) }); } } private JTextPane getTextPane() { if (textPane_1 == null) { textPane_1 = new JTextPane(); } return textPane_1; } }
服務端sql
package sockettest; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.HashMap; import java.util.Map; public class Server{ public static void main(String[] args) { Server server = new Server(); server.init(); } public void init(){ Map<String,Socket> map = new HashMap<String,Socket>(); String stu = null; try { ServerSocket sst = new ServerSocket(8899); while (true) { Socket st = sst.accept(); BufferedReader reader = new BufferedReader(new InputStreamReader(st.getInputStream())); String clientMessage = reader.readLine(); String[] string = clientMessage.split(","); byte[] by = new byte[string.length]; for (int i = 0; i < string.length; i++) { by[i]= (byte)Integer.parseInt(string[i]); } ByteArrayInputStream ba = new ByteArrayInputStream(by); ObjectInputStream ois = new ObjectInputStream(ba); Message ent = (Message) ois.readObject(); clientMessage = ent.getMessageString(); String id = clientMessage.substring(0,1); String bid = clientMessage.substring(1,2); map.put(id, st); if(map.get(bid)!=null){ Forwarding f = new Forwarding(st,map.get(bid)); f.start(); if(id.equals(stu)){ Forwarding forwarding = new Forwarding(map.get(bid),st); forwarding.start(); } }else{ stu = bid; } } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public class Forwarding extends Thread{ private Socket socketA; private Socket socketB; public Forwarding(Socket socketA,Socket socketB){ this.socketA = socketA; this.socketB = socketB; } @Override public void run() { super.run(); try { PrintWriter pwB = new PrintWriter(this.socketB.getOutputStream()); BufferedReader readerA = new BufferedReader(new InputStreamReader(this.socketA.getInputStream())); while (true) { String message = readerA.readLine(); pwB.print(message); pwB.print("\n"); pwB.flush(); } } catch (IOException e) { e.printStackTrace(); } } } }