2016-08-03 41 views
0

Ich lerne, wie ich mein C# -Programm mit dem Browser kommunizieren lassen kann. Ich verwende TCP in C# und WebSocket in meinem HTML5-Browser.Keine Antwort von WebSocket nach Anfrage Verbindung vom Browser zu C# -Programm

C#

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Net; 
using System.Net.Sockets; 
using System.IO; 

namespace ShouldWork 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     TCPServer server = new TCPServer(); 
     System.Threading.Thread obj_thread = new System.Threading.Thread(server.startServer); 
     obj_thread.Start(); 
    } 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 

    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     TcpClient client = new TcpClient("127.0.0.1", 7000); 
     NetworkStream ns = client.GetStream(); 
     byte[] data_tosend = createDataPacket(Encoding.UTF8.GetBytes(tx_data_send.Text)); 
     ns.Write(data_tosend, 0, data_tosend.Length); 
    } 

    private byte[] createDataPacket(byte[] data) 
    { 
     byte[] initialize = new byte[1]; 
     initialize[0] = 2; 
     byte[] separator = new byte[1]; 
     separator[0] = 4; 
     byte[] datalength = Encoding.UTF8.GetBytes(Convert.ToString(data.Length)); 
     MemoryStream ms = new MemoryStream(); 
     ms.Write(initialize, 0, initialize.Length); 
     ms.Write(datalength, 0, datalength.Length); 
     ms.Write(separator, 0, separator.Length); 
     ms.Write(data, 0, data.Length); 
     return ms.ToArray(); 
    } 
} 

class TCPServer 
{ 
    TcpListener listener; 
    public TCPServer() 
    { 
     listener = new TcpListener(IPAddress.Any, 7000); 
    } 

    public void startServer() 
    { 
     listener.Start(); 
     while (true) 
     { 
      TcpClient client = listener.AcceptTcpClient(); 
      NetworkStream ns = client.GetStream(); 
      if(ns.ReadByte() == 2) 
      { 
       byte[] recv_data = readStream(ns); 
       Form1.ActiveForm.Invoke(new MethodInvoker(delegate 
       { 
        ((TextBox)Form1.ActiveForm.Controls.Find("tx_recv_data", true)[0]).Text = Encoding.UTF8.GetString(recv_data); 
       })); 
      } 
     } 
    } 

    public byte[] readStream(NetworkStream ns) 
    { 
     byte[] data_buff = null; 

     int b = 0; 
     String buff_length = ""; 

     while ((b = ns.ReadByte()) != 4) 
     { 
      buff_length += (char)b; 
     } 
     int data_length = Convert.ToInt32(buff_length); 
     data_buff = new byte[data_length]; 
     int byte_read = 0; 
     int byte_offset = 0; 
     while (byte_offset < data_length) 
     { 
      byte_read = ns.Read(data_buff, byte_offset, data_length - byte_offset); 
      byte_offset += byte_read; 
     } 

     return data_buff; 
    } 
} 
} 

UI

Wenn der Benutzer Start Server Schaltfläche klickt, würde das Programm dann die TCPServer starten. Dann können wir etwas Text in das zweite Textfeld eingeben und mein Code wird es dann verarbeiten und die Nachricht in der ersten Textbox anzeigen.

UI

Nun möchte Ich mag den Client-Teil an den Browser zu bewegen, so habe ich ein einfaches Web-App und teste Verbindung.

-Code Snippet

<!DOCTYPE html> 
<html> 
<head> 
    <title>Socket demo</title> 
</head> 

<body> 
    <button type="button" onclick="testWebSocket()">Connect to C# server</button><br><br> 

    <script language="javascript" type="text/javascript"> 
    function testWebSocket(){ 

    var socket = new WebSocket('ws://127.0.0.1:7000'); 
    console.log("ssss"); 

    socket.onopen = function(){ 
    console.log("on open"); 
    socket.send("Hello"); 
    } 

    socket.onclose = function(evt){ 
    console.log("on close"); 
    } 

    socket.onerror = function(evt){ 
    console.log("on error"); 
    console.log(evt.data); 
    } 
} 

    </script> 
</body> 
</html> 

Hier ist was los ist ..... die OnOpen Funktion scheint gar nicht zu arbeiten, Chromkonsole tut Display „sss“ und das ist es ....

Ist etwas falsch mit dem Ansatz, den ich verwende?

+0

Ein WebSocket ist ein bisschen mehr als nur eine einfache TCP-Verbindung. Es wird als HTTP-Anforderung initiiert und dann auf einen WebSocket "aktualisiert", sodass Ihre Serverlogik dies unterstützen muss. Ich schlage vor, Sie lesen das WebSocket-Protokoll und den Verbindungsablauf. – jishi

+0

Oder erhalten Sie eine WebSocket-Server-Bibliothek für C#, die bereits das Verbindungsprotokoll und Datenformat unterstützt und damit baut. – jfriend00

+0

@jishi oh ich sehe, in Ordnung wird versuchen, mehr zu lesen. –

Antwort