2016-05-14 11 views
2

C#でwinsockコントロールを使用してクライアント/サーバーアプリケーションを作成しようとしています。私はそれですべてのことをしましたが、私はクライアントからサーバーにデータを送信する場所を張りました。私のプログラムサーバでは、常にipとportを使ってクライアントを待ち受けます。私はクライアントからサーバーにデータを送信します。C#のWinsockサーバー/クライアントアプリケーション

1)するとき、それは、クライアントが接続しているサーバーを開き、サーバーフォームに聞く]ボタンをクリックしてください。我々はイースリークライアントがサーバに接続されていることを知って、このメッセージのIP):クライアントのフォームの第一で

2)私は、接続されたサーバがメッセージを(connectイベント与えることのための接続ボタンをクリックしてください。

3)その後、我々は、データの送信テキストボックスにいくつかのデータを入力し、サーバにデータを送信し、また、クライアントに保存するボタンを送信]をクリックします。以下は

コード:

SERVER:

using System; 
using System.Collections.Generic; 
using System.Windows.Forms; 
using System.Net; 
using System.Threading; 
using System.Net.Sockets; 

namespace Server 
{ 
    public partial class Form1 : Form 
    {  
     public Form1() 
     { 
      InitializeComponent();   
     } 
     const string DEFAULT_SERVER = "ip"; 
     const int DEFAULT_PORT = 120; 

     System.Net.Sockets.Socket serverSocket; 
     System.Net.Sockets.SocketInformation serverSocketInfo; 

     public string Startup() 
     {    
      IPHostEntry hostInfo = Dns.GetHostByName(DEFAULT_SERVER); 
      IPAddress serverAddr = hostInfo.AddressList[0]; 
      var serverEndPoint = new IPEndPoint(serverAddr, DEFAULT_PORT);    
      serverSocket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); 
      serverSocket.Bind(serverEndPoint); 

      return serverSocket.LocalEndPoint.ToString();  
     } 

     public string Listen() 
     { 
      int backlog = 0; 
      try 
      { 
       serverSocket.Listen(backlog); 
       return "Server listening"; 
      } 
      catch (Exception ex) 
      { 
       return "Failed to listen" + ex.ToString(); 
      } 
     } 
     public string ReceiveData() 
     { 
      System.Net.Sockets.Socket receiveSocket; 

      byte[] buffer = new byte[256]; 

      receiveSocket = serverSocket.Accept(); 

      var bytesrecd = receiveSocket.Receive(buffer); 

      receiveSocket.Close(); 

      System.Text.Encoding encoding = System.Text.Encoding.UTF8; 

      return encoding.GetString(buffer); 
     }   

     private void Listen_Click(object sender, EventArgs e) 
     { 
      string serverInfo = Startup(); 
      textBox1.Text = "Server started at:" + serverInfo; 

      serverInfo = Listen(); 
      textBox1.Text = serverInfo; 

      //string datatosend = Console.ReadLine(); 
      //SendData(datatosend); 

      serverInfo = ReceiveData(); 
      textBox1.Text = serverInfo; 

      //Console.ReadLine(); 
     } 

     private void winsock_DataArrival(object sender, AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent e) 
     { 
      ReceiveData(); 
      Listen(); 
     } 

     private void winsock_ConnectEvent(object sender, EventArgs e) 
     { 
      Listen(); 
     } 
    } 
} 

これは、すべてが完璧に動作しているが、ここで私の問題は、私はデータを一度だけで、サーバーにクライアントを形成してしまうことがあります。私は、そのが動作していないクライアントからサーバにデータを再度送信してくれ

追加情報のようないくつかのメッセージ与えた場合:各ソケットアドレス (プロトコル/ネットワークアドレス/ポート)の唯一の使用が正常に許可されている

をサーバーフォーム

serverSocket.Bind(serverEndPoint); 

誰かが私の問題を解決するために私を助けてください。

ありがとうございます。

+0

なぜあなたはreceiveSocket.Closeを呼ぶのですか(); ReceiveData()で??これは問題になる可能性があります。 –

+0

@Mitesh Budhabhatti貴重な命令をいただきありがとうございます。私はその行に//receiveSocket.Close();を命じます。しかし、私は同じ問題を抱えています;-( – Sanjana

