我想通过TCP发送和接收JSON。 问题:我必须在我的TCP客户端服务器中发送和接收JSON。我怎样才能实现它?
我使用TcpListener和TcpClient进行连接,我有这段代码:
__init__()
我可以做得更好吗?客户端必须接收JSON(我使用Newtonsoft.Json)并且我不知道它是否是好的代码。也许你给我写了一些好的做法?或者也许一些提示。
修改 现在我写了这样的东西:
NetworkStream stream = client.GetStream();
var serializer = new JsonSerializer();
var sr = new StreamReader(stream, new UTF8Encoding(), false);
var jsonTextReader = new JsonTextReader(sr);
var data = serializer.Deserialize(jsonTextReader).ToString();
Console.WriteLine("Received: {0}", data);
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
JsonWriter writer = new JsonTextWriter(sw);
writer.WriteValue('1');
byte[] buffer = Encoding.ASCII.GetBytes(writer.ToString());
stream.Write(buffer, 0, buffer.Length);
它并不起作用,因为Java客户端发送的数组如:[{&#34; name&#34; :&#34; logo&#34;,&#34; session&#34; :&#34; i3fnj34njn780&#34;}]那么我该如何解决这个问题呢?我想这样称呼它:public static T DeserializeFromStream<T>(Stream stream)
{
using (var sr = new StreamReader(stream))
using (var jsonTextReader = new JsonTextReader(sr))
{
return new JsonSerializer().Deserialize<T>(jsonTextReader);
}
}
修剪和替换在这里对我不起作用。
答案 0 :(得分:2)
byte[] buffer = Encoding.ASCII.GetBytes(writer.ToString());
这是不正确的。每RFC4627:
- 醇>
编码
JSON文本应以Unicode编码。默认编码为
UTF-8。
您不发送JSON。
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
JsonWriter writer = new JsonTextWriter(sw);
这是不必要地编写SB。直接写入网络流:
using (NetworkStream stream = client.GetStream()) {
using (TextWriter tw = new StreamWriter(stream, Encoding.UTF8)) {
using (JsonWriter writer = new JsonTextWriter(tw)) {
...
}
}
}
另外,请使用using
。
另外,@ CodeCaster说的一切。这应该是一个合适的Web API,而不是一些流氓TCP服务器。不仅存在多个请求类型(即路由)的明显问题,而且您必须考虑代理(none将允许某些任意端口),服务器身份验证(您必须通过HTTPS隧道并验证Android APP中的服务器证书),允许网络缓存,HTTP标头等等。你需要适当的错误状态和错误代码,你的##########################################################一个好的工作是建立一个合适的REST API,并且可能是一个好的数据模型在 JSON之上,如JSON-API。