2015-12-19 2 views
0

у меня есть этот 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, но я не могу управлять, чтобы отправить сбщ назад к моему клиенту

Любая помощь?

+0

Почему вы хотите создать сервер WebSockets, если вы не знаете, как работают сокеты? Разве вы не хотите использовать для этого готовую библиотеку? Код, который вы показываете, принципиально нарушен, содержит множество неправильных предположений и требует много исправления, прежде чем он станет надлежащим сервером HTTP WebSockets. В любом случае, вы отправляете ответ рукопожатия в 'stream.Write()', почему бы вам не использовать одинаковый код для отправки ответа на сообщение? – CodeCaster

+0

Я знаю, как работает 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

+0

Я использую это: http://stackoverflow.com/questions/14974404/socket-programming-multiple-client-one-server работает очень well – lin

ответ

-1

Сора, я думаю, что эта ссылка должна помочь вам начать работу: TCP Server/Client Intro

Он содержит исходный код для очень простой TCP Server/Client. Обратите внимание, что после того, как сервер принимает сокет, он считывает из потока, выводит это сообщение, затем переходит к записи подтверждения этому потоку.

На стороне клиента: после отправки сообщения клиент считывает байты из одного потока, чтобы получить подтверждение сервера.

+1

[Ответы, которые содержат только ссылки в других местах «хорошие ответы»?] (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good- ответы) – CodeCaster