java swing socket聊天示例

客户端

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;
    }
}

服务端

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();
            }
            
        }
    }
    
}

 

转载于:https://www.cnblogs.com/keweizhi/p/3401094.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值