国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JAVA寫(xiě)HTTP代理服務(wù)器-socket實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了JAVA寫(xiě)HTTP代理服務(wù)器-socket實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、HTTP代理服務(wù)器

HTTP代理服務(wù)器是一個(gè)中間服務(wù)器,它負(fù)責(zé)接收客戶(hù)端的HTTP請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給目標(biāo)服務(wù)器,并將目標(biāo)服務(wù)器返回的響應(yīng)返回給客戶(hù)端。代理服務(wù)器可以處理各種HTTP請(qǐng)求,如GET、POST、PUT、DELETE等,并可以處理HTTPS請(qǐng)求。在開(kāi)發(fā)Web應(yīng)用程序時(shí),使用代理服務(wù)器可以隱藏后端服務(wù)器的真實(shí)IP地址,增強(qiáng)安全性。

二、Java Socket

Java Socket是Java網(wǎng)絡(luò)編程中的重要部分,它提供了一種使用TCP協(xié)議進(jìn)行網(wǎng)絡(luò)通信的方式。使用Java Socket,我們可以創(chuàng)建一個(gè)套接字,連接到遠(yuǎn)程主機(jī),并通過(guò)套接字發(fā)送和接收數(shù)據(jù)。

三、思路

創(chuàng)建SocketServer監(jiān)聽(tīng)端口,根據(jù)http請(qǐng)求頭信息建立代理服務(wù)器與目標(biāo)服務(wù)器的連接,然后通過(guò)httpclient轉(zhuǎn)發(fā)請(qǐng)求數(shù)據(jù),然后將目標(biāo)服務(wù)器的響應(yīng)消息通過(guò)socket連接返回給客戶(hù)端。

四、示例代碼

創(chuàng)建socket監(jiān)聽(tīng)

/**
 * @author Charles
 * @module socket
 * @since 2023/8/3 12:03
 */
public class InitProxyServer {

