使用tcplistener服务器将消息发送回客户端
本文关键字:客户端 消息 tcplistener 服务器 使用 | 更新日期: 2023-09-27 18:27:35
我有这个c#类
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Security.Cryptography;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
class Server
{
const string SERVER_IP = "127.0.0.1";
const int SERVER_PORT = 9998;
TcpListener server = new TcpListener(IPAddress.Parse(SERVER_IP), SERVER_PORT);
public void Start ()
{
server.Start();
Console.WriteLine("Server has started on "+SERVER_IP+":"+SERVER_PORT+".{0}Waiting for a connection...", Environment.NewLine);
TcpClient client;
while (true) // Add your exit flag here
{
client = server.AcceptTcpClient();
Socket Socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
ThreadPool.QueueUserWorkItem(ThreadProc, client);
}
}
private void ThreadProc(object obj)
{
Console.WriteLine("A client connected.");
TcpClient client = (TcpClient)obj;
NetworkStream stream = client.GetStream();
int UnactiveTimePeriod = int.Parse(TimeSpan.FromMinutes(1).TotalMilliseconds.ToString());
//enter to an infinite cycle to be able to handle every change in stream
while (true)
{
while (!stream.DataAvailable) ;
Byte[] bytes = new Byte[client.Available];
stream.Read(bytes, 0, bytes.Length);
// translate bytes of request to string
string data = Encoding.UTF8.GetString(bytes);
if (new Regex("^GET").IsMatch(data)) // Handshaking protocol
{
Byte[] response = Encoding.UTF8.GetBytes("HTTP/1.1 101 Switching Protocols" + Environment.NewLine
+ "Connection: Upgrade" + Environment.NewLine
+ "Upgrade: websocket" + Environment.NewLine
+ "Sec-WebSocket-Accept: " + Convert.ToBase64String(
SHA1.Create().ComputeHash(
Encoding.UTF8.GetBytes(
new Regex("Sec-WebSocket-Key: (.*)").Match(data).Groups[1].Value.Trim() + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
)
)
) + Environment.NewLine
+ Environment.NewLine);
stream.Write(response, 0, response.Length);
}
else
{
string msg = DecodeMessage(bytes);
Console.WriteLine(msg);
stream.Flush();
}
//Console.WriteLine(ByteToString(bytes));
}
}
private string DecodeMessage(byte[] bytes)
{
string incomingData = string.Empty;
byte secondByte = bytes[1];
int dataLength = secondByte & 127;
int indexFirstMask = 2;
if (dataLength == 126)
indexFirstMask = 4;
else if (dataLength == 127)
indexFirstMask = 10;
IEnumerable<byte> keys = bytes.Skip(indexFirstMask).Take(4);
int indexFirstDataByte = indexFirstMask + 4;
byte[] decoded = new byte[bytes.Length - indexFirstDataByte];
for (int i = indexFirstDataByte, j = 0; i < bytes.Length; i++, j++)
{
decoded[j] = (byte)(bytes[i] ^ keys.ElementAt(j % 4));
}
return incomingData = Encoding.UTF8.GetString(decoded, 0, decoded.Length);
}
}
我设法使用以下方式接收客户端消息:
string msg = DecodeMessage(bytes);
但是,如何将消息从服务器发送回客户端?
我正在尝试建立一个websocket服务器,但我无法将消息发送回我的客户端
有什么帮助吗?
public void SendString(string str)
{
//ns is a NetworkStream class parameter
//logger.Output(">> sendind data to client ...", LogLevel.LL_INFO);
try
{
var buf = Encoding.UTF8.GetBytes(str);
int frameSize = 64;
var parts = buf.Select((b, i) => new { b, i })
.GroupBy(x => x.i / (frameSize - 1))
.Select(x => x.Select(y => y.b).ToArray())
.ToList();
for (int i = 0; i < parts.Count; i++)
{
byte cmd = 0;
if (i == 0) cmd |= 1;
if (i == parts.Count - 1) cmd |= 0x80;
ns.WriteByte(cmd);
ns.WriteByte((byte)parts[i].Length);
ns.Write(parts[i], 0, parts[i].Length);
}
ns.Flush();
}
catch (Exception ex)
{
_srv.LogError(">> " + ex.Message);
}
}
Sora,我认为这个链接应该有助于您开始:TCP服务器/客户端简介
它包含非常简单的TCP服务器/客户端的源代码。请注意,在服务器接受套接字之后,它从流中读取,输出该消息,然后继续向该流写入Acknowledgement。
在客户端:发送消息后,客户端从同一个流中读取字节,以获得服务器的确认。