Java利用套接字实现应用程序对数据库的访问
作者:JaydenChang 发布时间:2024-01-15 19:37:47
标签:Java,套接字,数据库,访问
前言
最近在完成软件体系结构上机实验时,遇到一个有点点小难度的选做题,题目信息如下:
利用套接字技术实现应用程序中对数据库的访问。应用程序只是利用套接字连接向服务器发送一个查询的条件,而服务器负责对数据库的查询,然后服务器再将查询的结果利用建立的套接字返回给客户端,如下图所示。
本来吧,选做题,不太想做的,但是考虑到以后工作的方向和后端相关,那还是做吧。
本次实验需要做一个GUI界面和一个连接查询功能,在论坛上借鉴了其他大佬获取网站内容的部分代码,然后自己做了一个及其简陋的swing界面,算是把这个实验完成了。
本次实验项目结构如下
--socketProject
|--Client.java
|--GUI.java
|--SearchInfo.java
|--Server.java
|--ServerThread.java
Client.java
客户端使用dis.readUTF()
时,要注意再发送个字符或者空字符,这里发送end
,表示关闭连接。不然会出现EOFException
。
package socketProject;
import java.io.*;
import java.net.*;
public class Client {
String studentNum = null;
String result = null;
public void setStudentNum(String num) {
this.studentNum = num;
System.out.println("stu: " + studentNum);
}
public void run() throws IOException {
Socket ss = new Socket("127.0.0.1", 8888);
System.out.println("Socket: " + ss);
try {
DataInputStream dis = new DataInputStream(ss.getInputStream());
DataOutputStream dos = new DataOutputStream(ss.getOutputStream());
// the interaction
dos.writeUTF(studentNum); // 向服务器发送学号
dos.flush();
result = dis.readUTF().toString(); // 获得客户端的json字符串
System.out.println(result);
dos.writeUTF("end"); // 不加这句会报错
dos.flush();
if (dos != null)
dos.close();
if (dis != null)
dis.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ss != null)
ss.close();
}
}
// gui界面用于获取json结果
public String getResult() {
return result;
}
}
Server.java
package socketProject;
import java.io.*;
import java.net.*;
public class Server extends Thread {
public static final int PORT = 8888;
// public static void main(String[] args) throws IOException {
public void run() {
try (ServerSocket serverSocket = new ServerSocket(PORT)) {
System.out.println("ServerSocket: " + serverSocket);
try {
while (true) {
Socket socket = serverSocket.accept();
System.out.println("Socket accept: " + socket);
Thread thread = new Thread(new ServerThread(socket));
thread.start(); // 开启一个线程,使之支持接收多个客户端的请求
}
} finally {
serverSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
ServerThread.java
package socketProject;
import java.io.*;
import java.net.*;
public class ServerThread extends Thread {
Socket socket = null;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
while (true) {
String str = dis.readUTF().toString();
String data = new SearchInfo().run(str);
if (str.equals("end"))
break;
dos.writeUTF(data);
}
dos.close();
dis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
SearchInfo.java
package socketProject;
import java.io.*;
import java.net.*;
public class SearchInfo {
public String run(String s) {
String url = "your database interface";
String param = s;
String sendGET = GetUrl(url, param);
return sendGET;
}
public static String GetUrl(String url, String param) {
String result = ""; // define the result str
BufferedReader read = null; // define the access result
try {
URL realUrl = new URL(url + param);
URLConnection connection = realUrl.openConnection();
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 这里补充通用的请求属性
connection.connect(); // 建立实际的连接
read = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
String line;
while ((line = read.readLine()) != null) {
result += line;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (read != null) {// 关闭流
try {
read.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
return result;
}
public String getJSON(String param) {
return param;
}
}
GUI.java
package socketProject;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import javax.swing.*;
public class GUI extends JFrame {
private JButton connectDataBase;
private JLabel entryStudentNum;
private JTextField studentNum;
private JButton sendRequest;
private JLabel showResponseMsg;
private JPanel northPanel;
private JPanel southPanel;
public GUI() {
init();
}
public void init() {
setTitle("没啥技术含量的东西");
// define the component for the window
connectDataBase = new JButton("连接数据库");
entryStudentNum = new JLabel("输入学号");
studentNum = new JTextField();
sendRequest = new JButton("发送");
showResponseMsg = new JLabel();
// add the component to the panel
this.setLayout(new GridLayout(2, 1));
northPanel = new JPanel(new GridLayout(1, 4));
northPanel.add(connectDataBase);
northPanel.add(entryStudentNum);
northPanel.add(studentNum);
northPanel.add(sendRequest);
southPanel = new JPanel(new GridLayout(1, 1));
southPanel.add(showResponseMsg);
setButtons();
this.add(northPanel);
this.add(southPanel);
// initial the window
setBounds(400, 200, 600, 120);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public void setButtons() {
connectDataBase.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 这里初始化服务端
Server server1 = new Server();
Thread th1 = new Thread(server1);
th1.start();
// 这里一定要开启服务端线程,否则在点击此按钮后,整个界面会卡住,无法进行下一步操作
}
});
sendRequest.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Client client1 = new Client();
client1.setStudentNum(studentNum.getText());
// 获取文本框的文字,并赋给客户端的studentNum保存
try {
client1.run();
} catch (IOException e1) {
e1.printStackTrace();
}
showResponseMsg.setText(client1.getResult());
// 将得到的数据显示在界面上
}
});
}
public static void main(String[] args) {
new GUI();
}
}
最终效果如下:
使用时,先点击连接数据库,然后根据学校提供的接口,输入自己的学号,点击发送,即可查询个人信息。
不过由于项目工作区非maven以及未来方向非Java的缘故,没有去深究如何提取json的值 (偷个懒)。
来源:https://www.cnblogs.com/jaydenchang/p/16707986.html
0
投稿
猜你喜欢
- 场景当我提交了本次修改到本地和远程分支后,发现我本次提交还少了一些修改内容,或者说本次修改是完全错误的,然而也push到远程仓库去了。如何回
- 遍历并修改图像像素值在使用opencv处理图像时,有时需要对图像的每个像素点进行处理,比如取反、修改值等操作,就需要通过h和w遍历像素。依然
- 索引是以表列为基础的数据库对象。索引中保存着表中排序的索引列,并且纪录了索引列在数据库表中的物理存储位置,实现了表中数据的逻辑排序。通过索引
- 1、手动调参,但这种方法依赖于大量的经验,而且比较费时。许多情况下,工程师依靠试错法手工调整超参数进行优化,有经验的工程师可以在很大程度上判
- 本文实例讲述了Python设计模式之模板方法模式。分享给大家供大家参考,具体如下:模板方法模式(Template Method Patter
- Composer的基本使用在项目中使用composer.json在项目中使用composer,你需要有一个composer.json文件,此
- python函数的参数类型和返回类型默认为int。如果需要传递一个float值给dll,那么需要指定参数的类型。如果需要返回一个flaot值
- 什么情况下用响应缓冲会提高运行速度?例1、脚本引擎与 HTML 之间的切换频繁,对响应流写操作太多,导致性能下降:<table>
- 定义返回单值def my_abs(x): if x >= 0: return x &
- 第1关:Scatter:散点图(一)编程要求根据以上介绍,在右侧编辑器补充代码,绘制给定数据的散点图,要求:画布大小初始化为宽 1600 像
- 内容摘要合理使用渐变留白网格布局提高字体应用明确而有效的导航设计漂亮、有用的页脚介绍优秀设计和卓越设计之间的区别是比较小的。一般人可能无法解
- 如下所示:<span style="font-size:18px;"></span>import
- 代码如下:<% '隐藏并修改文件的最后修改时间的aspshell '原理:通过FSO可以修改文件的
- 目录一、conftest.py的特点二、conftest.py的使用场景三、conftest.py的生效范围四、conftest.py的的s
- 前言PyGame 是一个专门设计来进行游戏开发设计的 Python 模块,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚,
- 目录一、基础说起(一)实现最简单的窗体二、好戏开始了(一)把灰色设置成透明色(二)放置一个矩形框在canvas上。(三)大家有发现变化吗?三
- 前言本文参考了以下代码Windows系统环境下Python脚本实现全局“划词复制”功能from py
- 一: 基本使用:1:环境的安装:pip install flask-sqlalchemypip install pymysql2:组件初始化
- 本文实例讲述了PHP截取指定图片大小的方法。分享给大家供大家参考。具体分析如下:imagecopyresampled($newim, $im
- 本文实例讲述了Python基于scrapy采集数据时使用代理服务器的方法。分享给大家供大家参考。具体如下:# To authenticate