java实现类似qq的窗口对聊
Swing实现界面,socket实现通信
package com.learn.talk; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextArea; public class ChatReceiver { private PrintWriter pw; private JFrame frame; private JPanel pane_buttom; private JSplitPane pane_center; // 显示内容的文本框,输入内容的文本框,发送内容按钮 private JScrollPane pane_showWindow; private JScrollPane pane_inputWindow; private JTextArea area_showWindow; private JTextArea area_inputWindow; private JButton btn_send; private Dimension dimension;// 用于设置area_showWindow可拖拉的大小 // 初始化 public ChatReceiver() { frame = new JFrame(); pane_buttom = new JPanel(); pane_showWindow = new JScrollPane(); pane_inputWindow = new JScrollPane(); area_showWindow = new JTextArea(); area_inputWindow = new JTextArea(); pane_center = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false, pane_showWindow, pane_inputWindow); btn_send = new JButton("send"); dimension = new Dimension(50, 300); } // 调用方法显示窗口 public void showFrame() { initFrame(); initChatTextArea(); initButton(); btn_send(); socket(); } // 主窗体 public void initFrame() { frame.setTitle("简繁"); int width = (int) Toolkit.getDefaultToolkit().getScreenSize() .getWidth(); int height = (int) Toolkit.getDefaultToolkit().getScreenSize() .getHeight(); frame.setBounds(width / 2, height / 2, 400, 450); frame.setVisible(true); } // 内容显示文本框和输入内容文本框 private void initChatTextArea() { // 取得视图焦点 pane_showWindow.getViewport().add(area_showWindow); pane_inputWindow.getViewport().add(area_inputWindow); // 将显示文本域设置为不可编辑 area_showWindow.setEditable(false); // 设置显示文本域可拖拉的大小 pane_showWindow.setMinimumSize(dimension); frame.add(pane_center, BorderLayout.CENTER); } // 发送文件,发送内容按钮 public void initButton() { pane_buttom.add(btn_send); frame.add(pane_buttom, BorderLayout.SOUTH); } private void btn_send() { btn_send.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String info = area_inputWindow.getText(); area_showWindow.append("简繁:" + info + "\r\n"); pw.println(info); area_inputWindow.setText(""); } }); } private void socket() { ServerSocket ss; try { ss = new ServerSocket(9988); // 等待连接 客户端 Socket s = ss.accept(); InputStreamReader isr = new InputStreamReader(s.getInputStream()); BufferedReader br = new BufferedReader(isr); // PrintWriter必须和socket有密切的关系 pw = new PrintWriter(s.getOutputStream(), true); // 读取从客户端法发来的信息 while (true) { // 读取从客户端发来的信息 String info = br.readLine(); // 在文本栏里显示 area_showWindow.append("garfield:" + info + "\r\n"); } } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { ChatReceiver chat = new ChatReceiver(); chat.showFrame(); } }
package com.learn.talk; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTextArea; public class ChatSender { private PrintWriter pw; private JFrame frame; private JPanel pane_buttom; private JSplitPane pane_center; // 显示内容的文本框,输入内容的文本框,发送内容按钮 private JScrollPane pane_showWindow; private JScrollPane pane_inputWindow; private JTextArea area_showWindow; private JTextArea area_inputWindow; private JButton btn_send; private Dimension dimension;// 用于设置area_showWindow可拖拉的大小 // 初始化 public ChatSender() { frame = new JFrame(); pane_buttom = new JPanel(); pane_showWindow = new JScrollPane(); pane_inputWindow = new JScrollPane(); area_showWindow = new JTextArea(); area_inputWindow = new JTextArea(); pane_center = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false, pane_showWindow, pane_inputWindow); btn_send = new JButton("send"); dimension = new Dimension(50, 300); } // 调用方法显示窗口 public void showFrame() { initFrame(); initChatTextArea(); initButton(); btn_send(); socket(); } // 主窗体 public void initFrame() { frame.setTitle("garfield"); int width = (int) Toolkit.getDefaultToolkit().getScreenSize() .getWidth(); int height = (int) Toolkit.getDefaultToolkit().getScreenSize() .getHeight(); frame.setBounds(width / 2, height / 2, 400, 450); frame.setVisible(true); } // 内容显示文本框和输入内容文本框 private void initChatTextArea() { // 取得视图焦点 pane_showWindow.getViewport().add(area_showWindow); pane_inputWindow.getViewport().add(area_inputWindow); // 将显示文本域设置为不可编辑 area_showWindow.setEditable(false); // 设置显示文本域可拖拉的大小 pane_showWindow.setMinimumSize(dimension); frame.add(pane_center, BorderLayout.CENTER); } // 发送文件,发送内容按钮 public void initButton() { pane_buttom.add(btn_send); frame.add(pane_buttom, BorderLayout.SOUTH); } private void btn_send() { btn_send.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String info = area_inputWindow.getText(); area_showWindow.append("garfield: " + info + "\r\n"); pw.println(info); area_inputWindow.setText(""); } }); } private void socket() { try { Socket s = new Socket("127.0.0.1", 9988); InputStreamReader isr = new InputStreamReader(s.getInputStream()); BufferedReader br = new BufferedReader(isr); pw = new PrintWriter(s.getOutputStream(), true); while (true) { String info = br.readLine(); area_showWindow.append("简繁: " + info + "\r\n"); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { ChatSender chat = new ChatSender(); chat.showFrame(); } }