java socket+nginx 实现网络数据转发传输 多次交互

数据服务器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(),也可以把数据传过去而不造成阻塞。

以上是我最近在做项目的时候所遇到的一些坑,花费了一些时间,也收获了一些经验。希望能给同样是在黑暗中摸索的码农们一丝微光。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值