C# socket编程 使用fleck轻松实现对话 https://github.com/statianzo/Fleck

本文通过一个具体实例展示了如何使用WebSocket进行实时通信。服务器端采用C#实现,并能够接收文本及二进制文件;客户端则利用HTML5特性及jQuery库实现与服务器的交互。此示例覆盖了连接管理、消息收发及文件传输等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 class Program
    {

        static void Main(string[] args)
        {
            FleckLog.Level = LogLevel.Debug;
            var allSockets = new List<IWebSocketConnection>();
            var server = new WebSocketServer("ws://0.0.0.0:7181");
            server.Start(socket =>
            {
                socket.OnOpen = () =>
                {
                    Console.WriteLine("Open!");
                    allSockets.Add(socket);
                };
                socket.OnClose = () =>
                {
                    Console.WriteLine("Close!");
                    allSockets.Remove(socket);
                };
                socket.OnMessage = message =>
                {
                    Console.WriteLine(message);
                    allSockets.ToList().ForEach(s => s.Send("Echo: " + message));
                };
                socket.OnBinary = file => {
               
                    string path = ("D:/test.txt");
             //创建一个文件流
             FileStream fs = new FileStream(path, FileMode.Create);
 
             //将byte数组写入文件中
             fs.Write(file, 0, file.Length);
            //所有流类型都要关闭流,否则会出现内存泄露问题
             fs.Close();
                };
            });


            var input = Console.ReadLine();
            while (input != "exit")
            {
                foreach (var socket in allSockets.ToList())
                {
                    socket.Send(input);
                }
                input = Console.ReadLine();
            }
        }
    }

  

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>websocket client</title>
    <script type="text/javascript">
        var start = function () {
            var inc = document.getElementById('incomming');
            var wsImpl = window.WebSocket || window.MozWebSocket;
            var form = document.getElementById('sendForm');
            var input = document.getElementById('sendText');

            inc.innerHTML += "connecting to server ..<br/>";

            // create a new websocket and connect
            window.ws = new wsImpl('ws://localhost:7181/');

            // when data is comming from the server, this metod is called
            ws.onmessage = function (evt) {
                inc.innerHTML += evt.data + '<br/>';
            };

            // when the connection is established, this method is called
            ws.onopen = function () {
                inc.innerHTML += '.. connection open<br/>';
            };

            // when the connection is closed, this method is called
            ws.onclose = function () {
                inc.innerHTML += '.. connection closed<br/>';
            }

            form.addEventListener('submit', function (e) {
                e.preventDefault();
                var val = input.value;
                ws.send(val);
                input.value = "";
            });

        }
        window.onload = start;
    </script>
</head>
<body>
    <form id="sendForm">
        <input id="sendText" placeholder="Text to send" />
    </form>
    <pre id="incomming"></pre>
</body>
</html>

 //实现聊天窗口与文件发送

<!DOCTYPE html>
<html>
<head>
<title>WebSocket Chat Client</title>
<meta charset="utf-8" />
<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.js"></script>
<script type="text/javascript" >
    //判读浏览器是否支持websocket
    $().ready(function() {
        if ( !window.WebSocket ) {
             alert("童鞋, 你的浏览器不支持该功能啊");
        }
         
    });
    
    //在消息框中打印内容
function log(text) {
        $("#log").append(text+"\n");
    }
    
    //全局的websocket变量
var ws;
    
    //创建连接
    $(function() {
    $("#uriForm").submit(function() {
        log("准备连接到" + $("#uri").val());
        
        ws = new WebSocket($("#uri").val());
        //连接成功建立后响应
        ws.onopen = function() {
            log("成功连接到" + $("#uri").val());
        }
        //收到服务器消息后响应
        ws.onmessage = function(e) {
            log("收到服务器消息:" + e.data + "'\n");
        }
        //连接关闭后响应
        ws.onclose = function() {
            log("关闭连接");
            $("#disconnect").attr({"disabled":"disabled"});
            $("#uri").removeAttr("disabled");
            $("#connect").removeAttr("disabled");
            ws = null;
        }
        $("#uri").attr({"disabled":"disabled"});
        $("#connect").attr({"disabled":"disabled"});
        $("#disconnect").removeAttr("disabled");
        return false;
    });
    });
    
    //发送字符串消息
    $(function() {
    $("#sendForm").submit(function() {
         if (ws) {
             var textField = $("#textField");
             ws.send(textField.val());
             log("我说:" + textField.val());
             textField.val("");
             textField.focus();
         }
         return false;
    });
    });
    
    //发送arraybuffer(二进制文件)
    $(function() {
    $("#sendFileForm").submit(function() {
        var inputElement = document.getElementById("file");
        var fileList = inputElement.files;
        
        for ( var i = 0; i < fileList.length; i++) {
            console.log(fileList[i]);
            log(fileList[i].name);
            //发送文件名
            ws.send(fileList[i].name);
//            reader.readAsBinaryString(fileList[i]);
//读取文件  
       var reader = new FileReader();
            reader.readAsArrayBuffer(fileList[i]);
//            reader.readAsText(fileList[i]);
//文件读取完毕后该函数响应
            reader.onload = function loaded(evt) {
                var binaryString = evt.target.result;
                // Handle UTF-16 file dump
                log("\n开始发送文件");
                ws.send(binaryString);
            }
        }
        return false;
    });
    });
    
    $(function() {
    $("#disconnect").click(function() {
         if (ws) {
             $("#log").empty();
             ws.close();
             ws = null;
         }
         return false;
    });
    });
    
    $(function() {
    $("#reset").click(function() {
        $("#log").empty();
         return false;
    });
    });
    
    
