数据服务器A 内网1
nginx服务器 内网1
阿里云服务器 外网
工作站 内网2
数据服务器取数据 ——>nginx服务器——>阿里云服务器
由于客户单位网络安全规则的限制,只能通过nginx服务将请求转发到外网的阿里云服务器上。
期间遇到了几个问题,在此汇总归纳一下,希望对其他的码农有些帮助。
坑1:首先要解决的问题就是nginx配置。
这个我也是个小白,没有配置经验,我从CSDN上找到了一个配置如下:
events {
worker_connections 1024;
}
stream{
upstream abc{
server **.**.***.***:8026;
}
server{
listen 8026;
proxy_connect_timeout 1s;
proxy_timeout 20s;
proxy_pass abc;
}
}http {
开始我把stream放到http里面,启动nginx就报错,stream是和events平级的,所以要放在外面。
坑2:
socket 在通过nginx时总是没有得到服务器的响应,代码如下:
OutputStream os = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
oos.writeObject(la_list);
socket.shutdownOutput();
我传送的是一个ArrayList,阿里云服务器总是收不到消息,找了无数的资料,最终还是试了一下把“socket.shutdownOutput();”注释掉,就在我不报希望的时候,服务器尽然有响应了。坑1和坑2一起调试,耗用我2天的时间解决,周围的环境也不是很好。一会改坑1,一会改坑2。好在还是调试好了。
坑3:
socket多次通讯
1、工作站socket发起数据请求
2、阿里云服务查询数据并回传
3、工作站socket接收数据,并发送已处理的数据ID
4、阿里云服务接收数据ID,并修改状态。
这个涉及到socket多次的通讯。代码如下:
OutputStream os = null;
PrintWriter pw = null;os=socket.getOutputStream();
pw=new PrintWriter(os);
pw.println(ls_rtn);
pw.flush();
socket.shutdownOutput();
只要是用了shutdownOutput()这个方法,再要想进行通讯out是不可能的,这个是关闭了输出流但是连接还是没有中断。原因是PrintWriter(os)输出必须要告诉系统我的话说完了,否则如果不用socket.shutdownOutput()方法的话,Serversocket就始终在等,造成阻塞。如果是这样的话就只能换一个方法。
DataOutputStream output=new DataOutputStream(socket.getOutputStream());
output.writeUTF("给我数据!");
DataInputStream input=new DataInputStream(socket.getInputStream());
String ls_rtn=input.readUTF();
用这一对工具还是很好用的。不需要调用socket.shutdownOutput(),也可以把数据传过去而不造成阻塞。
以上是我最近在做项目的时候所遇到的一些坑,花费了一些时间,也收获了一些经验。希望能给同样是在黑暗中摸索的码农们一丝微光。