第四次过程性考核
码云:https://gitee.com/yyh1234/fourth_process_assessment/tree/master
*160120
使用套接写连接编写一个简单的聊天室程序,客户端主函数放在Client_Main.java文件中,服务器端主函数放在Server_Main.java文件中
要求:
- 1.客户端从控制台进行输入,并将客户端的输出内容和时间保存到“学号.txt”文件中
- 2.服务器端读取到客户端的程序后,给客户端以回应,并将客户端的输入内容与服务端的输出内容、时间保存到文本文件中
- 3.要求服务器端可以实现同时与多个客户端进行通信,与每一个客户端通信的内容,保存为一个“学号_ip.txt”的文件
- 4.4.提交文件结果包括:代码,通信后生成的txt文件
程序设计思路:先编写代码,让客户端和服务器能通信,在添加日志文件
运用到的知识点:多线程,文件的输入与存储,套接字
客户端:
1 import java.awt.EventQueue; 2 import java.awt.event.ActionEvent; 3 import java.awt.event.ActionListener; 4 import java.io.*; 5 import java.net.*; 6 import java.util.*; 7 8 import javax.swing.JButton; 9 import javax.swing.JFrame; 10 import javax.swing.JLabel; 11 import javax.swing.JPanel; 12 import javax.swing.JScrollPane; 13 import javax.swing.JTextArea; 14 import javax.swing.JTextField; 15 import javax.swing.SwingConstants; 16 import javax.swing.border.EmptyBorder; 17 public class Client extends JFrame { 18 private JPanel contentPane; 19 private Socket socket; 20 private JTextArea textArea; 21 private JTextField textField; 22 private JTextField textField1; 23 private OutputStream out; 24 private InputStream is; 25 public static void main(String[] args) { 26 EventQueue.invokeLater(new Runnable() { 27 public void run() { 28 try { 29 Client frame = new Client(); 30 frame.setVisible(true); 31 } catch (Exception e) { 32 e.printStackTrace(); 33 } 34 } 35 }); 36 } 37 public Client() throws UnknownHostException, IOException { 38 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 39 setBounds(100, 100, 450, 300); 40 contentPane = new JPanel(); 41 contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 42 setContentPane(contentPane); 43 contentPane.setLayout(null); 44 45 JPanel panel = new JPanel(); 46 panel.setBounds(10, 10, 398, 39); 47 contentPane.add(panel); 48 49 JLabel lblNewLabel = new JLabel("\u6635\u79F0\uFF1A"); 50 panel.add(lblNewLabel); 51 52 textField = new JTextField(); 53 textField.setText("\u6E38\u5BA2"); 54 panel.add(textField); 55 textField.setColumns(20); 56 57 JScrollPane scrollPane = new JScrollPane(); 58 scrollPane.setBounds(10, 59, 398, 143); 59 contentPane.add(scrollPane); 60 61 textArea = new JTextArea(); 62 scrollPane.setViewportView(textArea); 63 64 JPanel panel1 = new JPanel(); 65 panel1.setBounds(10, 212, 398, 39); 66 contentPane.add(panel1); 67 68 JLabel lblNewLabel_1 = new JLabel("\u8F93\u5165\u804A\u5929\u5185\u5BB9"); 69 panel1.add(lblNewLabel_1); 70 71 textField1 = new JTextField(); 72 panel1.add(textField1); 73 textField1.setColumns(20); 74 75 JButton btnNewButton = new JButton("\u53D1\u9001"); 76 btnNewButton.addActionListener(new ActionListener() { 77 public void actionPerformed1(ActionEvent e) { 78 try{ 79 out=socket.getOutputStream(); 80 String name=textField.getText()+":"; 81 String text=name+textField1.getText()+"\n"; 82 out.write(text.getBytes()); 83 out.flush(); 84 textField1.setText(""); 85 }catch(IOException e1){ 86 e1.printStackTrace(); 87 } 88 } 89 90 public void actionPerformed(ActionEvent arg0) { 91 92 } 93 }); 94 btnNewButton.setHorizontalAlignment(SwingConstants.RIGHT); 95 panel1.add(btnNewButton); 96 97 socket=new Socket("127.0.0.1",8889); 98 receiveMessage(); 99 } 100 101 private void receiveMessage() { 102 new Thread(){ 103 public void run(){ 104 try{ 105 is=socket.getInputStream(); 106 Scanner scan=new Scanner(is); 107 while(socket.isConnected()){ 108 String text=scan.nextLine()+"\n"; 109 textArea.append(text); 110 sleep(100); 111 } 112 }catch(Exception e){ 113 e.printStackTrace(); 114 } 115 } 116 }.start(); 117 } 118 }
服务器:
1 import java.io.*; 2 import java.net.*; 3 import java.util.*; 4 public class Server { 5 static ArrayList<Socket> clients=new ArrayList<Socket>(); 6 public static void main(String[] args) { 7 try{ 8 ServerSocket server=new ServerSocket(8889); 9 System.out.println("服务器已经启动......"); 10 while(true){ 11 Socket socket=server.accept(); 12 clients.add(socket); 13 transmitMessage(socket); 14 } 15 }catch(IOException e){ 16 e.printStackTrace(); 17 } 18 } 19 private static void transmitMessage(final Socket socket) { 20 new Thread(){ 21 private Scanner scan; 22 public void run(){ 23 try{ 24 InputStream is=socket.getInputStream(); 25 scan=new Scanner(is); 26 socket.getOutputStream().write("连接成功...\n".getBytes()); 27 }catch(IOException e1){ 28 e1.printStackTrace(); 29 } 30 31 while(true){ 32 String text=scan.nextLine()+"\n"; 33 for(Socket client:clients){ 34 try{ 35 OutputStream out=client.getOutputStream(); 36 out.write(text.getBytes()); 37 out.flush(); 38 }catch(IOException e){ 39 e.printStackTrace(); 40 } 41 } 42 } 43 } 44 }.start(); 45 } 46 }
运行结果:未完成,消息无法发出,故无结果
总结:通过这次综合性的考核,暴露出的问题过于严重,平时学的内容过于死板,不会灵活变通,导致平时课上训练时就会出现只知道这么做,为什么?不知道,也就是不求甚解,由于自己的接收能力差,导 致课上所学内容不能即时消化,但课余时间练习时,又因为不理解,所以只是机械的敲代码,起不到复习效果,并且由于一种畏惧感,在出现错误时,无法修改,因为怕牵一发动全身,最后整个代码乱七八糟,所以出现错误时只是推倒重头再来,改错能力没有得到锻炼,平时所学半知半解,这个会点那个会点,知识碎片化,不能形成体系,做题时出现我知道要用到这个用到那个,怎么用?不知道。 这个畏惧感是我个人目前亟需解决的问题,不只是在这里,因为这个畏惧感在其他方面也给我带来了很多麻烦,不够创实,过于求稳,不求有功但求无过是我的心理状态的真实写照,每次想打破这个畏惧感又会因为自己的鲁莽行为做出令我尴尬的事,甚至后悔的事,从而变回原样。现在我亟需查缺补漏,将过去留下的坑坑一点点填满,还要大量实践,增加自己动手操作能力。
学习内容 | 代码(行) | 博客(字) |
第一次过程性考核 | 30 | 240 |
第二次过程性考核 | 125 | 320 |
第三次过程性考核 | 66 | 300 |
第四次过程性考核 | 164 | 400 |
总计 | 385 | 1260 |