2016-08-03 70 views
0

我正在學習如何讓我的C#程序與瀏覽器通信。 我在我的HTML5瀏覽器中使用C#和WebSocket中的TCP。從瀏覽器請求連接到C#程序後沒有響應從WebSocket

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

當用戶點擊啓動服務器按鈕,程序會再啓動TCPSERVER。然後我們可以在第二個文本框中輸入一些文本,然後我的代碼將處理它並在第一個文本框中顯示消息。現在

UI

我想給客戶的部分轉移到瀏覽器,所以我創建了一個簡單的Web應用程序,並測試了連接。

代碼片斷

<!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> 

這裏是出了什麼問題.....了的OnOpen功能似乎並不在所有的工作,鉻控制檯不會顯示「SSS」,這就是它....

我使用的方法有什麼問題嗎?

+0

WebSocket不僅僅是一個簡單的tcp連接。它是作爲HTTP請求發起的,然後「升級」爲WebSocket,因此您的服務器邏輯需要支持該請求。我建議你閱讀WebSocket協議和連接流程。 – jishi

+0

或者,爲C#獲得一個webSocket服務器庫,該庫已經支持連接協議和數據格式,並以此構建。 – jfriend00

+0

@jishi哦,我明白了,好吧,會嘗試閱讀更多。 –

回答

相關問題