.Net核心通过TCP发送/接收JSON

.Net核心通过TCP发送/接收JSON,json,tcp,.net-core,Json,Tcp,.net Core,我想通过TCP发送和接收JSON。 问题:我必须在TCP客户端服务器中发送和接收JSON。我怎样才能做到呢 我使用TcpListener和TcpClient进行连接,我有以下代码: NetworkStream stream = client.GetStream(); var serializer = new JsonSerializer(); var sr = new StreamReader(stream, new UTF8Encoding(), false);

我想通过TCP发送和接收JSON。 问题:我必须在TCP客户端服务器中发送和接收JSON。我怎样才能做到呢

我使用TcpListener和TcpClient进行连接,我有以下代码:

    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);
我能做得更好吗?客户端必须接收JSON(我使用Newtonsoft.JSON),我不知道它是否是好代码。也许你给我写了一些好的练习?或者一些建议

编辑。 现在我写了这样的东西:

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);
    }
}
public static T反序列化fromstream(Stream-Stream)
{
使用(var sr=新的StreamReader(stream))
使用(var jsonTextReader=new jsonTextReader(sr))
{
返回新的JsonSerializer();
}
}
它不起作用,因为Java客户机向我发送的数组类似:[{“name”:“logo”,“session”:“i3fnj34njn780”}],所以如何解决这个问题?我想这样称呼它:
methodar=DeserializeFromStream(client.GetStream())修剪和更换在这里对我不起作用

byte[] buffer = Encoding.ASCII.GetBytes(writer.ToString());
这是不正确的。Per:

  • 编码

    JSON文本应采用Unicode编码。默认编码为
    UTF-8

  • 您正在而不是发送JSON

    StringBuilder sb = new StringBuilder();
    StringWriter sw = new StringWriter(sb);
    JsonWriter writer = new JsonTextWriter(sw);
    
    这是不必要的给某人写信。直接写入网络流:

    using (NetworkStream stream = client.GetStream()) {
      using (TextWriter tw = new StreamWriter(stream, Encoding.UTF8)) {
        using (JsonWriter writer = new JsonTextWriter(tw)) {
         ...
        }
      }
    }
    
    另外,使用


    另外,@CodeCaster所说的一切。这应该是一个合适的Web API,而不是一些流氓TCP服务器。不仅仅是拥有多个请求类型(即路由)的明显问题,而且必须考虑代理(没有允许任意端口)、服务器身份验证(必须通过HTTPS隧道和验证Android应用程序中的服务器证书),允许Web缓存。HTTP头等等,您需要为您的“协议”提供正确的错误状态和错误代码,HTTP提供现成的。一项很好的工作是在JSON之上建立一个合适的、很可能是好的数据模型,比如。

    如果你对套接字一无所知,为什么要使用套接字?只需使用更高级别的协议,如HTTP。它是定义良好、正确实现和彻底测试的,而不是您和我能想到的任何代码。不管怎样,读吧。我们不会按照您的方式给出一般性提示,您必须有一个实际的问题。@CodeCaster但我不使用HTTP协议,我可以清楚地看到这一点,因此我的评论。但是,如果要进行任何有意义的数据交换,无论如何都需要TCP之上的应用程序协议。@CodeCaster在Java中,您可以键入outputStream=socket.getOutputStream();那么为什么我不能在C#中做同样的事情呢?是的,这听起来像是HTTP的理想候选。构建一个Web API,让Android应用程序通过HTTP下载JSON数据,就完成了。不需要自己使用套接字。这种方法仍然是无效的,因为您无法检测导线上的
    11
    实际上是一条包含数字11的JSON消息还是两条包含数字1的JSON消息。消息周围需要有一些帧协议,例如通过长度前缀。或者用一些神奇的分隔符。如果一个连接在它的整个生命周期中只前后发送一条消息,那么它是可以工作的,但我想这不是预期的。