2016-12-20 20 views
0

サーバーとクライアントをセットアップして、サーバーからクライアントに文字列を送信しようとしました。 私のクライアントはメッセージを受け取っていません。ネットワーキングには新しいので、エラーが見つからないようです。 マイサーバー:ソケットを使用してサーバーからクライアントに情報を送信する

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 


namespace Server 
{ 
    public class StateObject 
    { 
     public Socket workSocket = null; 
     public const int BufferSize = 1024; 
     public byte[] buffer = new byte[BufferSize]; 
     public StringBuilder sb = new StringBuilder(); 
    } 

    class Program 
    { 
     public static ManualResetEvent allDone = new ManualResetEvent(false); 
     public static ManualResetEvent sendDone = new ManualResetEvent(false); 

     public static void StartListening() 
     { 
      byte[] bytes = new byte[1024]; 
      IPHostEntry ipHostEntry = Dns.GetHostEntry(Dns.GetHostName()); 
      IPAddress ipAddress = ipHostEntry.AddressList[0]; 
      IPEndPoint localEndPointOut = 
      new IPEndPoint(ipAddress, 22222); 

      Console.WriteLine(ipAddress); 

      Socket listenerOut = new Socket(ipAddress.AddressFamily, 
      SocketType.Stream, ProtocolType.Tcp); 
      StateObject state = new StateObject(); 
      Socket handler = state.workSocket; 

      try 
      { 
       listenerOut.Bind(localEndPointOut); 
       listenerOut.Listen(100); 
       while (true) 
       { 
        allDone.Reset(); 
        listenerOut.BeginAccept(new AsyncCallback(outputCallback), listenerOut); 
        allDone.WaitOne(); 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 
      Console.WriteLine("\nPress enter to continue..."); 
      Console.Read(); 
     } 

     public static void outputCallback(IAsyncResult ar) 
     { 
      allDone.Set(); 
      Socket listener = (Socket)ar.AsyncState; 
      Socket handler = listener.EndAccept(ar); 
      StateObject state = new StateObject(); 
      state.workSocket = handler; 
      handler.BeginReceive(state.buffer, 0, 
       StateObject.BufferSize, 0, 
       new AsyncCallback(outputStream), state); 
     } 

     public static void outputStream(IAsyncResult ar) 
     { 
      String content = String.Empty; 
      StateObject state = (StateObject)ar.AsyncState; 
      Socket handler = state.workSocket; 
      byte[] byteData = Encoding.ASCII.GetBytes("test"); 
      while (true) 
      { 
       try 
       { 
        handler.Send(byteData, SocketFlags.None); 
       } 
       catch 
       { 
        Console.WriteLine("Client forcebly closed."); 
       } 
      } 
     } 

     static void Main(string[] args) 
     { 
      StartListening(); 
      Console.ReadKey(); 
     } 
    } 
} 

そして、私のクライアント:現在、私は私のサーバー上Socket.Sendメソッドを使用してい

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
using System.Threading; 

namespace OutputClient 
{ 
    public class StateObject 
    { 
     public Socket workSocket = null; 
     public const int BufferSize = 256; 
     public byte[] buffer = new byte[BufferSize]; 
     public StringBuilder sb = new StringBuilder(); 
    } 

    class Program 
    { 
     private const int port = 22222; 
     private static ManualResetEvent connectDone = 
     new ManualResetEvent(false); 
     private static ManualResetEvent receiveDone = 
     new ManualResetEvent(false); 

     private static String response = String.Empty; 

     private static void StartClient() 
     { 
      IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName()); 
      IPAddress ipAddress = ipHostInfo.AddressList[0]; 
      IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); 
      Socket client = new Socket(ipAddress.AddressFamily, 
        SocketType.Stream, ProtocolType.Tcp); 
      client.BeginConnect(remoteEP, 
       new AsyncCallback(ConnectCallback), client); 
      connectDone.WaitOne(); 

      Receive(client); 
      receiveDone.WaitOne(); 
      Console.WriteLine(response); 
     } 

     private static void ConnectCallback(IAsyncResult ar) 
     { 
      try 
      { 
       Socket client = (Socket)ar.AsyncState; 
       client.EndConnect(ar); 
       connectDone.Set(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 
     } 

     private static void Receive(Socket client) 
     { 
      try 
      { 
       StateObject state = new StateObject(); 
       state.workSocket = client; 

       client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
        new AsyncCallback(ReceiveCallback), state); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 
     } 

     private static void ReceiveCallback(IAsyncResult ar) 
     { 
      try 
      { 
       StateObject state = (StateObject)ar.AsyncState; 
       Socket client = state.workSocket; 
       int bytesRead = client.EndReceive(ar); 

       if (bytesRead > 0) 
       { 
        state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); 
        client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
         new AsyncCallback(ReceiveCallback), state); 
       } 
       else 
       { 
        if (state.sb.Length > 1) 
        { 
         response = state.sb.ToString(); 
        } 
        receiveDone.Set(); 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 
     } 

     static void Main(string[] args) 
     { 
      StartClient(); 
      Console.ReadKey(); 
     } 
    } 
} 

、私も同じ結果に、Socket.BeginSendを使用してみました。

私はエラーが発生しません。データが送信されているようです。しかし、サーバーはクライアントを登録します。

答えて

1

サーバはBeginReceiveを呼び出し、そのハンドラ(outputCallback)でデータの送信を試みます。これは、サーバーがクライアントから何かを受け取るまでデータを送信しないことを意味します。

クライアントは決してデータを送信しません。クライアントを閉じたときにのみ、サーバーは0バイトのメッセージを受信し、データの送信を開始します(これはもちろん、クライアントによっては選択されません)。

関連する問題