电脑无法连接到代理服务器 JAVA写HTTP代理服务器-socket实现

大家好,今天小编来为大家解答电脑无法连接到代理服务器这个问题,JAVA写HTTP代理服务器-socket实现很多人还不知道,现在让我们一起来看看吧!

一、HTTP代理服务器

HTTP代理服务器是一个中间服务器,它负责接收客户端的HTTP请求,然后将请求转发给目标服务器,并将目标服务器返回的响应返回给客户端。代理服务器可以处理各种HTTP请求,如GET、POST、PUT、DELETE等,并可以处理HTTPS请求。在开发Web应用程序时,使用代理服务器可以隐藏后端服务器的真实IP地址,增强安全性。

二、JavaSocket

JavaSocket是Java网络编程中的重要部分,它提供了一种使用TCP协议进行网络通信的方式。使用JavaSocket,我们可以创建一个套接字,连接到远程主机,并通过套接字发送和接收数据。

三、思路

创建SocketServer监听端口,根据http请求头信息建立代理服务器与目标服务器的连接,然后通过httpclient转发请求数据,然后将目标服务器的响应消息通过socket连接返回给客户端。

四、示例代码

创建socket监听

/**\n*@authorCharles\n*@modulesocket\n*@since2023/8/312:03\n*/\npublicclassInitProxyServer{\n\npublicvoidstartServer(intport){\ntry{\nServerSocketserverSocket=newServerSocket(port);\nwhile(true){\n//Theserversocket\nSocketsocket=serverSocket.accept();\nnewProxyServer(socket).start();\n}\n}catch(Exceptione){\ne.printStackTrace();\n}\n}\n}

请求转发处理

@Override\npublicvoidrun(){\ntry{\nStringBufferres=newStringBuffer();\nStringcontent=&34;;\nres.append(&34;);\nres.append(&34;);\n//解析请求地址http(s)://serviceName/路径?userName=xxx&passWord=xxx&other=xxx\nRequestDataread=Request.read(this.input);\nif(read==null){\nres.append(&34;+content.getBytes().length+&34;);\nres.append(&34;);\nres.append(content);\nout.write(res.toString().getBytes());\nout.flush();\nreturn;\n}\n//用户鉴权\nAuthenticatorauthenticator=newAuthenticator();\nauthenticator.authenticateByMemory(read.getServiceName(),read.getUserName(),read.getPassword());\n//服务路由根据服务名获取实际的服务地址和端口,这里处理的是http请求\nServiceRegistrationserviceRegistration=newServiceRegistration();\nStringtarget=serviceRegistration.getTarget(read.getServiceName());\n//使用jdk的http客户端发起真实的请求\nStringbody=&34;;\nif(read.getMethodType().contains(GET)){\nbody=HttpUtil.createGet(target+read.getRequestPath()).body(read.getParamBody()).execute().body();\n}\nif(read.getMethodType().contains(POST)){\nbody=HttpUtil.createPost(target+read.getRequestPath()).body(read.getParamBody()).execute().body();\n}\n//响应目标服务器消息\ncontent=body;\nres.append(&34;+content.getBytes().length+&34;);\nres.append(&34;);\nres.append(content);\nout.write(res.toString().getBytes());\nout.flush();\n}catch(Exceptione){\nSystem.out.println(&34;);\ne.printStackTrace();\n}finally{\ntry{\nout.close();\n}catch(IOExceptione){\ne.printStackTrace();\n}\n}\n}

其他辅助类

/**\n*用户鉴权判断\n*\n*@paramserviceName代理的服务名称\n*@paramuserName用户名\n*@parampassword密码\n*/\npublicvoidauthenticateByMemory(StringserviceName,StringuserName,Stringpassword){\nMap<String,String>service=memoryUser.get(serviceName);\nif(Objects.isNull(service)){\nthrownewRuntimeException(&34;);\n}\nStringuser=service.get(userName);\nif(Objects.isNull(user)){\nthrownewRuntimeException(&34;);\n}elseif(!user.equals(password)){\nthrownewRuntimeException(&34;);\n}\n}

/**\n*解析请求头\n*\n*@paraminput\n*@return\n*/\npublicstaticRequestDataread(InputStreaminput){\nStringBuilderstringBuilder=newStringBuilder();\ntry{\nbyte[]bytes=newbyte[1024];\nwhile(input.available()!=0){\ninput.read(bytes);\nStringstr=newString(bytes,Charset.forName(&34;));\nstringBuilder.append(str);\n}\n}catch(Exceptione){\ne.printStackTrace();\n}\nStringaccept=stringBuilder.toString();\nif(&34;.equals(accept)){\nreturnnull;\n}\nString[]split=accept.split(&34;);\nif(!split[0].contains(HTTP)){\nthrownewRuntimeException(&34;);\n}elseif(!split[0].contains(GET)&&!split[0].contains(POST)){\nthrownewRuntimeException(&34;);\n}\nString[]data=split[0].split(&34;);\nif(!data[1].contains(&34;)){\nthrownewRuntimeException(&34;);\n}\nRequestDatarequestData=newRequestData();\nrequestData.setMethodType(data[0].replace(&34;,&34;));\nrequestData.setRequestPath(data[1].substring(data[1].indexOf(&34;,1),data[1].indexOf(&34;)));\nrequestData.setServiceName(data[1].substring(1,data[1].indexOf(&34;,1)));\nStringauth=data[1].substring(data[1].indexOf(&34;)+1);\nrequestData.setParamBody(auth);\nif(Objects.isNull(auth)||!auth.contains(USERNAME)||!auth.contains(PASSWORD)){\nthrownewRuntimeException(&34;);\n}\nString[]keyValue=auth.split(&34;);\nfor(inti=0;i<keyValue.length;i++){\nif(keyValue[i].contains(USERNAME)){\nrequestData.setUserName(keyValue[i].replace(USERNAME,&34;).replace(&34;,&34;));\n}\nif(keyValue[i].contains(PASSWORD)){\nrequestData.setPassword(keyValue[i].replace(PASSWORD,&34;).replace(&34;,&34;));\n}\n}\nreturnrequestData;\n}

五、测试效果

通过postman请求本地服务代理到远程目标服务上。

电脑无法连接到代理服务器和JAVA写HTTP代理服务器-socket实现的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平