導航:首頁 > IDC知識 > java開發代理伺服器

java開發代理伺服器

發布時間:2020-12-13 22:18:25

1、想用java編寫個代理伺服器,求具體一些思路,詳細一些,謝謝

在編寫代理伺服器之前,首先應該明白一點,Java的代理機制,如圖所示:

那麼Java就處於中間這層代理伺服器,代理伺服器所作的事情如下:
       1、接收客戶端請求,進行處理,然後發送給服務端
       2、接收服務端響應,進行處理,然後發送給客戶端
       這樣,就更清晰了,Java提供了代理的API為,java.net.Proxy類。此類表示代理設置,通常為類型(http、socks)和套接字地址。Proxy 是不可變對象。
 
       也就是說Java可以製作高級協議的代理,如 HTTP 或 FTP。也可以製作SOCKS(V4 或 V5)代理。
       首先,使用到了URL類,HttpURLConnection類及其我們的代理類Proxy類。他們都位於java.net包中。

第一步:生成代理,指定埠為8888:

第二步:使用URLConnection類進行連接www.moonsos.com

第三步:打開URL,並且讀取HTML源碼

2、Java 中怎樣在程序中設置代理伺服器

你的問題應該是:在java中通過編程設置代理伺服器並訪問網路,現在作答如下:

1,講解一下基礎知識:
HTTP:是應用層協議,是基於傳輸層協議的。
TCP: 是傳輸層協議,是基於網路層協議的。
IP: 是網路層協議。
一個TCP的連接要進行三次握手(就像轉戶口一樣,不詳說),HTTP只是一個應用協議,也就是相當於一個自定義協議,即其沒有對底層的傳輸方式進行干涉,只是對數據內容格式進行了定義。

2,
我們再說說HTTP代理,從上可以理解,HTTP代理伺服器就是這樣一台機器:你把所有的HTTP請求都發到這個
HTTP代理伺服器,然後這個HTTP代理伺服器請求你要訪問的最終地址,把響應回傳給你。這里還要注意它代理的是HTTP協議,而HTTP又是基於
TCP的,也就是說這個伺服器代理的是指定HTTP內容格式的TCP連接。再說下去也沒意思了,看以下代碼:
//以下地址是代理伺服器的地址
Socket socket = new Socket("10.1.2.188", 80);
//寫與的內容就是遵循HTTP請求協議格式的內容,請求百度
socket.getOutputStream().write(new String("GET http://www.baidu.com/ HTTP/1.1\r\n\r\n").getBytes());
byte[] bs = new byte[1024];
InputStream is = socket.getInputStream();
int i;
while ((i = is.read(bs)) > 0) {
System.out.println(new String(bs, 0, i));
}
is.close();
3,當然在Java中,有Proxy代理上網的使用,此時使用URL(HTTP)就不涉及Socket(TCP)了,看如下代碼
//設置代理
System.setProperty("http.proxySet", "true");
System.setProperty("http.proxyHost", "10.1.2.188");
System.setProperty("http.proxyPort", "80");

//直接訪問目的地址
URL url = new URL("http://www.baidu.com");
URLConnection con = url.openConnection();
InputStreamReader isr = new InputStreamReader(con.getInputStream());
char[] cs = new char[1024];
int i = 0;
while ((i = isr.read(cs)) > 0) {
System.out.println(new String(cs, 0, i));
}
isr.close();

3、如何用java 5分鍾實現一個最簡單的mysql代理伺服器

將不同類型的請求分發的不同的server以此實現讀寫分離、負載均衡;
來自不同客戶端的請求分發到不同的server實現後端多租戶資料庫服務,當然,類似的原理還可以實現分庫分表、一個請求寫到多個server或者不同的源端如消息隊列;
監控統計客戶端的請求情況,請求分布統計、請求類型等,以此來優化資料庫的使用;
總之,可以實現你想要的諸多功能。
如何用java快速實現一個最簡單的代理呢?

4、Java 中怎樣在程序中設置代理伺服器

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;
 
public class ProxyDemo2 {
    public static void main(String[] args) throws Exception {
        URL url = new URL("http://www.3lai8.com");
        // /創建代理伺服器
        InetSocketAddress addr = new InetSocketAddress("192.168.0.254", 8080);
        // Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); // Socket 代理
        Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); // http 代理
        Authenticator.setDefault(new MyAuthenticator("username", "password"));// 設置代理的用戶和密碼
        HttpURLConnection connection = (HttpURLConnection) url.openConnection(proxy);// 設置代理訪問
        InputStreamReader in = new InputStreamReader(connection.getInputStream());
        BufferedReader reader = new BufferedReader(in);
        while (true) {
            String s = reader.readLine();
            if (s != null) {
                System.out.println(s);
            }
        }
    }
 
    static class MyAuthenticator extends Authenticator {
        private String user = "";
        private String password = "";
 
        public MyAuthenticator(String user, String password) {
            this.user = user;
            this.password = password;
        }
 
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(user, password.toCharArray());
        }
    }
 
}

5、求助!用java編寫的代理伺服器,無法訪問網頁

最好把代碼放出來,獲取遠程web伺服器端的java運行地方必須可以訪問web才可以

6、java 開發一個http的代理伺服器

說實話,你的問題很那個。。
不過應該也能實現。
現在問題主要是由於b不能訪問c,所以c只能使用TimerTask定時去訪問b。
b有2個listener,一個負責偵聽來自a的請求,一個負責偵聽來自b的。

