2016-04-07 15 views
0

beklemeden alırsınız:soket: göndermek ve ben göndermek ve iki uygulama arasında bilgilere ulaşabilirsiniz gerekir

Host:

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; 

namespace DATA_SENDER_HOST 
{ 
    public partial class Form1 : Form 
    { 
     static Socket sck; 
     static byte[] Buffer { get; set; } 
     Socket accepted; 


     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 

      sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      sck.Bind(new IPEndPoint(0, 1234)); 
      sck.Listen(100); 

      accepted = sck.Accept(); 
      Buffer = new byte[accepted.SendBufferSize]; 
      int bytesRead = accepted.Receive(Buffer); 
      byte[] formatted = new byte[bytesRead]; 
      for (int i = 0; i < bytesRead; i++) 
      { 
       formatted[i] = Buffer[i]; 
      } 
      string strData = Encoding.ASCII.GetString(formatted); 
      if (strData == "1") 
       panel1.BackColor = Color.Red; 
      else if (strData == "2") 
       panel1.BackColor = Color.Blue; 
      sck.Close(); 
      accepted.Close(); 


     } 
    } 
} 

Müşteri:

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; 

namespace CLIENT 
{ 
    public partial class Form1 : Form 
    { 
     static Socket sck; 
     IPEndPoint localEndPoint; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      localEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234); 
      sck.Connect(localEndPoint); 
      string text = "1"; 
      byte[] data = Encoding.ASCII.GetBytes(text); 
      sck.Send(data); 

      sck.Close(); 
     } 

     private void button3_Click(object sender, EventArgs e) 
     { 
      sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      localEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1234); 
      sck.Connect(localEndPoint); 
      string text = "2"; 
      byte[] data = Encoding.ASCII.GetBytes(text); 
      sck.Send(data); 

      sck.Close(); 
     } 
    } 
} 

Ama ev sahibi vardır, bu durumda

verileri istemciden beklemek;
Sorum şu: İstemcinin beklemeden bir şey gönderdiğinde nasıl algılayabilirim (beklemek için "sck.Listen (100)" ifadesinden önce "accept = sck.Accept()")?

+2

Ham soket yerine 'TcpClient 'kullanmayı düşünebilirsiniz ve daha sonra [' NetworkStream']' den yararlanabilirsiniz (https://msdn.microsoft.com/en-us/library/system.net. sockets.networkstream (v = vs.110) .aspx) 'in çeşitli async yöntemleri. – CodingGorilla

+0

Ve ayrıca, [uzunluk ve başlık önekleme!] (Http://stackoverflow.com/questions/35233852/tcp-client-to-server-communication/35240061#35240061) –

cevap

1

Bunu yapmanın geleneksel yolu, Dinle() işlevini sonsuz bir döngüde başka bir iş parçacığında gerçekleştirmektir (sonsuz bağlantıya sahip bir sunucu oluşturmaya çalışıyorsanız), daha sonra dinlemenin tetiklendiği her zaman yangın kodu.

Yani böyle bir şey:

private void button1_Click(object sender, EventArgs e) 
{ 

    sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    sck.Bind(new IPEndPoint(0, 1234)); 

    System.Threading.Thread T = new System.Threading.Thread((new System.Threading.ThreadStart(Listener))); 

    T.Start(); 
} 

private void Listener() 
{ 
    sck.Listen(100); 
    accepted = sck.Accept(); 
    Buffer = new byte[accepted.SendBufferSize]; 
    int bytesRead = accepted.Receive(Buffer); 
    byte[] formatted = new byte[bytesRead]; 
    for (int i = 0; i < bytesRead; i++) 
    { 
     formatted[i] = Buffer[i]; 
    } 
    string strData = Encoding.ASCII.GetString(formatted); 
    panel1.Invoke((MethodInvoker)delegate 
    { 
     if (strData == "1") 
      panel1.BackColor = Color.Red; 
     else if (strData == "2") 
      panel1.BackColor = Color.Blue; 
    }); 
    sck.Close(); 
    accepted.Close(); 
} 

Eğer İşleyici() fonksiyonu içinde sonsuz döngü koyabilirsiniz o sonsuz (bu tür şeyleri çoğu kullanım durumları gibi) prizleri beklemek olmak için

.

Bu yardımcı olur umarım.

İlgili konular