2017-03-23 3 views
-1

Ich habe Beispielcode auf Windows-Formular-Anwendung in .NET, aber ich möchte den gleichen Code in Web-Anwendung implementieren.Ich kann die gleichen Methoden und Klassen verwenden in Web-App, aber es gibt eine Methode (Backgroundworker), die nicht in Web-Anwendung funktioniert. Ich habe versucht mit Hintergrund-Worker in Aspx, aber ich bin nicht in der Lage, Verbindung herzustellen.Wie stelle ich Client-Server-Kommunikation mit TCP/IP-Protokoll in .NET-Webanwendung

Das ist mein Fenster Anwendungscode

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 ServerClient 
{ 
public partial class Form1 : Form 
{ 
    private TcpClient client; 
    public StreamReader STR; 
    public StreamWriter STW; 
    public String receive = "kkkk"; 
    public String text_to_send; 
    TcpListener listener; 
    public Form1() 
    { 
     InitializeComponent(); 
     IPAddress[] localIP = Dns.GetHostAddresses(Dns.GetHostName());    // get by own IP 
     foreach(IPAddress address in localIP) 
     { 
      if(address.AddressFamily == AddressFamily.InterNetwork) 
      { 
       textBox3.Text = address.ToString(); 
      } 
     } 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 

    } 



    private void button2_Click(object sender, EventArgs e)    // start server 
    { 
     listener = new TcpListener(IPAddress.Any, int.Parse(textBox4.Text)); 
     listener.Start(); 
     client = listener.AcceptTcpClient(); 
     STR = new StreamReader(client.GetStream()); 
     STW = new StreamWriter(client.GetStream()); 
     STW.AutoFlush = true; 

     backgroundWorker1.RunWorkerAsync();  // start receiving data in background 
     backgroundWorker2.WorkerSupportsCancellation = true;  //Ability to cancel this thread 
    } 

    private void textBox5_TextChanged(object sender, EventArgs e) 
    { 

    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) //receive data 
    { 
     NetworkStream stream = client.GetStream(); 
     Byte[] bytes = new Byte[256]; 
     String data = null; 
     int i; 

     // Loop to receive all the data sent by the client. 
     while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) 
     { 
      // Translate data bytes to a ASCII string. 
      data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
      byte[] bHex = Encoding.ASCII.GetBytes(data); 
      this.textBox2.Invoke(new MethodInvoker(delegate() { textBox2.AppendText("GSM:" + data + "\n"); })); 
      //Console.WriteLine("Received: {0}", data); 

      // Process the data sent by the client. 
      // data = data.ToUpper(); 

      //byte[] msg = System.Text.Encoding.ASCII.GetBytes(data); 

      // Send back a response. 
      // stream.Write(msg, 0, msg.Length); 
      //Console.WriteLine("Sent: {0}", data); 
     } 

    } 

    private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)   //send data 
    { 
     if(client.Connected) 
     { 
      STW.WriteLine(text_to_send); 
      this.textBox2.Invoke(new MethodInvoker(delegate() { textBox2.AppendText("Me:" + text_to_send + "\n"); })); 
     } 
     else 
     { 
      MessageBox.Show("Send Failed!"); 
     } 
     backgroundWorker2.CancelAsync(); 
    } 
    private void button3_Click(object sender, EventArgs e) 
    { 
     client = new TcpClient(); 
     IPEndPoint IP_End = new IPEndPoint(IPAddress.Parse(textBox5.Text), int.Parse(textBox6.Text)); 

     try 

     { 
      client.Connect(IP_End); 
      if (client.Connected) 
      { 
       textBox2.AppendText("Connected To Server" + "\n"); 
       STW = new StreamWriter(client.GetStream()); 
       STR = new StreamReader(client.GetStream()); 
       STW.AutoFlush = true; 

       backgroundWorker1.RunWorkerAsync();  // start receiving data in background 
       backgroundWorker2.WorkerSupportsCancellation = true;   //Ability to cancel this thread 

      } 
     } 
     catch(Exception x) 
     { 
      MessageBox.Show(x.Message.ToString()); 
     }  

    } 

    private void button1_Click(object sender, EventArgs e)   // Send button 
    { 
     if(textBox1.Text != "") 
     { 
      text_to_send = textBox1.Text; 
      backgroundWorker2.RunWorkerAsync(); 

     } 
     textBox1.Text = ""; 
    } 

    private void textBox3_TextChanged(object sender, EventArgs e) 
    { 

    } 

    private void textBox4_TextChanged(object sender, EventArgs e) 
    { 

    } 
    } 
    } 

bildet, ist es möglich, diesen Code zu bauen Web-Anwendung zu verwenden, oder können Sie mir einen Beispielcode geben, die TCP/IP-Protokoll in Client-Server-Kommunikation im Web-App verwenden Bitte Hilfe. Vielen Dank im Voraus

Antwort

0

Werfen Sie einen Blick auf this Frage für eine enge Antwort auf "wie kann ich einen TCP-Client verwenden".

Ihr Code versucht, einen asynchronen Hintergrund-Worker zu verwenden, der im Kontext einer Webseitenanfrage keinen Sinn ergibt - der Seitenanforderungscode endet, wenn die Methode abgeschlossen ist.

Es ist im Allgemeinen eine sehr, sehr schlechte Idee, synchrone Aufrufe an externe Systeme im Rahmen einer Seitenanforderung auszuführen, außer Sie können sicher sein, dass das externe System mindestens so schnell und skalierbar ist wie Ihre Webanwendung - wenn es langsam ist. Sie werden viele Web-Arbeiter, die auf diesen Service warten, binden, was Ihren Webserver sehr schnell zum Einsturz bringt.

Betrachten Sie stattdessen eine asynchrone Lösung - siehe z. B. project.

Verwandte Themen