陋室铭
永远也不要停下学习的脚步(大道至简至易)

 

操作系统Windows8或以上

 

using  System;
using  System.Net.WebSockets;
using  System.Text;
using  System.Threading;
 
class  Client
{
     static  void  Main( string [] args)
     {
         var client =  new  ClientWebSocket();
         client.ConnectAsync( new  Uri( "ws://echo.websocket.org" ), CancellationToken.None).Wait();
         //client.ConnectAsync(new Uri("ws://localhost:4567/ws/"), CancellationToken.None).Wait();
         StartReceiving(client);
 
         string  line;
         while ((line = Console.ReadLine()) !=  "exit" )
         {
             var array =  new  ArraySegment< byte >(Encoding.UTF8.GetBytes(line));
             client.SendAsync(array, WebSocketMessageType.Text,  true , CancellationToken.None);
         }
     }
 
     static  async  void  StartReceiving(ClientWebSocket client)
     {
         while  ( true )
         {
             var array =  new  byte [4096];
             var result = await client.ReceiveAsync( new  ArraySegment< byte >(array), CancellationToken.None);
             if  (result.MessageType == WebSocketMessageType.Text)
             {
                 string  msg = Encoding.UTF8.GetString(array, 0, result.Count);
                 Console.ForegroundColor = ConsoleColor.DarkBlue;
                 Console.WriteLine( "--> {0}" , msg); 
                 Console.ForegroundColor = ConsoleColor.DarkGray;
             }
         }
     }
}


一、调用ConnectAsync进行连接(感谢例子中使用的websocket.org的免费回声服务)。
二、用ReceiveAsync进行接收,用SendAsync进行发送。

DotNet的WebSocket依赖于底层的http.sys。因此需要操作系统Win8或以上的支持 。
如果你要在Win7等系统上用,则要自己用Socket做,或者用第三方的类库。

 

       #region ClientWebSocket

        readonly ClientWebSocket _webSocket = new ClientWebSocket();
        readonly CancellationToken _cancellation = new CancellationToken();

        public async void WebSocket() {
            try {

                //建立连接
                var url = "ws://121.40.165.18:8800";

                await _webSocket.ConnectAsync(new Uri(url), _cancellation);

                var bsend = new byte[1024];

                await _webSocket.SendAsync(new ArraySegment<byte>(bsend), WebSocketMessageType.Binary, true, _cancellation); //发送数据

                while (true) {
                    var result = new byte[1024];

                    await _webSocket.ReceiveAsync(new ArraySegment<byte>(result), new CancellationToken());//接受数据

                    var lastbyte = ByteCut(result, 0x00);

                    var str = Encoding.UTF8.GetString(lastbyte, 0, lastbyte.Length);

                }

            } catch (Exception ex) {
                Console.WriteLine(ex.Message);
            }
        }

        #endregion

我目前正在研究使用websockets来在客户端/代理和服务器之间进行通信,并决定为此目的查看C#.虽然我之前使用过Websockets和C#,但这是我第一次使用两者.第一次尝试使用以下指南:

http://www.codeproject.com/Articles/618032/Using-WebSocket-in-NET-Part

public static void Main(string[] args)

{

Task t = Echo();

t.Wait();

}

private static async Task Echo()

{

using (ClientWebSocket ws = new ClientWebSocket())

{

Uri serverUri = new Uri("ws://localhost:49889/");

await ws.ConnectAsync(serverUri, CancellationToken.None);

while (ws.State == WebSocketState.Open)

{

Console.Write("Input message ('exit' to exit): ");

string msg = Console.ReadLine();

if (msg == "exit")

{

break;

}

ArraySegment bytesToSend = new ArraySegment(Encoding.UTF8.GetBytes(msg));

await ws.SendAsync(bytesToSend, WebSocketMessageType.Text, true, CancellationToken.None);

ArraySegment bytesReceived = new ArraySegment(new byte[1024]);

WebSocketReceiveResult result = await ws.ReceiveAsync(bytesReceived, CancellationToken.None);

Console.WriteLine(Encoding.UTF8.GetString(bytesReceived.Array, 0, result.Count));

}

}

}

虽然这似乎是按预期的方式工作,但我想知道是否有任何方法可以使用ClientWebSocket中的.NET内置流/读取器?

似乎对我来说,微软拥有丰富的成熟的流和阅读器类集,但随后决定实现ClientWebSocket,只能读取必须手动处理的字节块.

让我说我想传输xml,我很容易将套接字流包装在一个XmlTextReader中,但是这并不是ClientWebSocket显而易见的.

 

posted on 2021-09-03 16:48  宏宇  阅读(1493)  评论(0编辑  收藏  举报