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页面,使得浏览器访问页面的速度更快,等等。