代码之家  ›  专栏  ›  技术社区  ›  Michael

C中JSON-RPC客户端的示例代码#

  •  3
  • Michael  · 技术社区  · 17 年前

    我需要一个简单的JSON-RPC1.0客户端,最好使用.NET2.0或更高版本。 我签出了Jrock0.9 他们有几个示例,包括Yahoo reader,但示例演示JSON,而不是JSON-RPC。 我知道我可以使用任何可用的JSON解析器实现RPC部分,比如微软的JRock或两个。我想要现成的样品。

    3 回复  |  直到 17 年前
        1
  •  4
  •   jitter    17 年前
        2
  •  3
  •   user2835140    10 年前

    上面的示例处理HTTP请求。下面是一个与TCP一起工作的变体(Nil类只是一个空类,用于没有返回值的请求):

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Net;
    using Newtonsoft.Json.Linq;
    using AustinHarris.JsonRpc;
    using System.Linq;
    using System.Reactive.Linq;
    using System.Reactive.Subjects;
    using System.Reactive.Concurrency;
    using System.Net.Sockets;
    using System.Text;
    
    namespace JsonRpc
    {
        public class JsonRpcClient
        {
            private static object idLock = new object();
            private static int id = 0;
            public Encoding encoding { get; set; }
    
            public JsonRpcClient(IPEndPoint serviceEndpoint, Encoding encoding)
            {
                this.serviceEndPoint = serviceEndpoint;
                this.encoding = encoding;
            }
    
            private static Stream CopyAndClose(Stream inputStream)
            {
                const int readSize = 256;
                byte[] buffer = new byte[readSize];
                MemoryStream ms = new MemoryStream();
    
                int count = inputStream.Read(buffer, 0, readSize);
                while (count > 0)
                {
                    ms.Write(buffer, 0, count);
                    count = inputStream.Read(buffer, 0, readSize);
                }
                ms.Position = 0;
                inputStream.Close();
                return ms;
            }
    
            public IObservable<JsonResponse<T>> InvokeWithScheduler<T>(string method, object arg, IScheduler scheduler)
            {
                var req = new AustinHarris.JsonRpc.JsonRequest()
                {
                    Method = method,
                    Params = new object[] { arg }
                };
                return InvokeRequestWithScheduler<T>(req, scheduler);
            }
    
            public IObservable<JsonResponse<T>> InvokeSingleArgument<T>(string method, object arg)
            {
                var req = new AustinHarris.JsonRpc.JsonRequest()
                {
                    Method = method,
                    Params = new object[] { arg }
                };
                return InvokeRequest<T>(req);
            }
    
            public IObservable<JsonResponse<T>> InvokeWithScheduler<T>(string method, object[] args, IScheduler scheduler)
            {
                var req = new AustinHarris.JsonRpc.JsonRequest()
                {
                    Method = method,
                    Params = args
                };
                return InvokeRequestWithScheduler<T>(req, scheduler);
            }
    
            public IObservable<JsonResponse<T>> Invoke<T>(string method, object[] args)
            {
                var req = new AustinHarris.JsonRpc.JsonRequest()
                {
                    Method = method,
                    Params = args
                };
                return InvokeRequest<T>(req);
            }
    
            public IObservable<JsonResponse<T>> InvokeRequestWithScheduler<T>(JsonRequest jsonRpc, IScheduler scheduler)
            {
                var res = Observable.Create<JsonResponse<T>>((obs) => 
                    scheduler.Schedule(()=>{
    
                        makeRequest<T>(jsonRpc, obs);
                    }));
    
                return res;
            }
    
            public IObservable<JsonResponse<T>> InvokeRequest<T>(JsonRequest jsonRpc)
            {
                return InvokeRequestWithScheduler<T>(jsonRpc, ImmediateScheduler.Instance);
            }
    
            private string sendAndReceive(string messageToSend) {
                string res = null;
    
            // Data buffer for incoming data.
            byte[] bytes = new byte[1024];
    
            // Connect to a remote device.
            try {
                // Create a TCP/IP  socket.
                Socket socket = new Socket(AddressFamily.InterNetwork, 
                    SocketType.Stream, ProtocolType.Tcp );
    
                // Connect the socket to the remote endpoint. Catch any errors.
                try {
                    socket.Connect(this.serviceEndPoint);
    
                    Console.Write("Socket connected to "+socket.RemoteEndPoint.ToString());
    
                    // Encode the data string into a byte array.
                    byte[] msg = encoding.GetBytes(messageToSend);
    
                    // Send the data through the socket.
                    int bytesSent = socket.Send(msg);
    
                    // Receive the response from the remote device.
                    int bytesRec = socket.Receive(bytes);
                    res = encoding.GetString(bytes,0,bytesRec);
                    Console.Write("Server response = "+res);
    
                    // Release the socket.
                    socket.Shutdown(SocketShutdown.Both);
                    socket.Close();
    
                } catch (ArgumentNullException ane) {
                    Console.Write("ArgumentNullException : "+ane.ToString());
                } catch (SocketException se) {
                    Console.Write("SocketException : " + se.ToString());
                } catch (Exception e) {
                    Console.Write("Unexpected exception : " + e.ToString());
                }
    
            } catch (Exception e) {
                Console.Write(e.ToString());
            }
            return res;
        }
    
            private void makeRequest<T>(JsonRequest jsonRpc, IObserver<JsonResponse<T>> obs)
            {
                JsonResponse<T> rjson = null;
                string sstream = "";
                try
                {
                    int myId;
                    lock (idLock)
                    {
                        myId = ++id;
                    }
                    jsonRpc.Id = myId.ToString();
                }
                catch (Exception ex)
                {
                    obs.OnError(ex);
                }
                try
                {
                    var json = Newtonsoft.Json.JsonConvert.SerializeObject(jsonRpc)+"\r\n";
                    if (typeof(T).Equals(typeof(Nil)))
                    {
                        sendAndReceive(json);
                        rjson = new JsonResponse<T>();
                    }
                    else
                    {
                        sstream = sendAndReceive(json);
                        rjson = Newtonsoft.Json.JsonConvert.DeserializeObject<JsonResponse<T>>(sstream);
                    }
                }
                catch (Exception ex)
                {
                    obs.OnError(ex);
                }
                if (rjson == null)
                {
                    string exceptionMessage = "";
                    try
                    {
                        JObject jo = Newtonsoft.Json.JsonConvert.DeserializeObject(sstream) as JObject;
                        exceptionMessage = jo["Error"].ToString();
                    }
                    catch(Exception ex){
                        exceptionMessage = sstream+"\r\n"+ex.Message;
                    }
                    obs.OnError(new Exception(exceptionMessage));
                }
                else
                {
                    obs.OnNext(rjson);
                }
                obs.OnCompleted();
            }
    
            public IPEndPoint serviceEndPoint { get; set; }
        }
    }
    
        3
  •  0
  •   Austin Harris    14 年前

    下面是一个通过Observables(Rx)公开的.net4客户端的示例。 http://jsonrpc2.codeplex.com/SourceControl/changeset/view/13061#63133

    这里是一个几乎相同的wp7客户端,它也通过Rx公开。 http://jsonrpc2.codeplex.com/SourceControl/changeset/view/13061#282775

    这两个示例都是异步工作的,因此它们可能比您正在寻找的更复杂,当然,除非您需要异步的示例。:)

    推荐文章