最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java利用套接字實(shí)現(xiàn)應(yīng)用程序?qū)?shù)據(jù)庫的訪問

 更新時(shí)間:2022年09月19日 16:37:34   作者:JaydenChang  
所謂套接字(Socket),就是對網(wǎng)絡(luò)中不同主機(jī)上的應(yīng)用進(jìn)程之間進(jìn)行雙向通信的端點(diǎn)的抽象。這篇文章主要介紹了Java利用套接字實(shí)現(xiàn)應(yīng)用程序?qū)?shù)據(jù)庫的訪問,感興趣的可以了解一下

前言

最近在完成軟件體系結(jié)構(gòu)上機(jī)實(shí)驗(yàn)時(shí),遇到一個有點(diǎn)點(diǎn)小難度的選做題,題目信息如下:

利用套接字技術(shù)實(shí)現(xiàn)應(yīng)用程序中對數(shù)據(jù)庫的訪問。應(yīng)用程序只是利用套接字連接向服務(wù)器發(fā)送一個查詢的條件,而服務(wù)器負(fù)責(zé)對數(shù)據(jù)庫的查詢,然后服務(wù)器再將查詢的結(jié)果利用建立的套接字返回給客戶端,如下圖所示。

本來吧,選做題,不太想做的,但是考慮到以后工作的方向和后端相關(guān),那還是做吧。

本次實(shí)驗(yàn)需要做一個GUI界面和一個連接查詢功能,在論壇上借鑒了其他大佬獲取網(wǎng)站內(nèi)容的部分代碼,然后自己做了一個及其簡陋的swing界面,算是把這個實(shí)驗(yàn)完成了。

本次實(shí)驗(yàn)項(xiàng)目結(jié)構(gòu)如下

--socketProject
    |--Client.java
    |--GUI.java
    |--SearchInfo.java
    |--Server.java
    |--ServerThread.java

Client.java

客戶端使用dis.readUTF()時(shí),要注意再發(fā)送個字符或者空字符,這里發(fā)送end,表示關(guān)閉連接。不然會出現(xiàn)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); // 向服務(wù)器發(fā)送學(xué)號
            dos.flush();
            result = dis.readUTF().toString(); // 獲得客戶端的json字符串
            System.out.println(result);
            dos.writeUTF("end"); // 不加這句會報(bào)錯
            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結(jié)果
    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)");
            // 這里補(bǔ)充通用的請求屬性
            connection.connect(); // 建立實(shí)際的連接
            
            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) {// 關(guān)閉流
                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("沒啥技術(shù)含量的東西");
        // define the component for the window
        connectDataBase = new JButton("連接數(shù)據(jù)庫");
        entryStudentNum = new JLabel("輸入學(xué)號");
        studentNum = new JTextField();
        sendRequest = new JButton("發(fā)送");
        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) {
                // 這里初始化服務(wù)端
                Server server1 = new Server();
                Thread th1 = new Thread(server1);
                th1.start();
                // 這里一定要開啟服務(wù)端線程,否則在點(diǎn)擊此按鈕后,整個界面會卡住,無法進(jìn)行下一步操作
            }
        });

        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());
                // 將得到的數(shù)據(jù)顯示在界面上
            }
        });
    }

    public static void main(String[] args) {
        new GUI();
    }
}

最終效果如下:

使用時(shí),先點(diǎn)擊連接數(shù)據(jù)庫,然后根據(jù)學(xué)校提供的接口,輸入自己的學(xué)號,點(diǎn)擊發(fā)送,即可查詢個人信息。

不過由于項(xiàng)目工作區(qū)非maven以及未來方向非Java的緣故,沒有去深究如何提取json的值 (偷個懶)。