</script>
</head>
<body>
    <form id="uriForm">
        <input type="text" id="uri" value="ws://192.168.31.37:7181"
            style="width: 200px;"> <input type="submit" id="connect"
            value="Connect"><input type="button" id="disconnect"
            value="Disconnect" disabled="disabled">
    </form>
    <br>
    
    <form id="sendFileForm">
        <input id="file" type="file" multiple />
        <input type="submit" value="Send" />
        <input type="button" id="reset" value="清空消息框"/>
    </form>
    <br>
    <form id="sendForm">
        <input type="text" id="textField" value="" style="width: 200px;">
        <input type="submit" value="Send">
    </form>
    <br>
    <form>
        <textarea id="log" rows="30" cols="100"
            style="font-family: monospace; color: red;"></textarea>
    </form>
    <br>
</body>
</html>

  

 

转载于:https://www.cnblogs.com/ProDoctor/p/6434206.html

<think>好的,我现在需要帮助用户解决在C#使用HttpListener时,因ws:// URL导致报错退出的问题。首先,我得回忆一下HttpListener的功能和限制。HttpListener是用于创建HTTP服务器的类,它处理HTTP和HTTPS请求。而ws://和wss://是WebSocket协议的URL前缀,通常用于实时双向通信。 用户的问题在于使用ws://时出现错误,这可能是因为HttpListener本身不支持WebSocket协议。我需要验证这一点。查阅微软的官方文档,确认HttpListener仅支持HTTP和HTTPS,不支持WebSocket。因此,当尝试监听ws://地址时,HttpListener会抛出异常,比如ArgumentException或者HttpListenerException。 接下来,解决方案方面,用户需要改用WebSocket库。例如,使用ASP.NET Core中的WebSocket中间件,或者第三方库如Fleck或SuperWebSocket。这些库专门处理WebSocket协议,能够正确解析ws://和wss://的请求。 另外,用户可能需要检查URL格式是否正确。HttpListener的URL必须以http://https://开头,端口后要有斜杠。例如,http://localhost:8080/是正确的,而ws://localhost:8080/会导致错误。 权限问题也可能导致启动失败,但用户的问题特定于ws://,所以可能不是权限问题。不过,仍可建议用户检查是否有管理员权限或使用netsh命令添加URL ACL,如引用[3]提到的。例如,netsh http add urlacl url=http://+:8080/ user=Everyone。 最后,总结步骤:确认协议支持问题,建议改用WebSocket专用库,检查URL格式,必要时调整权限。同时,确保用户理解HttpListener的局限性,并提供替代方案。</think>在C#使用$HttpListener$时遇到$ws://$协议报错退出的原因及解决方案如下: ### 一、核心原因 1. **协议不支持** $HttpListener$仅支持HTTP/HTTPS协议,无法处理WebSocket协议($ws://$或$wss://$)[^1]。尝试绑定到$ws://$前缀时,会抛出`ArgumentException`或`HttpListenerException` 2. **URL格式冲突** WebSocket的端点URL需以$ws://$开头,但$HttpListener$要求前缀必须以$http://$或$https://$开头[^3] ### 二、解决方案 #### 方法1:改用WebSocket专用库 ```csharp // 使用ASP.NET Core的WebSocket中间件 app.UseWebSockets(); app.Use(async (context, next) => { if (context.WebSockets.IsWebSocketRequest) { using var webSocket = await context.WebSockets.AcceptWebSocketAsync(); await Echo(webSocket); } else { await next(); } }); ``` #### 方法2:调整URL前缀 若需同时支持HTTP和WebSocket,需分别配置: ```csharp var listener = new HttpListener(); // HTTP服务 listener.Prefixes.Add("http://localhost:8080/"); // WebSocket服务需通过专门库实现 listener.Start(); ``` #### 方法3:权限配置 即使协议正确,仍需确保URL ACL权限: ```powershell # 以管理员身份执行 netsh http add urlacl url=http://+:8080/ user=Everyone ``` ### 三、验证步骤 1. 检查URL前缀格式是否符合$http://+:port/$或$http://*:port/$ 2. 使用`netstat -ano | findstr :8080`确认端口未被占用 3. 在代码中捕获异常: ```csharp try { httpListener.Start(); } catch (HttpListenerException ex) { Console.WriteLine($"错误代码 {ex.ErrorCode}: {ex.Message}"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值