SimpleClientTransportSink.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. //
  2. // System.Runtime.Remoting.Channels.Simple.SimpleClientTransportSink.cs
  3. //
  4. // Author: Dietmar Maurer ([email protected])
  5. //
  6. // 2002 (C) Copyright, Ximian, Inc.
  7. //
  8. using System.Collections;
  9. using System.IO;
  10. using System.Net.Sockets;
  11. using System.Runtime.Remoting.Messaging;
  12. using System.Runtime.Remoting.Channels;
  13. namespace System.Runtime.Remoting.Channels.Simple
  14. {
  15. internal class SimpleClientTransportSink : IClientChannelSink
  16. {
  17. string host;
  18. string object_uri;
  19. int port;
  20. TcpClient tcpclient;
  21. Stream network_stream;
  22. public SimpleClientTransportSink (string url)
  23. {
  24. host = SimpleChannel.ParseSimpleURL (url, out object_uri, out port);
  25. tcpclient = new TcpClient ();
  26. }
  27. public IDictionary Properties
  28. {
  29. get {
  30. return null;
  31. }
  32. }
  33. public IClientChannelSink NextChannelSink
  34. {
  35. get {
  36. // we are the last one
  37. return null;
  38. }
  39. }
  40. public void AsyncProcessRequest (IClientChannelSinkStack sinkStack, IMessage msg,
  41. ITransportHeaders headers, Stream stream)
  42. {
  43. throw new NotImplementedException ();
  44. }
  45. public void AsyncProcessResponse (IClientResponseChannelSinkStack sinkStack,
  46. object state, ITransportHeaders headers,
  47. Stream stream)
  48. {
  49. throw new NotImplementedException ();
  50. }
  51. public Stream GetRequestStream (IMessage msg, ITransportHeaders headers)
  52. {
  53. // no direct access to the stream
  54. return null;
  55. }
  56. public void ProcessMessage (IMessage msg,
  57. ITransportHeaders requestHeaders,
  58. Stream requestStream,
  59. out ITransportHeaders responseHeaders,
  60. out Stream responseStream)
  61. {
  62. // get a network stream
  63. if (network_stream == null) {
  64. tcpclient.Connect (host, port);
  65. network_stream = tcpclient.GetStream ();
  66. }
  67. // send the message
  68. SimpleMessageFormat.SendMessageStream (network_stream, (MemoryStream)requestStream,
  69. SimpleMessageFormat.MessageType.Request,
  70. object_uri);
  71. // read the response fro the network an copy it to a memory stream
  72. SimpleMessageFormat.MessageType msg_type;
  73. string uri;
  74. MemoryStream mem_stream = SimpleMessageFormat.ReceiveMessageStream (network_stream, out msg_type, out uri);
  75. // close the stream
  76. //tcpclient.Close ();
  77. switch (msg_type) {
  78. case SimpleMessageFormat.MessageType.Response:
  79. //fixme: read response message
  80. responseHeaders = null;
  81. responseStream = mem_stream;
  82. break;
  83. default:
  84. throw new Exception ("unknown response mesage header");
  85. }
  86. }
  87. }
  88. }