2024年7月11日实训日志
学习内容
学习成果
package com.baidu.client; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import javax.swing.*; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import com.baidu.utils.Configuration; import com.baidu.utils.Utils; public class Client extends JFrame{ private String ip; private int port; private String cid; private Socket socket; private InputStream inputStream; private OutputStream outputStream; private StringBuffer chatTargetStringBuffer; public JTextArea chatContentJTextArea; private JScrollPane chatJScrollPane; private JTextArea chatEditJTextArea; private JScrollPane onlineJTableJScrollPane; private JButton sendButton; private JButton cleanButton; private JButton exitButton; public JTable onlineJTable; private JLabel tipLabel; public static void main(String[] args) { Client client=new Client(); client.initViews(); //初始化组件 client.connectServer(); client.handleMessageFromServer(); } // 初始化界面和组件 private void initViews() { initFrame(); initChatContentJTextArea(); initTipLabel(); initChatEditJTextArea(); initSendButton(); initCleanButton(); initExitButton(); initOnlineJTable(); setFrame(); } // 初始化窗体 public void initFrame(){ this.setTitle("The Pure Land of Chat"); int width = Configuration.CLIENT_FRAME_WIDTH; int height = Configuration.CLIENT_FRAME_HEIGHT; this.setSize(width, height); this.setResizable(false); //窗体不可缩放 this.setLayout(null); // 设置窗体不使用默认布局,而是自定义布局 } private void initChatContentJTextArea() { chatContentJTextArea = new JTextArea(); chatContentJTextArea.setLineWrap(true); // 聊天消息框自动换行 chatContentJTextArea.setEditable(false); chatContentJTextArea.setFont(Configuration.font); // 设置聊天框字体 chatJScrollPane = new JScrollPane(chatContentJTextArea); // 设置滚动窗的水平滚动条属性:不出现 chatJScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); // 设置滚动窗的垂直滚动条属性:需要时自动出现 chatJScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); // 设置滚动窗大小和位置 chatJScrollPane.setBounds(20, 20, 360, 400); this.add(chatJScrollPane); } // 提醒标签 private void initTipLabel() { tipLabel = new JLabel("请从好友列表中选择聊天对象"); tipLabel.setBounds(20, 420, 300, 30); tipLabel.setFont(Configuration.font); this.add(tipLabel); } // 聊天编辑框 private void initChatEditJTextArea() { chatEditJTextArea = new JTextArea(); chatEditJTextArea.setBounds(20, 460, 360, 120); chatEditJTextArea.setFont(Configuration.font); // 将控件添加至窗体 this.add(chatEditJTextArea); } // 发送按钮 private void initSendButton() { sendButton = new JButton("发送"); sendButton.setBounds(20, 600, 100, 60); sendButton.setFont(Configuration.font); // 添加发送按钮的事件监听器(开始) sendButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { // 将JTextArea的滚动条拉至其底部 int length = chatContentJTextArea.getDocument().getLength(); chatContentJTextArea.setCaretPosition(length); try { // 获取聊天对象,chatTarget中包含了一个或多个目标对象 String chatTarget = chatTargetStringBuffer.toString(); // 获取待发送的聊天内容 String content = chatEditJTextArea.getText(); if (chatTarget != null && chatTarget.length() > 0) { // 在聊天窗口显示与发送相关的信息 chatContentJTextArea.append( Utils.getCurrentTime() + Configuration.NEWLINE + "发往" + chatTarget + Configuration.NEWLINE); // 在聊天窗口显示发送消息 chatContentJTextArea.append(content + Configuration.NEWLINE); outputStream = socket.getOutputStream(); // 组拼消息:消息类型+发送方+接收方+聊天内容 String from = cid; String to = chatTarget; String messageToServer= Configuration.TYPE_CHAT +//协议 Configuration.SEPARATOR + from + Configuration.SEPARATOR+ to + Configuration.SEPARATOR+ content; System.out.println("客户端打印,客户端发出消息:"); System.out.println(messageToServer); // 利用字节输出流向服务器发送聊天信息 outputStream.write(messageToServer.getBytes()); } } catch (Exception e) { System.out.println(e); } finally { // 清空文本输入框 chatEditJTextArea.setText(""); } } }); // 添加发送按钮的事件监听器(结束) this.add(sendButton); } // 清屏按钮 private void initCleanButton() { cleanButton = new JButton("清屏"); cleanButton.setBounds(140, 600, 100, 60); cleanButton.setFont(Configuration.font); // 添加清屏按钮的事件监听器(开始) cleanButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { chatContentJTextArea.setText(""); } }); // 添加清屏按钮的事件监听器(结束) // 将控件添加至窗体 this.add(cleanButton); }
学习总结
今天内容很多,走了一遍程序的大致流程,再次详细了解了服务端和客户端。之后和小组同学讨论了项目代码里的大致含义,大部分都能看得出来,没有想象中的难,实在不知道的还可以上CSDN上搜索。或者把某段不了解的代码复制粘贴到文心一言,大部分都能自己得到答案。