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

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

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

本次实验需要做一个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. 8. SparkSQL综合作业

    综合练习:学生课程分数 网盘下载sc.txt文件,分别创建RDD.DataFrame和临时表/视图: 分别用RDD操作.DataFrame操作和spark.sql执行SQL语句实现以下数据分析: 总共 ...

  2. BUCK 电路PSIM仿真模型搭建之一 (PI模块稳定性分析)

    1.  利用PI 模块仿真BUCK 电路电流环 在调制通道上未加入延迟环节时,无论KP, KI 参数如何调整系统都是稳定的 仿真结果: 在调制通道上引入 一个开关周期的延迟 系统出现明显的震荡情况,说 ...

  3. ooday04 Java_面向对象_重写_static

    方法的重写(override/overriding):重新写.覆盖 发生在父子类中,方法名相同,参数列表相同 重写方法被调用时,看对象的类型------------这是规定,记住就OK 当派生类觉得超 ...

  4. kube-shell安装

    1.开源项目kube-shell可以为kubectl提供自动的命令提示和补全,对于初学kubernetes比较友好. https://github.com/cloudnativelabs/kube-s ...

  5. mysql 存储过程和触发器

    存储过程 -- 声明结束符 -- 创建存储过程 DELIMITER $ -- 声明存储过程的结束符 CREATE PROCEDURE pro_test() --存储过程名称(参数列表) BEGIN - ...

  6. YII总结学习7(在一个视图中显示另外一个视图)

    controller\hello <?php namespace app\controllers; use yii\web\Controller; class helloController e ...

  7. 万字长文:从计算机本源深入探寻volatile和Java内存模型

    万字长文:从计算机本源深入探寻volatile和Java内存模型 前言 在本篇文章当中,主要给大家深入介绍Volatile关键字和Java内存模型.在文章当中首先先介绍volatile的作用和Java ...

  8. 小白之Python基础(五)

    使用dict和set 1.dict :是direction字典的缩写 1) 通过{ }创建,使用健-值(key-value)存储:用"键值对"表示映射关系,例如 {名字:对应的成绩 ...

  9. 如何在本地配置lemonlime和使用lemonlime测试交互题

    如何在本地配置\(lemonlime\)和使用\(lemonlime\)测试交互题 \(lemonlime\)下载地址链接,提取码ae3z 点开\(lemonlime.exe\)然后编译器选择\(gc ...

  10. WPF主窗体调用 User32的SetWindowPos 设置窗体置顶会导致与其他窗体抢夺焦点的问题

    最近发现:自己开发的窗体应用,在二级弹窗或者提示框弹出的时候,交替点击窗体和窗体外(相当于窗体交替的获取焦点和失去焦点),都会导致其他的应用一闪一闪的. 经过排查,是由于该窗体由于部分因素考虑,用了  ...