+0

@Sanjana - 問題を解決するためにクライアントコードも表示する必要があります –

答えて

1

これを試してください。それは私も先月にあなたのような同じ問題を抱えているが、私はstackoverflowのからこのhttp://stackoverflow.com/questions/21072100/receive-multiple-different-messages-tcp-listner-c-sharpを使用していることを解決し、あなたに

delegate void AddTextCallback(string text); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 
     private void ButtonConnected_Click(object sender, EventArgs e) 
     { 
      ThreadPool.QueueUserWorkItem(new WaitCallback(ServerHandler)); 
     } 

     private void ServerHandler(object state) 
     { 
      TcpListener _listner = new TcpListener(IPAddress.Parse("12.2.54.658"), 145); 

      _listner.Start(); 

      AddText("Server started - Listening on port 145"); 

      Socket _sock = _listner.AcceptSocket(); 

      //AddText("User from IP " + _sock.RemoteEndPoint); 

      while (_sock.Connected) 
      { 
       byte[] _Buffer = new byte[1024]; 

       int _DataReceived = _sock.Receive(_Buffer); 

       if (_DataReceived == 0) 
       { 
        break; 
       } 

       AddText("Message Received..."); 

       string _Message = Encoding.ASCII.GetString(_Buffer); 

       AddText(_Message); 
      } 

      _sock.Close(); 
      AddText("Client Disconnected."); 

      _listner.Stop(); 
      AddText("Server Stop."); 
     } 

     private void AddText(string text) 
     { 
      if (this.listBox1.InvokeRequired) 
      { 
       AddTextCallback d = new AddTextCallback(AddText); 
       this.Invoke(d, new object[] { text }); 
      } 
      else 
      { 
       this.listBox1.Items.Add(text); 
      } 
     } 

に役立ちます。これは、あなたの問題を解決するのに役立つことをたくさん助けます。

私はそれがクライアントソケットとサーバソケットを作成する方法を示しており、ソケットの例を見てここに与えている..あなたはAxMSWinsockLibを使用していないお勧め
+0

Arthiが本当に助けてくれています。 – Sanjana

0

私は100%TCPソケットを理解しているわけではありませんので、ここに入ります。

TCPリスナーソケットを使用すると、最初にポートにバインドして、クライアントに固定の既知のポイントが接続されるようにします。これは、あなたがそのソケットでClose()を呼び出すことによってそれをあきらめるまで、あなたのソケットのためのポートを予約します。

次はあなたがにバインドされたポート上のクライアントの受付処理を開始するために聞いてください。あなたと私はここにいませんでした。

次あなたがAccept()を呼び出します。これは、クライアントが接続するまでブロック(実行を停止)し、そのクライアントとの通信専用のソケットを返します。別のクライアントの接続を許可する場合は、Accept()に再度電話する必要があります。

Accept()によって返されたソケットを使用してクライアントと通信することができます。完了するまで、そのソケットにClose()が呼び出されます。

新しい接続を聞き終えたら、リスナーソケットにClose()と電話してください。あなたが聞くボタンを押したときに


は、しかし次の処理が行われます。

あなたは、正しく結合しますが、クライアントが受信されるまで受け入れるコールにReceiveData()ブロックに、あなたの呼び出しを正しく聞き、開始します。次に、いくつかのデータを受信します(これはTCPなので、データ全体ではないかもしれません)。そして、あなたはすぐにクライアントとの接続を閉じます。

エラーが発生したと思われる場合は、サーバーでもう一度リスンする必要があります。このため、リスナーソケット全体が再起動され、以前のリスナーがまだバインドされているため、ポートにバインドされると、そのポートに何かが割り当てられているため、呼び出しが失敗します。あなたはそれで終わっまで


ソリューションは賢明なあなたはAccept()呼び出しオープンから返されたソケットを維持する必要があります。ソケットのShutdown()メソッドを呼び出すことによってクライアントがクローズを処理するようにするか、通信の終了を示すための規則を確立します。

また、複数のユーザーが接続しようとすると問題に遭遇します。ある時点でスレッドまたは非同期ソケットが必要になりますが、この質問の範囲外です。

関連する問題