我开始使用docker。我正在使用客户端和服务器创建COAP应用程序。在此应用程序中,客户端发送一个简单的请求,而服务器必须对此做出响应。我建立了在node.js中运行我的代码的映像。然后,我使用了docker-compose.yml文件,该文件将在代码部分中显示。但是,服务器似乎没有响应客户端请求。
我试图查看IP地址是否分配正确,并且一切正常。我还尝试在docker0上使用Wireshark,可以看到coap数据包从客户端发送到服务器,但是我没有答案。这是docker-compose.yml
QString srch(contentt + " " + "Profile");
int pos = content.indexOf(srch);
QString srch2("###");
int pos2 = content.indexOf(srch2);
if ( pos1 >= 0 && pos2 >= 0)
QString restOfLine = content.mid(pos1, pos2-pos1);
这是客户端代码:
services:
Server_Coap:
build: './Server_Coap'
image: 'user/mynode:latest'
container_name: server
ports:
- "8081:5683"
networks:
rete:
ipv4_address: 172.19.0.3
networks:
rete:
ipam:
driver: default
config:
- subnet: 172.19.0.0/24
这是服务器代码:
const coap = require('coap'),
req = coap.request('coap://172.19.0.3')
console.log("Client Request...")
req.on('response' , function(res){
res.pipe(process.stdout)
})
req.end()
这是我的服务器Dockerfile:
var coap = require('coap')
,server = coap.createServer()
server.on('request' , function(req, res){
console.log("New request")
res.end('Hello ' + req.url + '\n')
})
// the default CoAP port is 5683
server.listen(function() {
console.log("Server started")
})
这是我的客户端Dockerfile:
FROM node:latest
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 5683
CMD ["node" , "server.js"]
我想从服务器那里得到答案。 这是我得到的那种错误: │ 错误:247秒内无回复│ 超时._onTimeout(/usr/src/app/node_modules/coap/lib/retry_send.js:74:16)│ 在listOnTimeout(internal / timers.js:531:17)│ 在processTimers上(internal / timers.js:475:7)│ 在以下位置发出OutgoingMessage实例上的“错误”事件: 在RetrySend.emit(events.js:209:13)│ 于Timeout._onTimeout(/usr/src/app/node_modules/coap/lib/retry_send.js:77:12)│ 在listOnTimeout(internal / timers.js:531:17)│ 在processTimers(internal / timers.js:475:7){│ retransmitTimeout:247
答案 0 :(得分:1)
您必须将客户端泊坞窗添加到网络。 IE:
services:
Server_Coap:
build: './Server_Coap'
image: 'user/mynode:latest'
container_name: server
ports:
- "8081:5683"
networks:
rete:
ipv4_address: 172.19.0.3
Client_Coap:
build: './Client_Coap'
image: 'user/mynode:latest'
container_name: client
networks:
rete
networks:
rete:
ipam:
driver: default
config:
- subnet: 172.19.0.0/24
答案 1 :(得分:0)
从docker-compose中删除不必要的网络设置。
services:
Server_Coap:
build: './Server_Coap'
image: 'user/mynode:latest'
container_name: server
ports:
- "8081:5683"
并将其修改为localhost,我假设它们在同一容器中运行。如果要从外部访问,则需要提及发布端口8081
。
const coap = require('coap'),
req = coap.request('coap://localhost')
console.log("Client Request...")
req.on('response' , function(res){
res.pipe(process.stdout)
})
req.end()
如果将coap客户端放在其他容器中,最好将它们放在单个撰写文件中,并且两者都可以在同一网络上进行通话。
如果coap在容器外部的主机上运行,则可以在客户端使用localhost:8081
进行连接。
host_ip:8081
从客户端进行连接。要通过不同的网络进行连接,这是通过主机ip与发布端口进行连接的唯一方法,否则客户端将无法访问它。
docker run --add-host=coab-server:YOUR_HOST_IP --rm -it coad-client
此修改客户端之后。
req = coap.request('coap://coab-server')
如果您不想使用网络,也建议使用相同的端口"5683:5683"
,因为我看不到port选项,也可以尝试。
req = coap.request('coap://coab-server')
或使用当前端口
req = coap.request('coap://coab-server:8081')
答案 2 :(得分:0)
通常使用基于UDP的CoAP,因此必须将端口分类为udp
ports:
- "8081:5683/udp"