Java语言程序设计课件 第5章 GUI、网络编程与数据库编程_第1页
Java语言程序设计课件 第5章 GUI、网络编程与数据库编程_第2页
Java语言程序设计课件 第5章 GUI、网络编程与数据库编程_第3页
Java语言程序设计课件 第5章 GUI、网络编程与数据库编程_第4页
Java语言程序设计课件 第5章 GUI、网络编程与数据库编程_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章

GUI、网络编程与数据库编程本章内容随着现代软件开发需求的多样化,图形用户界面(GUI)、网络编程和数据库编程已成为开发者必须掌握的重要技能。本章将重点讲解这些关键领域,帮助学生深入理解并掌握如何在实际项目中应用Java来实现复杂的用户交互、网络通信和数据存取。在接下来的内容中,将通过具体的实验案例,展示如何应用这些知识在实际开发中解决问题,并帮助学生提升开发能力。通过这些案例的学习,学生不仅能够掌握基础知识,还能够将其运用到实际项目中,从而提升开发效率和软件质量。学习目标了解:图形用户界面(GUI)在应用程序中应用场景;计算机网络中常见协议(如TCP/IP、UDP)的基本特点和大致用途;关系型数据库的基本概念、常见类型(如MySQL、Oracle等)。理解:图形用户界面(GUI)在应用程序中的核心作用;常用GUI组件(如按钮、文本框、标签、列表框等)的基本功能和用途;事件驱动编程的概念,掌握事件监听机制的基本原理;GUI布局管理器(如FlowLayout、BorderLayout、GridLayout等)的布局规则和适用场景;计算机网络的基本概念,TCP/IP、UDP的工作原理和区别;关系型数据库的基本操作(CRUD)的含义和作用,以及这些操作在数据库管理中的重要性;JDBC(JavaDatabaseConnectivity)技术的基本原理;如何使用PreparedStatement防止SQL注入。掌握:使用Swing组件创建简单图形界面应用程序的方法;为GUI组件添加事件监听器的方法,能够处理用户输入、按钮单击等常见事件;Java中的网络类库(如

包)的基本使用,能够使用Socket进行客户端和服务器的通信;使用Java编写基于TCP的客户端和服务器程序的方法;通过线程池来管理客户端连接的方法;使用JDBC连接数据库的步骤,执行SQL查询与更新操作,包括创建数据库连接、执行SQL语句、处理查询结果等。CONTENTS目录5.2网络编程5.1图形用户界面(GUI)5.3数据库编程5.1图形用户界面(GUI)图形用户界面主要讲解Swing的常见组件、JavaFX及其常用组件、布局管理器、时间及自定义组件等内容,并且基于这些内容设计一个综合案例。5.1.1GUI的基础知识Java中的图形用户界面(GUI)是通过一组类库和框架来实现的,最常用的GUI库是Swing和JavaFX。这些工具让开发者能够创建跨平台的桌面应用程序,提供各种组件和控件(如按钮、文本框、标签等)来构建用户界面。1.SwingSwing是Java标准库的一部分,属于javax.swing包,提供了丰富的UI组件和布局管理器。Swing提供了跨平台的图形界面,并且所有组件都是轻量级的(与操作系统的原生GUI不直接关联)。常见Swing组件:•JFrame:顶级容器,通常用于创建应用程序窗口。•JPanel:容器,用于组织和布局其他组件。•JButton:按钮。•JTextField:文本输入框。•JLabel:标签,用于显示文本或图像。•JComboBox:下拉框。•JCheckBox:复选框。•JRadioButton:单选按钮。5.1.1GUI的基础知识importjavax.swing.*;publicclassSwingExample{publicstaticvoidmain(String[]args){//创建一个JFrame窗口JFrameframe=newJFrame("SwingGUIExample");frame.setSize(300,200);//设置窗口大小//窗口关闭时退出程序frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//创建一个按钮JButtonbutton=newJButton("ClickMe");button.addActionListener(e->JOptionPane.showMessageDialog(frame,"ButtonClicked!"));//将按钮添加到窗口frame.getContentPane().add(button);//显示窗口frame.setVisible(true);}}2.JavaFXJavaFX是一个功能更强大的GUI库,提供了更现代的用户界面开发功能。它是Java8引入的,并且设计上更加注重图形渲染和多媒体应用。JavaFX提供了更丰富的UI控件、布局管理和动画效果,并且支持CSS样式和JavaScript。JavaFX常见组件:•Stage:表示窗口,是JavaFX应用的顶级容器。•Scene:表示窗口中的内容区域,包含所有的UI元素。•Button:按钮。•Label:标签。•TextField:文本框。•ComboBox:下拉框。•HBox/VBox:水平/垂直布局容器。•Canvas:用于绘图。5.1.1GUI的基础知识importjavafx.application.Application;importjavafx.scene.Scene;importjavafx.scene.control.Button;importjavafx.scene.layout.StackPane;importjavafx.stage.Stage;publicclassJavaFXExampleextendsApplication{publicstaticvoidmain(String[]args){launch(args);//启动应用}@Overridepublicvoidstart(StageprimaryStage){//创建一个按钮Buttonbtn=newButton("ClickMe");btn.setOnAction(e->System.out.println("ButtonClicked!"));2.JavaFXJavaFX是一个功能更强大的GUI库,提供了更现代的用户界面开发功能。它是Java8引入的,并且设计上更加注重图形渲染和多媒体应用。JavaFX提供了更丰富的UI控件、布局管理和动画效果,并且支持CSS样式和JavaScript。JavaFX常见组件:•Stage:表示窗口,是JavaFX应用的顶级容器。•Scene:表示窗口中的内容区域,包含所有的UI元素。•Button:按钮。•Label:标签。•TextField:文本框。•ComboBox:下拉框。•HBox/VBox:水平/垂直布局容器。•Canvas:用于绘图。5.1.1GUI的基础知识//创建布局容器StackPaneroot=newStackPane();root.getChildren().add(btn);//创建场景并设置窗口Scenescene=newScene(root,300,200);primaryStage.setTitle("JavaFXGUIExample");primaryStage.setScene(scene);primaryStage.show();//显示窗口}}3.JavaGUI应用的常见布局管理器JavaGUI应用通常使用布局管理器来控制组件的布局。以下是一些常见的布局管理器:•FlowLayout:将组件按顺序排列,可以设置对齐方式。•BorderLayout:分为五个区域:北、南、东、西和中间。•GridLayout:将组件按网格排列,指定行和列数。•BoxLayout:按垂直或水平方向排列组件。•GridBagLayout:最强大、最灵活的布局管理器,适合复杂的布局。5.1.1GUI的基础知识importjava.awt.*;publicclassBorderLayoutExample{publicstaticvoidmain(String[]args){JFrameframe=newJFrame("BorderLayoutExample");frame.setSize(300,200);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//使用BorderLayout布局frame.setLayout(newBorderLayout());//创建按钮并放置到不同的区域frame.add(newJButton("NorthButton"),BorderLayout.NORTH);frame.add(newJButton("SouthButton"),BorderLayout.SOUTH);frame.add(newJButton("EastButton"),BorderLayout.EAST);frame.add(newJButton("WestButton"),BorderLayout.WEST);frame.add(newJButton("CenterButton"),BorderLayout.CENTER);frame.setVisible(true);}}4.处理事件JavaGUI程序通常需要响应用户的交互事件,如按钮单击、键盘输入、鼠标移动等。事件通常通过监听器(Listener)来处理。5.1.1GUI的基础知识importjavax.swing.*;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;publicclassButtonClickExample{publicstaticvoidmain(String[]args){JFrameframe=newJFrame("ButtonClickExample");frame.setSize(300,200);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JButtonbutton=newJButton("ClickMe");button.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){JOptionPane.showMessageDialog(frame,"Buttonwasclicked!");}});frame.getContentPane().add(button);frame.setVisible(true);}}5.自定义组件JavaGUI提供了自定义组件的能力。可以继承现有的组件类,重写方法来改变组件的行为或外观,甚至可以创建完全自定义的组件。5.1.1GUI的基础知识importjavax.swing.*;importjava.awt.*;publicclassCustomComponentExampleextendsJComponent{@OverrideprotectedvoidpaintComponent(Graphicsg){super.paintComponent(g);g.setColor(Color.RED);g.fillRect(50,50,100,100);//绘制红色矩形}publicstaticvoidmain(String[]args){JFrameframe=newJFrame("CustomComponentExample");frame.setSize(300,200);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//添加自定义组件frame.getContentPane().add(newCustomComponentExample());frame.setVisible(true);}}5.1.2GUI的综合实验案例01使用Swing和JavaFX创建一个简单的学生管理系统界面。02实验目的•理解JavaGUI编程的基本概念,包括布局管理、事件处理和组件使用。•掌握使用Swing和JavaFX创建图形用户界面的基本技能。•通过实现一个综合性的GUI应用,熟悉JavaGUI编程的开发流程。•熟练掌握事件监听、组件布局、文本输入和数据展示等功能的实现。03实验内容•学生管理系统界面应包含以下功能:•显示学生信息(姓名、学号、性别、成绩)。•添加学生信息。•更新学生信息。•删除学生信息。•列表展示学生信息。•使用Swing来实现用户界面并实现事件响应。•使用JavaFX来实现更为现代化的UI设计(如表格显示、数据输入框等)第一部分:Swing界面设计①

创建一个学生管理系统的窗口:•使用JFrame创建主窗口。•设置窗口的大小、标题以及关闭操作。②

添加输入框和标签:•创建JTextField用于输入学生信息(姓名、学号、性别、成绩)。•使用JLabel标签标明每个输入框的功能(例如:姓名、学号、性别、成绩)。③

按钮和事件处理:•使用JButton创建按钮,分别用来“添加学生”“更新学生信息”“删除学生”等。•为每个按钮添加事件监听器(ActionListener),通过事件监听器处理按钮单击事件。④

学生信息展示:•使用JTable显示所有学生信息(姓名、学号、性别、成绩)。•设置表格的列名,并创建一个DefaultTableModel来动态更新表格内容。5.1.2GUI的综合实验案例-实验步骤045.1.2GUI的综合实验案例-实验步骤04importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjavax.swing.table.DefaultTableModel;publicclassStudentManagementSystemextendsJFrame{privateJTextFieldnameField,idField,genderField,gradeField;privateJTabletable;privateDefaultTableModeltableModel;publicStudentManagementSystem(){setTitle("StudentManagementSystem");setSize(500,400);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);5.1.2GUI的综合实验案例-实验步骤04//创建布局setLayout(newBorderLayout());//创建表格tableModel=newDefaultTableModel(newObject[]{"Name","ID","Gender","Grade"},0);table=newJTable(tableModel);add(newJScrollPane(table),BorderLayout.CENTER);//创建输入面板JPanelinputPanel=newJPanel(newGridLayout(5,2));inputPanel.add(newJLabel("Name:"));nameField=newJTextField();inputPanel.add(nameField);5.1.2GUI的综合实验案例-实验步骤04idField=newJTextField();inputPanel.add(idField);inputPanel.add(newJLabel("Gender:"));genderField=newJTextField();inputPanel.add(genderField);inputPanel.add(newJLabel("Grade:"));gradeField=newJTextField();inputPanel.add(gradeField);5.1.2GUI的综合实验案例-实验步骤04//添加按钮JPanelbuttonPanel=newJPanel();JButtonaddButton=newJButton("AddStudent");addButton.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){Stringname=nameField.getText();Stringid=idField.getText();Stringgender=genderField.getText();Stringgrade=gradeField.getText();tableModel.addRow(newObject[]{name,id,gender,grade});}});buttonPanel.add(addButton);add(inputPanel,BorderLayout.NORTH);add(buttonPanel,BorderLayout.SOUTH);}5.1.2GUI的综合实验案例-实验步骤04buttonPanel.add(addButton);add(inputPanel,BorderLayout.NORTH);add(buttonPanel,BorderLayout.SOUTH);}publicstaticvoidmain(String[]args){SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){newStudentManagementSystem().setVisible(true);}});}}(2)第二部分:JavaFX界面设计①

创建主窗口和表格视图:•使用Stage创建窗口,Scene显示内容。•使用TableView组件显示学生数据。②

创建输入框和按钮:•使用TextField用于输入学生的姓名、学号、性别和成绩。•使用Button创建按钮,分别用来“添加学生”“更新学生信息”“删除学生”等。③

事件处理与表格操作:•为按钮添加事件处理代码,将输入框中的数据添加到表格中。•使用ObservableList来存储学生信息,并绑定到TableView上。5.1.2GUI的综合实验案例-实验步骤045.1.2GUI的综合实验案例-实验步骤04importjavafx.application.Application;importjavafx.collections.FXCollections;importjavafx.collections.ObservableList;importjavafx.scene.Scene;importjavafx.scene.control.*;importjavafx.scene.layout.VBox;importjavafx.stage.Stage;publicclassStudentManagementSystemFXextendsApplication{privateTableView<Student>table;privateTextFieldnameField,idField,genderField,gradeField;5.1.2GUI的综合实验案例-实验步骤04publicstaticvoidmain(String[]args){launch(args);}@Overridepublicvoidstart(StageprimaryStage){primaryStage.setTitle("StudentManagementSystem");5.1.2GUI的综合实验案例-实验步骤04//创建表格TableColumn<Student,String>nameColumn=newTableColumn<>("Name");nameColumn.setCellValueFactory(cellData->cellData.getValue().nameProperty());TableColumn<Student,String>idColumn=newTableColumn<>("ID");idColumn.setCellValueFactory(cellData->cellData.getValue().idProperty());TableColumn<Student,String>genderColumn=newTableColumn<>("Gender");genderColumn.setCellValueFactory(cellData->cellData.getValue().genderProperty());TableColumn<Student,String>gradeColumn=newTableColumn<>("Grade");gradeColumn.setCellValueFactory(cellData->cellData.getValue().gradeProperty());table=newTableView<>();table.getColumns().addAll(nameColumn,idColumn,genderColumn,gradeColumn);5.1.2GUI的综合实验案例-实验步骤04//创建输入框nameField=newTextField();nameField.setPromptText("Name");idField=newTextField();idField.setPromptText("StudentID");genderField=newTextField();genderField.setPromptText("Gender");gradeField=newTextField();gradeField.setPromptText("Grade");//创建按钮ButtonaddButton=newButton("AddStudent");addButton.setOnAction(e->addStudent());VBoxvbox=newVBox();vbox.getChildren().addAll(nameField,idField,genderField,gradeField,addButton,table);5.1.2GUI的综合实验案例-实验步骤04//设置场景Scenescene=newScene(vbox,500,400);primaryStage.setScene(scene);primaryStage.show();}privatevoidaddStudent(){Stringname=nameField.getText();Stringid=idField.getText();Stringgender=genderField.getText();Stringgrade=gradeField.getText();5.1.2GUI的综合实验案例-实验步骤04//添加到表格table.getItems().add(newStudent(name,id,gender,grade));//清空输入框nameField.clear();idField.clear();genderField.clear();gradeField.clear();}publicstaticclassStudent{privatefinalSimpleStringPropertyname;privatefinalSimpleStringPropertyid;privatefinalSimpleStringPropertygender;privatefinalSimpleStringPropertygrade;5.1.2GUI的综合实验案例-实验步骤04publicStudent(Stringname,Stringid,Stringgender,Stringgrade){=newSimpleStringProperty(name);this.id=newSimpleStringProperty(id);this.gender=newSimpleStringProperty(gender);this.grade=newSimpleStringProperty(grade);}5.1.2GUI的综合实验案例-实验步骤04publicStringgetName(){returnname.get();}publicStringgetId(){returnid.get();}publicStringgetGender(){returngender.get();}publicStringgetGrade(){returngrade.get();}publicSimpleStringPropertynameProperty(){returnname;}publicSimpleStringPropertyidProperty(){returnid;}publicSimpleStringPropertygenderProperty(){returngender;}publicSimpleStringPropertygradeProperty(){returngrade;}}}5.1.2GUI的综合实验案例--案例小结05学生管理系统展示了基本的图形界面设计,包括输入框、按钮、表格等常见组件。在实现过程中,分别使用了Swing和JavaFX进行界面设计,比较了两者的不同之处。掌握了如何通过事件监听处理用户交互,如何动态更新表格内容,如何使用布局管理器和组件。5.2网络编程网络编程主要讲解通信方式、TCP套接字编程、UDP套接字编程、URL处理及多线程与网络编程等内容,并且基于这些内容设计一个综合案例。5.2网络编程Java中的图形用户界面(GUI)是通过一组类库和框架来实现的,最常用的GUI库是Swing和JavaFX。这些工具让开发者能够创建跨平台的桌面应用程序,提供各种组件和控件(如按钮、文本框、标签等)来构建用户界面。5.2.1网络编程的基础知识Java中的网络编程为开发基于网络的应用提供了强大的支持,主要通过包来实现。这个包提供了多种类,用于构建客户端和服务器应用,处理传输协议、套接字(socket)、URL和网络通信等。通过这些类,Java能够支持各种协议,如TCP/IP、UDP、HTTP等,允许开发者进行高效、可靠的网络通信。1.网络编程概述Java网络编程基于客户端-服务器模型,分为两种主要的通信方式:•面向连接的通信(使用TCP协议):通过Socket实现。•无连接的通信(使用UDP协议):通过DatagramSocket实现。Java网络编程的核心类包括:•Socket:用于客户端套接字,代表与服务器的连接。•ServerSocket:用于服务器端套接字,监听客户端连接。•DatagramSocket:用于基于UDP的无连接通信。•URL和URLConnection:用于处理HTTP请求和响应。•InetAddress:用于解析IP地址与主机名的转换。2.TCP套接字编程(基于Socket和ServerSocket)在TCP网络编程中,客户端与服务器建立连接后,数据可以在连接中双向流动,保证数据的可靠传输。通常使用Socket类在客户端进行连接,使用ServerSocket类在服务器端监听连接。5.2.1网络编程的基础知识(1)客户端代码示例(基于Socket)5.2.1网络编程的基础知识importjava.io.*;import.*;publicclassTCPClient{publicstaticvoidmain(String[]args){try{//创建客户端套接字并连接到服务器Socketsocket=newSocket("localhost",8080);//获取输出流并发送数据OutputStreamoutput=socket.getOutputStream();PrintWriterwriter=newPrintWriter(output,true);writer.println("Hello,Server!");

(1)客户端代码示例(基于Socket)5.2.1网络编程的基础知识//获取输入流并接收数据InputStreaminput=socket.getInputStream();BufferedReaderreader=newBufferedReader(newInputStreamReader(input));Stringresponse=reader.readLine();System.out.println("Serverresponse:"+response);//关闭连接socket.close();}catch(IOExceptionex){ex.printStackTrace();}}}(2)服务器端代码示例(基于ServerSocket)5.2.1网络编程的基础知识importjava.io.*;import.*;publicclassTCPServer{publicstaticvoidmain(String[]args){try{//创建服务器套接字,监听端口8080ServerSocketserverSocket=newServerSocket(8080);System.out.println("Serveriswaitingforclientconnection...");//等待客户端连接Socketsocket=serverSocket.accept();System.out.println("Clientconnected");

(2)服务器端代码示例(基于ServerSocket)5.2.1网络编程的基础知识//获取输入流并接收数据InputStreaminput=socket.getInputStream();BufferedReaderreader=newBufferedReader(newInputStreamReader(input));StringclientMessage=reader.readLine();System.out.println("Clientsays:"+clientMessage);//获取输出流并发送数据OutputStreamoutput=socket.getOutputStream();PrintWriterwriter=newPrintWriter(output,true);writer.println("Hello,Client!");//关闭连接socket.close();serverSocket.close();}catch(IOExceptionex){ex.printStackTrace();}}}(2)服务器端代码示例(基于ServerSocket)5.2.1网络编程的基础知识//获取输入流并接收数据InputStreaminput=socket.getInputStream();BufferedReaderreader=newBufferedReader(newInputStreamReader(input));StringclientMessage=reader.readLine();System.out.println("Clientsays:"+clientMessage);//获取输出流并发送数据OutputStreamoutput=socket.getOutputStream();PrintWriterwriter=newPrintWriter(output,true);writer.println("Hello,Client!");//关闭连接socket.close();serverSocket.close();}catch(IOExceptionex){ex.printStackTrace();}}}3.UDP套接字编程(基于DatagramSocket和DatagramPacket)UDP是一种无连接协议,适合对速度要求较高且能容忍丢包的应用。与TCP不同,UDP不建立连接,数据包通过DatagramSocket发送和接收。5.2.1网络编程的基础知识(1)客户端代码示例(基于DatagramSocket)5.2.1网络编程的基础知识import.*;publicclassUDPClient{publicstaticvoidmain(String[]args){try{DatagramSocketsocket=newDatagramSocket();Stringmessage="Hello,Server!";InetAddressserverAddress=InetAddress.getByName("localhost");//发送数据包到服务器DatagramPacketpacket=newDatagramPacket(message.getBytes(),message.length(),serverAddress,9876);socket.send(packet);(1)客户端代码示例(基于DatagramSocket)5.2.1网络编程的基础知识//接收服务器响应byte[]buffer=newbyte[1024];DatagramPacketresponsePacket=newDatagramPacket(buffer,buffer.length);socket.receive(responsePacket);Stringresponse=newString(responsePacket.getData(),0,responsePacket.getLength());System.out.println("Serverresponse:"+response);socket.close();}catch(Exceptionex){ex.printStackTrace();}}}(2)服务器端代码示例(基于DatagramSocket)5.2.1网络编程的基础知识import.*;publicclassUDPServer{publicstaticvoidmain(String[]args){try{DatagramSocketsocket=newDatagramSocket(9876);byte[]buffer=newbyte[1024];//接收数据包DatagramPacketpacket=newDatagramPacket(buffer,buffer.length);socket.receive(packet);StringclientMessage=newString(packet.getData(),0,packet.getLength());System.out.println("Clientsays:"+clientMessage);(2)服务器端代码示例(基于DatagramSocket)5.2.1网络编程的基础知识//发送响应Stringresponse="Hello,Client!";DatagramPacketresponsePacket=newDatagramPacket(response.getBytes(),response.length(),packet.getAddress(),packet.getPort());socket.send(responsePacket);socket.close();}catch(Exceptionex){ex.printStackTrace();}}}4.URL处理Java提供了对URL处理的支持,可以通过URL和URLConnection类访问和处理HTTP请求和响应。5.2.1网络编程的基础知识importjava.io.*;import.*;publicclassURLReader{publicstaticvoidmain(String[]args){try{//创建URL对象URLurl=newURL("");BufferedReaderin=newBufferedReader(newInputStreamReader(url.openStream()));4.URL处理Java提供了对URL处理的支持,可以通过URL和URLConnection类访问和处理HTTP请求和响应。5.2.1网络编程的基础知识//读取内容StringinputLine;while((inputLine=in.readLine())!=null){System.out.println(inputLine);}in.close();}catch(IOExceptione){e.printStackTrace();}}}5.多线程与网络编程在服务器端,通常需要多线程来同时处理多个客户端的连接。可以通过创建新线程来为每个客户端提供服务。例如,在TCP服务器中,每次接收到客户端连接时都创建一个新线程来处理与该客户端的通信。5.2.1网络编程的基础知识importjava.io.*;import.*;publicclassMultiThreadedServer{publicstaticvoidmain(String[]args){try{ServerSocketserverSocket=newServerSocket(8080);System.out.println("Serveriswaitingforclientconnections...");while(true){Socketsocket=serverSocket.accept();System.out.println("Clientconnected");//为每个客户端创建一个新线程处理newClientHandler(socket).start();}}catch(IOExceptionex){ex.printStackTrace();}}}5.多线程与网络编程在服务器端,通常需要多线程来同时处理多个客户端的连接。可以通过创建新线程来为每个客户端提供服务。例如,在TCP服务器中,每次接收到客户端连接时都创建一个新线程来处理与该客户端的通信。5.2.1网络编程的基础知识classClientHandlerextendsThread{privateSocketsocket;publicClientHandler(Socketsocket){this.socket=socket;}@Overridepublicvoidrun(){try{//获取输入流并接收数据InputStreaminput=socket.getInputStream();BufferedReaderreader=newBufferedReader(newInputStreamReader(input));Stringmessage=reader.readLine();System.out.println("Clientsays:"+message);}5.多线程与网络编程在服务器端,通常需要多线程来同时处理多个客户端的连接。可以通过创建新线程来为每个客户端提供服务。例如,在TCP服务器中,每次接收到客户端连接时都创建一个新线程来处理与该客户端的通信。5.2.1网络编程的基础知识//获取输出流并发送数据OutputStreamoutput=socket.getOutputStream();PrintWriterwriter=newPrintWriter(output,true);writer.println("Hello,Client!");socket.close();}catch(IOExceptionex){ex.printStackTrace();}}}5.2.2网络编程的综合实验案例01实验名称:基于TCP的聊天室系统设计与实现。02实验目的•理解并掌握Java中TCP套接字编程的基本原理和方法。•学习如何使用Socket和ServerSocket实现客户端和服务器之间的通信。•学习如何通过多线程实现一个支持多个用户同时聊天的聊天室系统。•理解网络编程中的输入输出流、线程管理和异常处理等关键概念。•通过实际的编程实践,提升网络通信和多线程编程的能力。5.2.2网络编程的综合实验案例03实验内容本实验要求设计并实现一个基于TCP的多人聊天室系统。具体功能如下:(1)客户端功能启动客户端后,用户可以输入昵称并连接到聊天室服务器。用户可以发送文本消息,消息会被转发给聊天室中的所有其他用户。支持显示接收到的消息以及自己发送的消息。用户可以退出聊天室。(2)服务器端功能服务器监听特定端口,等待客户端的连接请求。服务器可以接收来自客户端的消息并转发给所有连接的客户端。服务器管理多个客户端连接,并能处理客户端的退出。(3)多线程支持服务器端使用多线程处理每个客户端的连接,确保服务器能同时处理多个用户的请求。每个客户端连接建立后,服务器会为其创建一个独立的处理线程。(1)第一部分:服务器端设计①

创建服务器类:•创建一个ServerSocket实例,用于监听客户端的连接。•使用一个List<PrintWriter>存储所有连接客户端的输出流,以便向所有客户端广播消息。②

多线程处理客户端:•每次接受到一个客户端连接,创建一个新的线程来处理该客户端的消息。•该线程通过输入流接收客户端消息,并通过输出流将消息广播给所有已连接的客户端。③

广播消息:服务器通过维护的客户端输出流列表将每个接收到的消息广播给所有连接的客户端。④

服务器端代码实现:5.2.2网络编程的综合实验案例-实验步骤045.2.2网络编程的综合实验案例-实验步骤04importjava.io.*;import.*;importjava.util.*;importjava.util.concurrent.*;publicclassChatServer{privatestaticfinalintPORT=12345;privatestaticSet<PrintWriter>clientWriters=ConcurrentHashMap.newKeySet();publicstaticvoidmain(String[]args){System.out.println("Chatserverstarted...");5.2.2网络编程的综合实验案例-实验步骤04try(ServerSocketserverSocket=newServerSocket(PORT)){while(true){newClientHandler(serverSocket.accept()).start();}}catch(IOExceptione){e.printStackTrace();}}5.2.2网络编程的综合实验案例-实验步骤04//处理客户端请求的线程privatestaticclassClientHandlerextendsThread{privateSocketsocket;privatePrintWriterout;privateBufferedReaderin;publicClientHandler(Socketsocket){this.socket=socket;}5.2.2网络编程的综合实验案例-实验步骤04@Overridepublicvoidrun(){try{//设置输入和输出流in=newBufferedReader(newInputStreamReader(socket.getInputStream()));out=newPrintWriter(socket.getOutputStream(),true);//将输出流添加到集合中,以便广播消息synchronized(clientWriters){clientWriters.add(out);}

5.2.2网络编程的综合实验案例-实验步骤04Stringmessage;while((message=in.readLine())!=null){System.out.println("Received:"+message);//广播消息给所有客户端synchronized(clientWriters){for(PrintWriterwriter:clientWriters){writer.println(message);}}}5.2.2网络编程的综合实验案例-实验步骤04}catch(IOExceptione){e.printStackTrace();}finally{try{socket.close();synchronized(clientWriters){clientWriters.remove(out);}}catch(IOExceptione){e.printStackTrace();}}}}}(2)第二部分:客户端设计①

创建客户端类:•客户端启动时,要求用户输入昵称,并通过Socket连接到服务器。•用户输入的消息通过PrintWriter发送到服务器,服务器将消息转发给所有其他客户端。•使用BufferedReader读取从服务器返回的消息,并在控制台显示。②

多线程处理用户输入和接收消息:•一个线程用于接收并显示从服务器广播的消息。•另一个线程用于读取用户输入并将其发送给服务器。③

客户端代码实现:5.2.2网络编程的综合实验案例-实验步骤045.2.2网络编程的综合实验案例-实验步骤04importjava.io.*;import.*;publicclassChatClient{privatestaticfinalStringSERVER_ADDRESS="localhost";privatestaticfinalintSERVER_PORT=12345;publicstaticvoidmain(String[]args){try(Socketsocket=newSocket(SERVER_ADDRESS,SERVER_PORT);PrintWriterout=newPrintWriter(socket.getOutputStream(),true);BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream()));BufferedReaderuserInput=newBufferedReader(newInputStreamReader(System.in))){5.2.2网络编程的综合实验案例-实验步骤04//获取昵称System.out.print("Enteryournickname:");Stringnickname=userInput.readLine();out.println(nickname);//发送昵称//创建线程接收服务器消息newThread(newMessageReceiver(in)).start();//主线程发送用户输入的消息Stringmessage;while((message=userInput.readLine())!=null){out.println(message);`//发送消息到服务器}}catch(IOExceptione){e.printStackTrace();}}5.2.2网络编程的综合实验案例-实验步骤04//接收并显示来自服务器的消息privatestaticclassMessageReceiverimplementsRunnable{privateBufferedReaderin;publicMessageReceiver(BufferedReaderin){this.in=in;}@Overridepublicvoidrun(){try{Stringmessage;while((message=in.readLine())!=null){System.out.println(message);//显示消息}}catch(IOExceptione){e.printStackTrace();}}}}(3)第三部分:实验运行①

启动服务器:运行ChatServer类,服务器会开始监听端口12345。②

启动客户端:•运行多个ChatClient实例,输入不同的昵称,连接到服务器。•各个客户端可以发送和接收消息,服务器会将消息广播给所有已连接的客户端。③

测试功能:•验证多个客户端可以同时发送和接收消息。•确保服务器能够处理多个客户端的连接,并将消息正确地广播给所有连接的客户端。•验证客户端退出时,服务器能正确关闭该客户端的连接。5.2.2网络编程的综合实验案例-实验步骤045.2.2网络编程的综合实验案例--案例小结05•理解并掌握Java中的TCP套接字编程,通过Socket和ServerSocket实现客户端与服务器的通信。•熟悉如何使用多线程处理多个客户端连接,使得服务器可以同时处理多个客户端请求。•掌握如何在网络编程中处理输入输出流,了解消息的传输和广播机制。•深刻理解并运用Java网络编程中的线程管理、异常处理和输入输出流等重要概念。5.3数据库编程数据库编程主要讲解JDBC的基本步骤、事务管理、增删改查操作等内容,并且基于这些内容设计一个综合案例。5.3.1数据库编程的基础知识Java中的数据库编程通常依赖于JDBC(Javadatabaseconnectivity),它提供了一种连接、查询、更新、管理数据库的标准API。JDBC允许Java程序与数据库进行通信,不依赖于具体的数据库实现。1.JDBC概述JDBC是Java连接数据库的标准API,它为Java应用程序提供与关系型数据库(如MySQL、PostgreSQL、Oracle等)的连接、查询和操作功能。主要包括以下几种操作:•连接数据库(Connection)。•创建SQL语句(Statement)。•执行SQL语句(executeQuery、executeUpdate)。•处理结果集(ResultSet)。•关闭连接(close)。5.3.1数据库编程的基础知识2.JDBC的基本步骤①

加载数据库驱动:通过Class.forName()方法加载数据库驱动程序。例如,MySQL驱动是com.mysql.cj.jdbc.Driver。②

建立数据库连接:使用DriverManager.getConnection()方法创建与数据库的连接。③

创建SQL语句:使用Statement或PreparedStatement类来创建SQL语句。④

执行SQL语句:使用executeQuery()方法执行查询操作,executeUpdate()执行更新操作。⑤

处理查询结果:使用ResultSet获取查询结果。⑥

关闭资源:关闭Connection、Statement、ResultSet等资源,避免资源泄露。3.JDBC示例(1)连接MySQL数据库并查询数据假设要连接一个名为testdb的MySQL数据库并执行简单的查询操作。5.3.1数据库编程的基础知识importjava.sql.*;publicclassJDBCExample{publicstaticvoidmain(String[]args){//数据库连接信息Stringurl="jdbc:mysql://localhost:3306/testdb";Stringusername="root";Stringpassword="password";//SQL查询语句Stringquery="SELECT*FROMusers";3.JDBC示例(1)连接MySQL数据库并查询数据假设要连接一个名为testdb的MySQL数据库并执行简单的查询操作。5.3.1数据库编程的基础知识//连接对象、语句对象、结果集对象Connectionconnection=null;Statementstatement=null;ResultSetresultSet=null;try{//1.加载数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.创建连接connection=DriverManager.getConnection(url,username,password);3.JDBC示例(1)连接MySQL数据库并查询数据假设要连接一个名为testdb的MySQL数据库并执行简单的查询操作。5.3.1数据库编程的基础知识//3.创建Statement对象statement=connection.createStatement();//4.执行查询并获取结果集resultSet=statement.executeQuery(query);//5.处理结果集while(resultSet.next()){intid=resultSet.getInt("id");Stringname=resultSet.getString("name");Stringemail=resultSet.getString("email");System.out.println(id+","+name+","+email);}3.JDBC示例(1)连接MySQL数据库并查询数据假设要连接一个名为testdb的MySQL数据库并执行简单的查询操作。5.3.1数据库编程的基础知识}catch(SQLException|ClassNotFoundExceptione){e.printStackTrace();}finally{//6.关闭连接资源try{if(resultSet!=null)resultSet.close();if(statement!=null)statement.close();if(connection!=null)connection.close();}catch(SQLExceptione){e.printStackTrace();}}}}(2)使用PreparedStatement插入数据5.3.1数据库编程的基础知识importjava.sql.*;publicclassInsertDataExample{publicstaticvoidmain(String[]args){Stringurl="jdbc:mysql://localhost:3306/testdb";Stringusername="root";Stringpassword="password";StringinsertSQL="INSERTINTOusers(name,email)VALUES(?,?)";Connectionconnection=null;PreparedStatementpreparedStatement=null;try{//1.加载数据库驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.创建连接connection=DriverManager.getConnection(url,username,password);(2)使用PreparedStatement插入数据5.3.1数据库编程的基础知识//3.创建PreparedStatement对象preparedStatement=connection.prepareStatement(insertSQL);preparedStatement.setString(1,"JohnDoe");preparedStatement.setString(2,"johndoe@");//4.执行插入操作introwsAffected=preparedStatement.executeUpdate();Syste

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论