b中應該會使用到多線程。
下面定義a的Request為x,c的Request為y
由於b會有多個來自a轉發的請求,可能會有x1\x2\x3等很多並發的請求,所以b在初始化的時候就需要建立一個等待池.
等待池應該是單例且線程同步的,x一來就new object(request,response),然後放入list。
c的定時器一到,就訪問b開放給c的listener,request y。y首先遍歷等待池,取出x的request,然後用取出x的response的返回給a。直到等待池為空為止,然後y response給c。

不過要注意的是
1)你會發現,由於c給b的數據應該是放到request y裡面作為參數來傳的。
2)a的請求如果需要c不同數據介面的數據,那c-->b的request y里就應該包含所有的數據,然後在遍歷等待池的時候根據a-->b的request x的id(可以使用sessionid)來區分取哪個。
3)最差的情況,
1,a源源不斷的發出x請求,c的request遍歷就死循環。
2,如果c的定時時間太短,y1還沒完,y2就來了。
3,a源源不斷的發出x請求,但是某一請求Xn就無法搶到資源,Xn就掛掉。

這裡面很多處理你還要多加控制。

這個想法沒實驗過,其實如果b可以訪問c,其實什麼問題都沒有了
最後問一句,誰給你這樣的需求的?打他

7、如何用java 5分鍾實現一個最簡單的mysql代理伺服器

如何用java 5分鍾實現一個最簡單的mysql代理伺服器
首先,准備開發工具套件,我們並不會引入過多工具包,僅僅需要:
java8
vert.x 3
如果你是用maven做為項目管理工具,請將vert.x 3引入:

1
2
3
4
5

<dependency>

<groupId>io.vertx</groupId>

<artifactId>vertx-core</artifactId>

<version>3.3.2</version>

</dependency>

代碼實現:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

package
com.maxleap.mysqlproxy;

import
io.vertx.core.AbstractVerticle;

import
io.vertx.core.Vertx;

import
io.vertx.core.logging.Logger;

import
io.vertx.core.logging.LoggerFactory;

import
io.vertx.core.net.NetClient;

import
io.vertx.core.net.NetServer;

import
io.vertx.core.net.NetSocket;

/**

*
@author sneaky

*
@since 1.0.0

*/

public
class
MysqlProxyServer
{

private
static
final
Logger
logger
=
LoggerFactory.getLogger(MysqlProxyServer.class);

public
static
void
main(String[]
args)
{

Vertx.vertx().deployVerticle(new
MysqlProxyServerVerticle());

}

public
static
class
MysqlProxyServerVerticle
extends
AbstractVerticle
{

private
final
int
port
=
3306;

private
final
String
mysqlHost
=
"10.10.0.6";

@Override

public
void
start()
throws
Exception
{

NetServer
netServer
=
vertx.createNetServer();//創建代理伺服器

NetClient
netClient
=
vertx.createNetClient();//創建連接mysql客戶端

netServer.connectHandler(socket
->
netClient.connect(port,
mysqlHost,
result
->
{

//響應來自客戶端的連接請求,成功之後,在建立一個與目標mysql伺服器的連接

if
(result.succeeded())
{

//與目標mysql伺服器成功連接連接之後,創造一個MysqlProxyConnection對象,並執行代理方法

new
MysqlProxyConnection(socket,
result.result()).proxy();

8、用JAVA編寫一個web代理伺服器

了解http協議,主要是了解發送接收報文的格式。
語言方面可以看看scoket編程

9、java HTTP代理伺服器開發 求助帖

說實話,你的問題很那個。。
不過應該也能實現。
現在問題主要是由於b不能訪問c,所以c只能使用TimerTask定時去訪問b。
b有2個listener,一個負責偵聽來自a的請求,一個負責偵聽來自b的。

b中應該會使用到多線程。
下面定義a的Request為x,c的Request為y
由於b會有多個來自a轉發的請求,可能會有x1\x2\x3等很多並發的請求,所以b在初始化的時候就需要建立一個等待池.
等待池應該是單例且線程同步的,x一來就new object(request,response),然後放入list。
c的定時器一到,就訪問b開放給c的listener,request y。y首先遍歷等待池,取出x的request,然後用取出x的response的返回給a。直到等待池為空為止,然後y response給c。

不過要注意的是
1)你會發現,由於c給b的數據應該是放到request y裡面作為參數來傳的。
2)a的請求如果需要c不同數據介面的數據,那c-->b的request y里就應該包含所有的數據,然後在遍歷等待池的時候根據a-->b的request x的id(可以使用sessionid)來區分取哪個。
3)最差的情況,
1,a源源不斷的發出x請求,c的request遍歷就死循環。
2,如果c的定時時間太短,y1還沒完,y2就來了。
3,a源源不斷的發出x請求,但是某一請求Xn就無法搶到資源,Xn就掛掉。

這裡面很多處理你還要多加控制。

這個想法沒實驗過,其實如果b可以訪問c,其實什麼問題都沒有了
最後問一句,誰給你這樣的需求的?打他

10、怎麼用java實現一個代理伺服器,需要支持htt

怎麼用java實現一個代理伺服器,需要支持htt
代理伺服器的應用非常廣泛。比如,在企業網內部,它可以用來控制員工在工作時瀏覽的Internet內容,阻止員工訪問某些類型的內容或某些指定的網站。代理伺服器實際上扮演著瀏覽器和Web伺服器之間的中間人的角色,能夠對瀏覽器請求進行各種各樣的處理,能夠過濾廣告和Cookie,能夠預先提取Web頁面,使得瀏覽器訪問頁面的速度更快,等等。

與java開發代理伺服器相關的知識