2

私はJavaでそのコードを持っています

public void read() throws IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(this.socket.getInputStream(), "UTF8"));
    String requestURL = null;
    Vector property = new Vector();
    String line;
       //MORE OF CODE
}

完全なコードが必要な場合は、ここに貼り付けてください。

それをC#に書き直したい

しかし、どれがBufferReaderに相当するのかわかりません。ソケットがあり、ソケットInputStream(UTF8を使用)から読み取りたい

ありがとう。

4

3 に答える 3

5

このようなことでうまくいくはずですが、大量の例外的な条件の処理や、サーバーの正常なシャットダウンなどの小さなことが欠けていると確信しています。

static void Main( string[] args )
{
  string      localMachineName    = Dns.GetHostName() ;
  IPHostEntry localMachineInfo    = Dns.GetHostEntry( localMachineName ) ;
  IPAddress   localMachineAddress = localMachineInfo.AddressList[0] ;
  IPEndPoint  localEndPoint       = new IPEndPoint( localMachineAddress , PORT_NUMBER ) ;

  using ( Socket server = new Socket( localEndPoint.AddressFamily , SocketType.Stream , ProtocolType.Tcp ) )
  {
    server.Bind(   localEndPoint                    ) ;
    server.Listen( PENDING_CONNECTIONS_QUEUE_LENGTH ) ;

    while ( true )
    {
      using ( Socket        connection       = server.Accept()                                         )
      using ( NetworkStream connectionStream = new NetworkStream( connection       , FileAccess.Read , false ) )
      using ( TextReader    connectionReader = new StreamReader(  connectionStream , Encoding.UTF8  ) )
      {
        IPEndPoint remoteEndpoint = (IPEndPoint) connection.RemoteEndPoint ;

        string line ;
        while ( null != (line=connectionReader.ReadLine()) )
        {
          line = line.Trim() ;
          Console.WriteLine( "Client says: {0}" , line ) ;
          if ( string.Equals( "exit"     , line , StringComparison.InvariantCultureIgnoreCase ) ) break ;
          if ( string.Equals( "quit"     , line , StringComparison.InvariantCultureIgnoreCase ) ) break ;
          if ( string.Equals( "goodbye"  , line , StringComparison.InvariantCultureIgnoreCase ) ) break ;
          if ( string.Equals( "good-bye" , line , StringComparison.InvariantCultureIgnoreCase ) ) break ;
        }

        connection.Shutdown( SocketShutdown.Both ) ;
        connection.Close() ;
      }
    }

  }

}

ストリームをバッファリングする場合は、NetworkStreamインスタンスを次のように装飾しますBufferedStream

using ( Socket     connection       = server.Accept()                                                            )
using ( Stream     connectionStream = new NetworkStream( connection       , FileAccess.Read , false            ) )
using ( TextReader connectionReader = new StreamReader( new BufferedStream( connectionStream ) , Encoding.UTF8 ) )
{
  IPEndPoint remoteEndpoint = (IPEndPoint) connection.RemoteEndPoint ;

  string line ;
  while ( null != (line=connectionReader.ReadLine()) )
  {
    line = line.Trim() ;
    Console.WriteLine( "Client says: {0}" , line ) ;
    if ( string.Equals( "exit"     , line , StringComparison.InvariantCultureIgnoreCase ) ) break ;
    if ( string.Equals( "quit"     , line , StringComparison.InvariantCultureIgnoreCase ) ) break ;
    if ( string.Equals( "goodbye"  , line , StringComparison.InvariantCultureIgnoreCase ) ) break ;
    if ( string.Equals( "good-bye" , line , StringComparison.InvariantCultureIgnoreCase ) ) break ;
  }

  connection.Shutdown( SocketShutdown.Both ) ;
  connection.Close() ;
}
于 2012-08-17T19:15:10.147 に答える
2

以下のようなものが比較対象になります。

using(StreamReader reader = new StreamReader(Socket.GetStream(), Encoding.UTF8)) {
    while(reader.Peek() >= 0) {
        Console.WriteLine(reader.ReadLine()); // or something...
    }
}
于 2012-08-17T16:43:37.327 に答える
1

それはあなたが望むものに依存します。BufferedReader は、別のリーダーからのデータをバッファリングします。バッファリングされた読み取りだけが必要な場合は、データの読み取り方法に応じて StreamReader などを使用できます。

于 2012-08-17T16:38:17.047 に答える