栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/333007.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号