Java画面精美的简易聊天室
来源:互联网 发布:装修效果图设计软件 编辑:程序博客网 时间:2024/05/17 07:15
这里使用了Jack Jiang大神的BeautyEye库,实现了良好的界面,感谢!
工程下载地址:http://download.csdn.net/download/lly1122334/10153788
服务器
package Server;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import java.util.Collections;import java.util.List;/** * 服务器线程类,实现Runnable接口 * * @author XerCis * @version 1.0 */class ServerThread implements Runnable { private Socket s; //套接字 private BufferedReader br; //字符输入流 /** * 构造函数 * * @param s Socket * @throws IOException * @since 1.0 */ public ServerThread(Socket s) throws IOException { this.s = s; br = new BufferedReader(new InputStreamReader(s.getInputStream())); } /** * 从客户端接收信息 * * @return 从客户端接收到的信息 * @since 1.0 */ private String readFromClient() { try { return br.readLine(); } catch (IOException e) { Server.socketList.remove(s); } return null; } /** * 线程不断从客户端接收信息并转发 * * @since 1.0 */ public void run() { String content = null; //从客户端接收信息 while((content = readFromClient()) != null) //不为空的时候转发给所有客户端 { for(Socket s:Server.socketList) { try { PrintStream ps; //打印流(字节输出流) ps = new PrintStream(s.getOutputStream()); //用服务器Socket的OutputStream封装 ps.println(content); } catch (IOException e) { e.printStackTrace(); } } } }}/** * 服务器类 * * @author XerCis * @version 1.0 */public class Server { public static List<Socket> socketList = Collections.synchronizedList(new ArrayList<>());//保存所有Socket,线程安全 /** * main方法,启动服务器 * * @author XerCis * @version 1.0 */ @SuppressWarnings("resource") public static void main(String[] args) { try { ServerSocket serversocket = new ServerSocket(6666);//指定端口为6666 System.out.println("服务器启动"); while(true) { Socket socket = serversocket.accept();//接受客户端 socketList.add(socket);//添加进客户端List中 new Thread(new ServerThread(socket)).start();//启动服务器线程 } } catch (IOException e) { e.printStackTrace(); } }}
客户端
package Client;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.net.Socket;import java.net.UnknownHostException;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Random;import javax.swing.ImageIcon;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.border.EmptyBorder;import javax.swing.event.DocumentEvent;import javax.swing.event.DocumentListener;import org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper;import java.awt.Color;import java.awt.EventQueue;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.UIManager;import javax.swing.JButton;import java.awt.Font;import java.awt.Toolkit;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;/** * 客户端界面类 * * @author XerCis * @version 1.0 */public class ClientFrame extends JFrame { private JPanel contentPane; //组件容器 private JTextArea input; //发送框 private JTextArea output; //显示框 private String name; //用户名 private PrintStream ps; //输出流 private BufferedReader br; /** * 客户端线程类(内部类) * * @author XerCis * @version 1.0 */ class ClientThread implements Runnable { private Socket s; BufferedReader br = null; public ClientThread(Socket s) throws IOException { this.s = s; br = new BufferedReader(new InputStreamReader(s.getInputStream())); } public void run() { try { String content = null; while((content = br.readLine())!=null) { output.append(content+"\n"); } } catch (IOException e) { e.printStackTrace(); } } } /** * 发送信息 * * @since 1.0 */ private void sendMessage(){ Date now = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); String time = sdf.format(now);//当前时间 String message = input.getText(); if(message.isEmpty()) return; message = name+"("+time+")\n"+message; ps.println(message); input.setText("");//发送完清空 } /** * 构造函数 * * @param name 用户名 * @throws IOException * @throws UnknownHostException * @since 1.0 */ public ClientFrame() throws UnknownHostException, IOException { Random rand = new Random(); int randNum = rand.nextInt(17); name = "用户" + String.valueOf(randNum); this.setVisible(true); setTitle(name); //设置窗口名 setResizable(false); //不可放大 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭后退出 setIconImage(Toolkit.getDefaultToolkit().getImage("img\\logo.png")); //设置图标 Socket s = new Socket("127.0.0.1",6666); //获取套接字 new Thread(new ClientThread(s)).start(); //启动客户端线程 ps = new PrintStream(s.getOutputStream()); br = new BufferedReader(new InputStreamReader(System.in)); /* 容器 */ setBounds(100, 100, 599, 629); contentPane = new JPanel(); contentPane.setBackground(new Color(0, 153, 204)); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); /* 显示框的滚动条 */ JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(23, 63, 422, 290); contentPane.add(scrollPane); /* 显示框 */ String text = "XerCis\nNorthwest A&F University\nShaanxi,Yangling,712100\nTel:13201405250\nE-mail:Jiankun_Luo@qq.com\n----------------------------------------\n"; output = new JTextArea(text); scrollPane.setViewportView(output);//将滚动条附加到显示框中 output.setFont(new Font("微软雅黑", Font.PLAIN, 18)); output.setEditable(false);//不可编辑 output.setLineWrap(true);//自动换行 output.setWrapStyleWord(true);//断行不断字 output.setCaretPosition(output.getText().length());//自动换行且滚动到最新 output.getDocument().addDocumentListener(new DocumentListener(){ public void changedUpdate(DocumentEvent e) { output.setCaretPosition(output.getText().length());//自动换行且滚动到最新 } public void insertUpdate(DocumentEvent e) { output.setCaretPosition(output.getText().length());//自动换行且滚动到最新 } public void removeUpdate(DocumentEvent e) { output.setCaretPosition(output.getText().length());//自动换行且滚动到最新 } }); /* 头像 */ JLabel me = new JLabel(""); me.setIcon(new ImageIcon("img\\head\\"+randNum+".png")); me.setBounds(450, 385, 100, 100); contentPane.add(me); /* 发送按钮 */ JButton send = new JButton("\u53D1\u9001(Enter)"); send.setFont(new Font("微软雅黑", Font.PLAIN, 12)); send.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent arg0) { sendMessage(); } }); send.setBounds(334, 506, 111, 23); contentPane.add(send); /* 发送框的滚动条 */ JScrollPane scrollPane_1 = new JScrollPane(); scrollPane_1.setBounds(23, 385, 422, 100); contentPane.add(scrollPane_1); /* 发送框 */ input = new JTextArea(); input.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent arg0) { if(arg0.getKeyCode() == KeyEvent.VK_ENTER) { if(input.getText().equals("\n")) { input.setText(""); return; } sendMessage(); //按回车发送 } } }); scrollPane_1.setViewportView(input); //将滚动条附加到发送框中 input.setFont(new Font("微软雅黑", Font.PLAIN, 18)); input.setLineWrap(true); input.setWrapStyleWord(true); /* 背景 */ JLabel background = new JLabel(""); background.setBackground(new Color(214, 217, 223)); background.setIcon(new ImageIcon("img\\background.png")); background.setBounds(0, 0, 550, 550); contentPane.add(background); } /** * main方法,启动客户端 * * @since 1.0 */ public static void main(String[] args) throws Exception { /*设置成BeautyEye风格*/ try { System.setProperty("sun.java2d.noddraw", "true");//解决切换中文输入法导致白屏 BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.translucencyAppleLike;//强立体透明 org.jb2011.lnf.beautyeye.BeautyEyeLNFHelper.launchBeautyEyeLNF();//加载BeautyEye风格,需引入包beautyeye_lnf.jar UIManager.put("RootPane.setupButtonVisible", false);//隐藏“设置”按钮 String[] DEFAULT_FONT = new String[]{"Table.font","TableHeader.font","CheckBox.font","Tree.font","Viewport.font","ProgressBar.font","RadioButtonMenuItem.font","ToolBar.font","ColorChooser.font","ToggleButton.font","Panel.font","TextArea.font","Menu.font","TableHeader.font","TextField.font","OptionPane.font","MenuBar.font","Button.font","Label.font","PasswordField.font","ScrollPane.font","MenuItem.font","ToolTip.font","List.font","EditorPane.font","Table.font","TabbedPane.font","RadioButton.font","CheckBoxMenuItem.font","TextPane.font","PopupMenu.font","TitledBorder.font","ComboBox.font"}; for(int i=0;i<DEFAULT_FONT.length;i++) UIManager.put(DEFAULT_FONT[i],new Font("微软雅黑", Font.PLAIN, 14));//设置默认字体解决组件发虚问题 } catch (Exception e) { e.printStackTrace(); } EventQueue.invokeLater(new Runnable() { public void run() { try { ClientFrame client = new ClientFrame(); client.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); }}
阅读全文
0 0
- Java画面精美的简易聊天室
- 一个简易的java聊天室代码
- 基于 Java 和 jQuery 的简易聊天室
- Java简易聊天室
- JAVA--简易聊天室程序
- java简易多用户聊天室
- java socket简易聊天室
- java简易聊天室
- 多线程Java简易聊天室
- 简易聊天室的制作
- Java简易聊天室程序socket
- Java、WebSocket、HTML简易聊天室
- 基于WebSocket的简易聊天室
- 简易聊天室
- JAVA EE简易聊天室实验报告
- Java WebSocket编程与网页简易聊天室
- java菜鸟 socket简易局域网聊天室
- 基于websocket的简易聊天室的实现
- Kafka Creating Topic Error: replication factor larger than available brokers
- php设置报错级别,项目后台使用YII框架开发
- nanopi 烧写系统+连接wifi+stfp
- 5. 编码器与PID控制
- IntelliJ IDEA For Mac 快捷键
- Java画面精美的简易聊天室
- Wireless Network poj 2236
- word2vec
- java快速排序
- 6. PIBOT的通讯协议
- MySQL基础(二)数据库、表的创建及操作
- 搭建调试符号服务器
- JavaScript基础总结
- 一道简单而经典的二分,借用一点挑战上的方法