у меня есть этот C# класспосылает сообщение обратно клиенту с помощью TcpListener сервера
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, но я не могу управлять, чтобы отправить сбщ назад к моему клиенту
Любая помощь?
Почему вы хотите создать сервер WebSockets, если вы не знаете, как работают сокеты? Разве вы не хотите использовать для этого готовую библиотеку? Код, который вы показываете, принципиально нарушен, содержит множество неправильных предположений и требует много исправления, прежде чем он станет надлежащим сервером HTTP WebSockets. В любом случае, вы отправляете ответ рукопожатия в 'stream.Write()', почему бы вам не использовать одинаковый код для отправки ответа на сообщение? – CodeCaster
Я знаю, как работает websocket, это всего лишь тестовый сервер. это еще не конец, но я знаю, что у него много ошибок, и я пытаюсь их исправить, я могу получать сообщения от клиента, но я не могу отправить msg обратно. Я пробую этот код: 'byte [] srvMsg = Encoding.UTF8.GetBytes («Привет от сервера»); stream.Read (srvMsg, 0, srvMsg.Length); stream.Write (srvMsg, 0, srvMsg.Length); ' после этой строки' string msg = DecodeMessage (bytes); Console.WriteLine (msg); 'но ничего не получено на стороне клиента. Javascript code – Sora
Я использую это: http://stackoverflow.com/questions/14974404/socket-programming-multiple-client-one-server работает очень well – lin