    public void startServer(int port) {
        try {
            ServerSocket serverSocket = new ServerSocket(port);
            while (true) {
                //The server socket
                Socket socket = serverSocket.accept();
                new ProxyServer(socket).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

請(qǐng)求轉(zhuǎn)發(fā)處理

@Override
public void run() {
    try {
        StringBuffer res = new StringBuffer();
        String content = "";
        res.append("HTTP/1.1 200 ok \r\n");
        res.append("Content-Type:application/json;charset=utf-8; \r\n");
        // 解析請(qǐng)求地址  http(s)://serviceName/路徑?userName=xxx&passWord=xxx&other=xxx
        RequestData read = Request.read(this.input);
        if(read == null){
            res.append("Content-Length:" + content.getBytes().length + "\r\n");
            res.append("\r\n");
            res.append(content);
            out.write(res.toString().getBytes());
            out.flush();
            return;
        }
        // 用戶(hù)鑒權(quán)
        Authenticator authenticator = new Authenticator();
        authenticator.authenticateByMemory(read.getServiceName(), read.getUserName(), read.getPassword());
        // 服務(wù)路由 根據(jù)服務(wù)名獲取實(shí)際的服務(wù)地址和端口,這里處理的是http請(qǐng)求
        ServiceRegistration serviceRegistration = new ServiceRegistration();
        String target = serviceRegistration.getTarget(read.getServiceName());
        // 使用jdk的http客戶(hù)端發(fā)起真實(shí)的請(qǐng)求
        String body = "";
        if(read.getMethodType().contains(GET)){
            body = HttpUtil.createGet(target + read.getRequestPath()).body(read.getParamBody()).execute().body();
        }
        if(read.getMethodType().contains(POST)){
            body = HttpUtil.createPost(target + read.getRequestPath()).body(read.getParamBody()).execute().body();
        }
        // 響應(yīng)目標(biāo)服務(wù)器消息
        content = body;
        res.append("Content-Length:" + content.getBytes().length + "\r\n");
        res.append("\r\n");
        res.append(content);
        out.write(res.toString().getBytes());
        out.flush();
    }catch (Exception e){
        System.out.println("服務(wù)器代理異常!");
        e.printStackTrace();
    }finally {
        try {
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

其他輔助類(lèi)

/**
 * 用戶(hù)鑒權(quán)判斷
 *
 * @param serviceName 代理的服務(wù)名稱(chēng)
 * @param userName 用戶(hù)名
 * @param password 密碼
 */
public void authenticateByMemory(String serviceName, String userName, String password){
    Map<String, String> service = memoryUser.get(serviceName);
    if(Objects.isNull(service)){
        throw new RuntimeException("服務(wù)不存在");
    }
    String user = service.get(userName);
    if(Objects.isNull(user)){
        throw new RuntimeException("用戶(hù)不存在");
    }else if(!user.equals(password)){
        throw new RuntimeException("密碼錯(cuò)誤");
    }
}
/**
 * 解析請(qǐng)求頭
 *
 * @param input
 * @return
 */
public static RequestData read(InputStream input) {
    StringBuilder stringBuilder = new StringBuilder();
    try {
        byte[] bytes = new byte[1024];
        while (input.available() != 0) {
            input.read(bytes);
            String str = new String(bytes, Charset.forName("utf-8"));
            stringBuilder.append(str);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    String accept = stringBuilder.toString();
    if("".equals(accept)){
        return null;
    }
    String[] split = accept.split("\\r\\n");
    if(!split[0].contains(HTTP)){
        throw new RuntimeException("錯(cuò)誤的請(qǐng)求");
    }else if(!split[0].contains(GET) && !split[0].contains(POST)){
        throw new RuntimeException("錯(cuò)誤的請(qǐng)求方式");
    }
    String[] data = split[0].split(" ");
    if(!data[1].contains("?")){
        throw new RuntimeException("未攜帶用戶(hù)參數(shù)");
    }
    RequestData requestData = new RequestData();
    requestData.setMethodType(data[0].replace("/", ""));
    requestData.setRequestPath(data[1].substring(data[1].indexOf("/", 1), data[1].indexOf("?")));
    requestData.setServiceName(data[1].substring(1, data[1].indexOf("/", 1)));
    String auth = data[1].substring(data[1].indexOf("?") + 1);
    requestData.setParamBody(auth);
    if(Objects.isNull(auth) || !auth.contains(USERNAME) || !auth.contains(PASSWORD)){
        throw new RuntimeException("未攜帶用戶(hù)消息");
    }
    String[] keyValue = auth.split("&");
    for (int i = 0; i < keyValue.length; i++) {
        if(keyValue[i].contains(USERNAME)){
            requestData.setUserName(keyValue[i].replace(USERNAME, "").replace("=", ""));
        }
        if(keyValue[i].contains(PASSWORD)){
            requestData.setPassword(keyValue[i].replace(PASSWORD, "").replace("=", ""));
        }
    }
    return requestData;
}

五、測(cè)試效果

通過(guò)postman請(qǐng)求本地服務(wù)代理到遠(yuǎn)程目標(biāo)服務(wù)上。

java 代理服務(wù)器,java知識(shí)體系,java,http,開(kāi)發(fā)語(yǔ)言,服務(wù)器,后端,網(wǎng)絡(luò),網(wǎng)絡(luò)協(xié)議

java 代理服務(wù)器,java知識(shí)體系,java,http,開(kāi)發(fā)語(yǔ)言,服務(wù)器,后端,網(wǎng)絡(luò),網(wǎng)絡(luò)協(xié)議文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-779139.html

到了這里,關(guān)于JAVA寫(xiě)HTTP代理服務(wù)器-socket實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Java網(wǎng)絡(luò)編程】基于UDP-Socket 實(shí)現(xiàn)客戶(hù)端、服務(wù)器通信

    【Java網(wǎng)絡(luò)編程】基于UDP-Socket 實(shí)現(xiàn)客戶(hù)端、服務(wù)器通信

    ? 哈嘍,大家好~我是你們的老朋友: 保護(hù)小周??? 本期為大家?guī)?lái)的是網(wǎng)絡(luò)編程的 UDP Socket 套接字,基于 UDP協(xié)議的 Socket 實(shí)現(xiàn)客戶(hù)端服務(wù)器通信 ,Socket 套接字可以理解為是,傳輸層給應(yīng)用層提供的一組 API,如此程序,確定不來(lái)看看嘛~~ 本期收錄于博主的專(zhuān)欄 : JavaEE_保

    2024年02月02日
    瀏覽(111)
  • HTTP代理服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)

    HTTP代理服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)

    一、前言 這個(gè)實(shí)驗(yàn)挺麻煩的,本來(lái)就只有一周時(shí)間,等我開(kāi)始著手準(zhǔn)備的時(shí)候,也就剩兩三天了,也沒(méi)什么心情自己重頭開(kāi)打代碼,于是就找了大佬的代碼借鑒了一下,在驗(yàn)收之前處理完了所有的bug。不過(guò),我覺(jué)得這個(gè)實(shí)驗(yàn)還是最好自己慢慢想,想到問(wèn)題再去搜索,能收獲到

    2023年04月13日
    瀏覽(19)
  • Java【網(wǎng)絡(luò)編程2】使用 TCP 的 Socket API 實(shí)現(xiàn)客戶(hù)端服務(wù)器通信(保姆級(jí)教學(xué), 附代碼)

    Java【網(wǎng)絡(luò)編程2】使用 TCP 的 Socket API 實(shí)現(xiàn)客戶(hù)端服務(wù)器通信(保姆級(jí)教學(xué), 附代碼)

    ??各位讀者好, 我是小陳, 這是我的個(gè)人主頁(yè) ??小陳還在持續(xù)努力學(xué)習(xí)編程, 努力通過(guò)博客輸出所學(xué)知識(shí) ??如果本篇對(duì)你有幫助, 煩請(qǐng)點(diǎn)贊關(guān)注支持一波, 感激不盡 ?? 希望我的專(zhuān)欄能夠幫助到你: JavaSE基礎(chǔ): 基礎(chǔ)語(yǔ)法, 類(lèi)和對(duì)象, 封裝繼承多態(tài), 接口, 綜合小練習(xí)圖書(shū)管理系統(tǒng)

    2024年02月05日
    瀏覽(33)
  • HTTP 代理服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)(C++)

    設(shè)計(jì)并實(shí)現(xiàn)一個(gè)基本 HTTP 代理服務(wù)器。要求在指定端口(例如 8080)接收來(lái)自客戶(hù)的 HTTP 請(qǐng)求并且根據(jù)其中的 URL 地址訪問(wèn)該地址 所指向的 HTTP 服務(wù)器(原服務(wù)器),接收 HTTP 服 務(wù)器的響應(yīng)報(bào)文,并 將響應(yīng)報(bào)文轉(zhuǎn)發(fā)給對(duì)應(yīng)的客戶(hù)進(jìn)行瀏覽。 設(shè)計(jì)并實(shí)現(xiàn)一個(gè)支持 Cache 功能的

    2024年02月03日
    瀏覽(44)
  • 哈工大計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)一——HTTP代理服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)

    哈工大計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)一——HTTP代理服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)

    1. 設(shè)計(jì)并實(shí)現(xiàn)一個(gè)基本 HTTP 代理服務(wù)器。 要求在指定端口接收來(lái)自客戶(hù)的 HTTP 請(qǐng)求并且根據(jù)其中的 URL 地址訪問(wèn)該地址所指向的 HTTP 服務(wù)器(原服務(wù)器),接收 HTTP 服務(wù)器的響應(yīng)報(bào)文,并將響應(yīng)報(bào)文轉(zhuǎn)發(fā)給對(duì)應(yīng)的客戶(hù)進(jìn)行瀏覽。 2. 設(shè)計(jì)并實(shí)現(xiàn)一個(gè)支持 Cache 功能的 HTTP 代理服

    2024年02月22日
    瀏覽(30)
  • 哈工大計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)一-HTTP代理服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)

    哈工大計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)一-HTTP代理服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)

    當(dāng)客戶(hù)在瀏覽器中設(shè)置好Proxy Server后,你使用瀏覽器訪問(wèn)所有WWW站點(diǎn)的請(qǐng)求都不會(huì)直接發(fā)給目的主機(jī),而是先發(fā)給代理服務(wù)器,代理服務(wù)器接受了客戶(hù)的請(qǐng)求以后,由代理服務(wù)器向目的主機(jī)發(fā)出請(qǐng)求,并接受目的主機(jī)的數(shù)據(jù),存于代理服務(wù)器的硬盤(pán)中,然后再由代理服務(wù)器將

    2023年04月24日
    瀏覽(50)
  • 用Java包c(diǎn)om.sun.net.httpserver下面的類(lèi)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的http服務(wù)器demo

    用Java包c(diǎn)om.sun.net.httpserver下面的類(lèi)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的http服務(wù)器demo

    java的com.sun.net.httpserver包下的類(lèi)提供了一個(gè)高層級(jí)的http服務(wù)器API,可以用來(lái)構(gòu)建內(nèi)嵌的http服務(wù)器。支持http和https。這些API提供了一個(gè)RFC 2616 (HTTP 1.1)和RFC 2818 (HTTP over TLS)的部分實(shí)現(xiàn)。 https://docs.oracle.com/en/java/javase/19/docs/api/jdk.httpserver/com/sun/net/httpserver/package-summary.html 下面來(lái)實(shí)

    2024年02月07日
    瀏覽(22)
  • .NET Core(C#)使用Titanium.Web.Proxy實(shí)現(xiàn)Http(s)代理服務(wù)器監(jiān)控HTTP請(qǐng)求

    關(guān)于Titanium.Web.Proxy詳細(xì)信息可以去這里仔細(xì)看看,這里只記錄簡(jiǎn)單用法 NuGet直接獲取Titanium.Web.Proxy 配置 與其說(shuō)是配置,不如就說(shuō)這一部分就是未來(lái)你需要使用的部分,想知道具體每個(gè)部分是干什么的就去看原文鏈接 全放過(guò)來(lái)太占地方 最后的 Console.Read(); 是一個(gè)等待函數(shù),你

    2024年02月09日
    瀏覽(24)
  • java代碼構(gòu)建簡(jiǎn)單http服務(wù)器和客戶(hù)端

    java代碼構(gòu)建簡(jiǎn)單http服務(wù)器和客戶(hù)端

    初識(shí)http a、超文本傳輸 、應(yīng)用層的面向?qū)ο蟮膮f(xié)議,概念介紹網(wǎng)上資源一大堆,關(guān)鍵是基于TCP/IP通信協(xié)議來(lái)傳遞數(shù)據(jù)。 b、一開(kāi)始接觸web項(xiàng)目,都是先接觸的servlet,tomcat服務(wù)器默認(rèn)實(shí)現(xiàn)的一套http規(guī)范,提供了基礎(chǔ)服務(wù)和組件環(huán)境,直接拿到請(qǐng)求、構(gòu)建正文、響應(yīng)客戶(hù)端 然而

    2024年02月10日
    瀏覽(28)
  • Java 網(wǎng)絡(luò)編程 —— 創(chuàng)建非阻塞的 HTTP 服務(wù)器

    HTTP 客戶(hù)程序必須先發(fā)出一個(gè) HTTP 請(qǐng)求,然后才能接收到來(lái)自 HTTP 服器的響應(yīng),瀏覽器就是最常見(jiàn)的 HTTP 客戶(hù)程序。HTTP 客戶(hù)程序和 HTTP 服務(wù)器分別由不同的軟件開(kāi)發(fā)商提供,它們都可以用任意的編程語(yǔ)言編寫(xiě)。HTTP 嚴(yán)格規(guī)定了 HTTP 請(qǐng)求和 HTTP 響應(yīng)的數(shù)據(jù)格式,只要 HTTP 服務(wù)器

    2024年02月06日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包