首页 > 服务器    日期:2026-07-14 / 浏览

在Docker容器内部署Websocket服务时出现了端口映射失败,链接WS时始终访问不通的情况。

代码如下

  var server = new WebSocketServer("ws://127.0.0.1:8888");
            server.Start(socket =>
            {
                socket.OnOpen = () => //当建立Socket链接时执行此方法
                {
                };
                socket.OnClose = () =>// 当关闭Socket链接十执行此方法
                {
                };
                socket.OnMessage = message =>// 接收客户端发送过来的信息
                {
                };
            });
        }

将程序打包进入Docker容器后,配置DockerCompose

version: '3.4'
services:
  tdssserver:
    image: test
    restart: always
    container_name: test
    ports:
      - 8988:8888
    environment:
      TZ: Asia/Shanghai
    volumes:
      - ./appsettings.json:/app/appsettings.json

正常情况下应该可以通过WS正常连接到服务上,但是当服务在Docker内正常运行的时候,使用测试工具进行测试连接发现一直连不通。

一开始分析以为是WS协议与Http协议不是同族协议,认为需要单独开启Docker的Ws协议支持。但是后来查阅资料发现实际上WS和HTTP都是基于TCP的,所以立马改变排查方向。
最后分析认为可能是使用的127.0.0.1这类的LocalHost地址,导致在配置Docker映射的时候没法正确映射。
分析之后改变原来代码

            string localIP;
            using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
            {
                socket.Connect("8.8.8.8", 65530);
                IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
                localIP = endPoint.Address.ToString();
            }
            FleckLog.Level = Fleck.LogLevel.Debug;
            var ws = "ws://" + localIP + ":" + planws;
            var server = new WebSocketServer(ws);
            server.Start(socket =>
            {
                socket.OnOpen = () => //当建立Socket链接时执行此方法
                {
                };
                socket.OnClose = () =>// 当关闭Socket链接十执行此方法
                {
                };
                socket.OnMessage = message =>// 接收客户端发送过来的信息
                {
                };
            });

思路是通过

         string localIP;
            using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, 0))
            {
                socket.Connect("8.8.8.8", 65530);
                IPEndPoint endPoint = socket.LocalEndPoint as IPEndPoint;
                localIP = endPoint.Address.ToString();
            }
            FleckLog.Level = Fleck.LogLevel.Debug;
            var ws = "ws://" + localIP + ":" + planws;
            var server = new WebSocketServer(ws);

拿到Localip,最后用容器内部的LocalIp创建对应的WS连接。

改变代码后生成新的Docker镜像。启动容器,测试连接正常。

觉得上面的内容有用吗?快来点个赞吧!

点赞() 我要打赏

温馨提示 : 本站内容来自会员投稿以及互联网,所有源码及教程均为作者总结编辑,请大家在使用过程中提前做好备份,以免发生无法预知的错误,源码类教程请勿直接用于生产环境!

 可能感兴趣的文章