返回顶部
首页 > 资讯 > 后端开发 > Python >Java利用套接字实现应用程序对数据库的访问
  • 153
分享到

Java利用套接字实现应用程序对数据库的访问

2024-04-02 19:04:59 153人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录前言Client.javaServer.javaServerThread.javaSearchInfo.javaGUI.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的值 (偷个懒)。

以上就是Java利用套接字实现应用程序对数据库的访问 的详细内容,更多关于Java套接字的资料请关注编程网其它相关文章!

--结束END--

本文标题: Java利用套接字实现应用程序对数据库的访问

本文链接: https://lsjlt.com/news/167905.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java利用套接字实现应用程序对数据库的访问
    目录前言Client.javaServer.javaServerThread.javaSearchInfo.javaGUI.java前言 最近在完成软件体系结构上机实验时,遇到一个有...
    99+
    2024-04-02
  • Java swing实现应用程序对数据库的访问问题
    用Java swing实现一个套接字访问数据库 最近在完成软件体系结构上机实验时,遇到一个有点点小难度的选做题,题目信息如下: 利用套接字技术实现应用程序中对数据库的访问。应用程序只...
    99+
    2024-04-02
  • C#利用反射实现多数据库访问
    在上一篇文章中讲解了什么是反射,以及利用反射可以获取程序集里面的哪些内容。在平时的项目中,可能会遇到项目需要使用多种数据库,这篇文章中将会讲解如何利用反射实现访问多种数据库。 项目整...
    99+
    2024-04-02
  • C#使用ADO.Net连接数据库与DbProviderFactory实现多数据库访问
    一、ADO.Net数据库连接字符串 1、OdbcConnection(System.Data.Odbc) (1)SQL Sever 标准安全:" Driver={SQL S...
    99+
    2024-04-02
  • Java中怎么利用JDBC和DBCP访问数据库
    本篇文章为大家展示了Java中怎么利用JDBC和DBCP访问数据库,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。JDBC:Connection conn&...
    99+
    2024-04-02
  • Java中怎么利用JDBC实现数据库连接
    Java中怎么利用JDBC实现数据库连接,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 JDBC:...
    99+
    2024-04-02
  • C#怎么使用ADO.Net连接数据库与实现多数据库访问
    本文小编为大家详细介绍“C#怎么使用ADO.Net连接数据库与实现多数据库访问”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么使用ADO.Net连接数据库与实现多数据库访问”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-06-30
  • JavaScript中怎么利用DOM实现数据访问
    本篇文章给大家分享的是有关JavaScript中怎么利用DOM实现数据访问,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。通过JavaScrip...
    99+
    2024-04-02
  • 数据库连接池:数据库应用程序优化的基石
    连接池的优势 减少连接建立时间:建立数据库连接是一项耗时的操作。通过重用已建立的连接,连接池可以消除这个开销,从而提高应用程序的响应时间。 提高并发性:连接池可以管理大量连接,允许多个客户端同时访问数据库。这对于高并发应用程序至关重要,...
    99+
    2024-04-02
  • 数据库连接池实战指南:优化数据库访问,提高应用效率!
    引言 数据库连接是现代应用中至关重要的组成部分,但频繁的数据库连接和断开操作会严重影响应用性能。数据库连接池通过维护预先建立的数据库连接集合,有效地解决了这一问题,大幅提升了数据库访问效率和应用整体性能。 数据库连接池的工作原理 数据库...
    99+
    2024-03-03
    数据库连接池、数据库访问、应用性能优化、连接复用、资源管理
  • 如何利用VB.NET数据库访问方法封装到类实现
    这期内容当中小编将会给大家带来有关如何利用VB.NET数据库访问方法封装到类实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。我们都知道,线程要执行的方法不能接受任何参数,如果要传入方法特定条件,可以将方...
    99+
    2023-06-17
  • 使用Canal实现PHP应用程序与MySQL数据库的实时数据同步
    目录canal简介安装配置启动安装php与canal连接的组件简单示例结果展示canal简介 由阿里巴巴开源 github地址:https://github.com/alibaba/...
    99+
    2023-05-16
    PHP Canal PHP Canal数据同步
  • 驾驭数据库连接池:实现高效、可靠的数据库访问
    数据库连接池的优点 减少开销:创建和销毁数据库连接是非常耗时的。连接池通过重用现有连接,消除这种开销,从而提高性能。 可伸缩性:连接池可以根据应用程序的需求自动调整连接数量,从而实现可伸缩性。 可靠性:连接池可以检测并替换故障连接,确保...
    99+
    2024-04-02
  • 如何解析Flex应用程序连接数据的实现
    如何解析Flex应用程序连接数据的实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。因为Flex应用程序并不直接与一个数据库进行连接,所以你需要使用某种类型的服...
    99+
    2023-06-17
  • 利用Go语言连接数据库:提高应用程序性能与效率
    使用Go语言连接数据库:提升应用程序的性能和效率 随着应用程序的发展和用户量的增加,对数据的存储和处理变得越来越重要。为了提高应用程序的性能和效率,合理地连接和操作数据库是至关重要的一环。 Go语言作为一种快...
    99+
    2024-01-23
    性能 Go语言 连接数据库
  • 利用java怎么对oracle或mysql数据库进行连接
    这篇文章给大家介绍利用java怎么对oracle或mysql数据库进行连接,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。具体方法如下:package com.nuo.test.Connection;import jav...
    99+
    2023-05-31
    java oracle mysql
  • 连接池:数据库应用程序性能的救星
    数据库应用程序是现代软件体系结构的重要组成部分。它们依赖于与数据库的稳定连接,以执行数据查询和更新操作。然而,频繁建立和关闭数据库连接会极大地损害应用程序的性能。连接池提供了应对这一挑战的有效解决方案。 连接池的工作原理 连接池是一种服务...
    99+
    2024-04-02
  • Java利用Jackson序列化实现数据脱敏
    几天前使用了Jackson对数据的自定义序列化。突发灵感,利用此方法来简单实现接口返回数据脱敏,故写此文记录。 核心思想是利用Jackson的StdSerializer,@JsonS...
    99+
    2024-04-02
  • 如何使用Memcache提升PHP应用程序的数据访问速度?
    如何使用Memcache提升PHP应用程序的数据访问速度?概述:在开发PHP应用程序时,数据访问速度是一个重要的考量因素。当应用程序需要频繁读取数据库或进行复杂的计算时,可能会导致性能下降。为了解决这个问题,可以使用Memcache来缓存数...
    99+
    2023-11-07
    PHP Memcache 数据访问速度
  • 如何利用Java日志记录系统,实现对应用程序的深度监控?
    Java日志记录系统是一种常见的日志记录方式,它可以帮助我们记录应用程序运行时的各种信息,包括错误信息、调试信息、性能信息等等。通过利用Java日志记录系统,我们可以实现对应用程序的深度监控,从而更好地了解应用程序的运行状态,及时发现和解决...
    99+
    2023-11-09
    同步 numy 日志
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作