以上就是Java利用套接字實(shí)現(xiàn)應(yīng)用程序?qū)?shù)據(jù)庫的訪問 的詳細(xì)內(nèi)容,更多關(guān)于Java套接字的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java?Spring?事件監(jiān)聽詳情解析

    Java?Spring?事件監(jiān)聽詳情解析

    這篇文章主要介紹了Java?Spring?事件監(jiān)聽詳情解析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • Java基礎(chǔ)之如何學(xué)好Java

    Java基礎(chǔ)之如何學(xué)好Java

    這篇文章已經(jīng)是有數(shù)年“網(wǎng)齡”的老文,不過在今天看來仍然經(jīng)典。如何學(xué)習(xí)java?本篇文章可以說也是面對編程初學(xué)者的一篇指導(dǎo)文章,其中對于如何學(xué)習(xí)Java的步驟的介紹,很多也適用于開發(fā)領(lǐng)域其他技能的學(xué)習(xí)。
    2014-10-10
  • SpringBoot返回Json對象報(bào)錯(返回對象為空{(diào)})

    SpringBoot返回Json對象報(bào)錯(返回對象為空{(diào)})

    本文主要介紹介紹了SpringBoot返回Json對象報(bào)錯(返回對象為空{(diào)}),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Springboot攔截器如何獲取@RequestBody參數(shù)

    Springboot攔截器如何獲取@RequestBody參數(shù)

    這篇文章主要介紹了Springboot攔截器如何獲取@RequestBody參數(shù)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 教你怎么在IDEA中創(chuàng)建java多模塊項(xiàng)目

    教你怎么在IDEA中創(chuàng)建java多模塊項(xiàng)目

    這篇文章主要介紹了教你怎么在IDEA中創(chuàng)建java多模塊項(xiàng)目,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • java分布式面試降級組件Hystrix的功能特性

    java分布式面試降級組件Hystrix的功能特性

    這篇文章主要為大家介紹了java分布式面試關(guān)于降級組件Hystrix的功能特性回答,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Java中的OkHttp使用教程

    Java中的OkHttp使用教程

    OkHttp是目前非?;鸬木W(wǎng)絡(luò)庫,OKHttp與HttpClient類似,也是一個Http客戶端,提供了對?HTTP/2?和?SPDY?的支持,并提供了連接池,GZIP?壓縮和?HTTP?響應(yīng)緩存功能,本文重點(diǎn)給大家介紹Java?OkHttp使用,感興趣的朋友一起看看吧
    2022-04-04
  • Java判斷兩個集合是否具有交集及如何獲得交集詳解

    Java判斷兩個集合是否具有交集及如何獲得交集詳解

    這篇文章主要給大家介紹了關(guān)于Java判斷兩個集合是否具有交集及如何獲得交集的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 一文徹底搞懂java多線程和線程池

    一文徹底搞懂java多線程和線程池

    當(dāng)一個服務(wù)器接受到大量短小線程的請求時(shí),使用線程池技術(shù)是非常合適的,它可以大大減少線程的創(chuàng)建和銷毀次數(shù),提高服務(wù)器的工作效率,這篇文章主要給大家介紹了如何通過一文徹底搞懂java多線程和線程池的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 詳解jvm中的標(biāo)量替換

    詳解jvm中的標(biāo)量替換

    這篇文章主要介紹了詳解jvm中的標(biāo)量替換,幫助大家更好的理解和使用Java虛擬機(jī),感興趣的朋友可以了解下
    2020-09-09

最新評論

龙州县| 大荔县| 铅山县| 平乡县| 花垣县| 石嘴山市| 巴塘县| 玉田县| 芮城县| 长丰县| 沂南县| 淅川县| 潍坊市| 武穴市| 商城县| 安福县| 衢州市| 沛县| 饶河县| 北宁市| 平定县| 岫岩| 奉节县| 民勤县| 基隆市| 永胜县| 长寿区| 黄浦区| 吴旗县| 贺州市| 凤城市| 青神县| 诸暨市| 宜君县| 连城县| 祁连县| 九江县| 梁河县| 乐安县| 连南| 台前县|