最近在完成软件体系结构上机实验时,遇到一个有点点小难度的选做题,题目信息如下:

利用套接字技术实现应用程序中对数据库的访问。应用程序只是利用套接字连接向服务器发送一个查询的条件,而服务器负责对数据库的查询,然后服务器再将查询的结果利用建立的套接字返回给客户端,如下图所示。

本来吧,选做题,不太想做的,但是考虑到以后工作的方向和后端相关,那还是做吧。

本次实验需要做一个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的值 (偷个懒)。

参考链接

Java请求一个URL,获取返回的数据_杜岚特的博客-CSDN博客

java.io.datainputstream.readunsignedshort_socket编程报异常java.io.EOFException_窦月汐的博客-CSDN博客

Java套接字实现应用程序对数据库的访问的更多相关文章

  1. Java套接字

    前言: 本文补充一下Java关于套接字方面的内容,因为其应用相对比较简单,所以下面介绍两个程序实例. ------------------------------------------------- ...

  2. [置顶] Java套接字Socket编程

    1)概念 网络编程基本模型就客户端到服务器的模型,也就是我们常见的C/S模型.简单的说就是两个进程间相互通信的过程.即通信双方一方作为服务器等待客户端提出请求并给以回应,另一方作为客户端向服务器提出请 ...

  3. java套接字(socket)实例

    客户端socket 流程: 1.连接远程主机 2.发送数据 3.接收数据 4.关闭流与socket连接 实例: import java.io.*; import java.net.Socket; im ...

  4. Java套接字Socket编程--TCP参数

    在Java的Socket中,主要包含了以下可设置的TCP参数. 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长 ...

  5. 原始套接字--简易ping程序

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> ...

  6. python socket 套接字编程 单进程服务器 实现多客户端访问

    服务器: import socket #单进程服务器 实现多客户端访问 IO复用 #吧所有的客户端套接字 放在一个列表里面,一次又一次的便利过滤 server = socket.socket(sock ...

  7. 用java套接字创建HTTP客户与服务器程序

    最近再学习java的web编程,发现用java创建一个小的服务器和客户端是如此的简单,引用经典图书<Tomcat与Java Web开发技术详解(第二版)>(孙卫琴) 根据书中案例敲代码自己 ...

  8. Java套接字socket编程笔记

    相对于C和C++来说,Java中的socket编程是比较简单的,比较多的细节都已经被封装好了,每次创建socket连接只需要知道地址和端口即可. 在了解socket编程之前,我们先来了解一下读写数据的 ...

  9. java套接字实现接口访问

    是学校博客上的:http://blog.csdn.net/z69183787/article/details/17580325

随机推荐

  1. Microsoft Office Visio Professional 之包图

    1 包的概念 1.1 包的定义 包(Package): 是UML用来组织模型元素的模型元素. 包中可以包含类.接口.构件.用例.结点.活动.状态.包等其他模型元素. 包是对软件模型进行分解.组织的有效 ...

  2. NC13328 倒水

    NC13328 倒水 题目 题目描述 有一个大水缸,里面水的温度为 \(T\) 单位,体积为 \(C\) 升.另有 \(n\) 杯水(假设每个杯子的容量是无限的),每杯水的温度为 \(t[i]\) 单 ...

  3. namespace_std 杂题选讲

    CF1458C Latin Square 2021 EC Final C. Random Shuffle [THUPC2021] 混乱邪恶 [JOISC2022] 制作团子 3 2022 集训队互测 ...

  4. 一文讲明白K8S各核心架构组件

    目录 一.写在前面 二.K8S为我们提供了怎样的能力 三.架构 3.1.MasterNode 3.2.WorkerNode 四.核心组件 4.1.ApiServer 4.1.1.概述 4.1.2.是集 ...

  5. Unity3D学习笔记7——GPU实例化(2)

    目录 1. 概述 2. 详论 2.1. 实现 2.2. 解析 3. 参考 1. 概述 在上一篇文章<Unity3D学习笔记6--GPU实例化(1)>详细介绍了Unity3d中GPU实例化的 ...

  6. for循环 --和复合赋值

    阶乘 1.n!=1x2x3x4x...xn 2.写出一个程序,让用户输入n,然后计算输出n! *变量: *显然读用户的输入需要一个int的n,然后计算的结果需要用一个变量保存,可以是int的facto ...

  7. docker for window WSL 2 installation is incomplete 错误,导致docker无法启动

    1.错误截图如下: 2.错误原因:由于wsl2版本旧,根据提示让我们手动更新包,去微软官网下载最新wsl2后,安装完成重启即可解决. 3.下载地址:download地址

  8. 前 K 个高频元素问题

    前 K 个高频元素问题 作者:Grey 原文地址: 前 K 个高频元素问题 题目描述 LeetCode 347. Top K Frequent Elements 思路 第一步,针对数组元素封装一个数据 ...

  9. 【PostgreSQL 】PostgreSQL 15对distinct的优化

    示例表 table t_ex; c1 | c2 ----+---- 2 | B 4 | C 6 | A 2 | C 4 | B 6 | B 2 | A 4 | B 6 | C 2 | C 以下SQL语 ...

  10. Solution -「树状数组」 题目集合

    T1 冒泡排序 题目描述 clj 想起当年自己刚学冒泡排序时的经历,不禁思绪万千 当年,clj 的冒泡排序(伪)代码是这样的: flag=false while (not flag): flag=tr ...