java实现类似qq的窗口对聊
2023-09-11 14:20:42 时间
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(); } }
相关文章
- java虚拟机学习-Java常量池理解与总结(13-2)
- Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring
- Class Literal(Java)
- Java学习笔记七(目录操作)
- java高级用法之:在JNA中将本地方法映射到JAVA代码中
- 【JAVA】JAVA操作数据的增、删、改、查(带参和不带参两种:示例+代码+注释)
- 【JAVA】在java类中连接和读取mysql数据库的实例(控制台显示)
- 大杂烩 -- Java内存布局【图】以及java各种存储区【详解】
- JAVA基础--Java枚举+位操作,巧妙判断是否设置
- 使用java实现qq邮箱信息的发送(纯java实现)
- java实现QQ、微信等第三方账号登陆
- 【Java】java基本知识
- 第二十一节:Java语言基础-关键字,标识符,注释,常量和变量,运算符
- 北京联想招聘-java 云服务开发工程师 加入qq 群:220486180 或者直接在此 留言咨询
- Java编程思想(第4版)16-21章节笔记
- Java 并发工具包 java.util.concurrent 大全
- java整理软件--- Java OCR 图像智能字符识别技术,可识别中文,但是验证码不可以识别...已测识别中文效果很好
- Error running 'dt-assets-monitor [clean]': Cannot run program "C:Program Files (x86)Javajdk1.8.0_73binjava.exe" (in directory "E:codedt-assets-monitor")
- elasticsearch之JAVA环境变量报错:could not find java; set JAVA_HOME or ensure java is in PATH
- Java动态代理
- 『Java练习生的自我修养』java-se进阶⁴ • IO流概览
- 『Java练习生的自我修养』java-se进阶² • 并发与多线程
- Java学习---下载文件并且对文件编码
- Java版的QQ小程序
- C++ 'dynamic_cast' and Java 'instanceof' 使用对比
- Java 7之多线程- Semaphore--转载
- 什么是Java序列化,如何实现java序列化
- 【Java笔记】配置文件java.util.Properties类的使用
- 多种方式解决Java控制台报错 java.util.LinkedHashMap cannot be cast to.....
- 解决Java使用response下载文件报错,并总结可能出错的原因: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。