- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
好吧,所以我理解 TCP 是基于流而不是基于消息的整个想法 - 我不关心这个。
我想做的是简单地序列化一些东西,然后通过网络将它发送到另一个使用相同的基于消息的协议(protocol)的应用程序。
问题是,每当我序列化数据(我正在序列化为 XML),然后将其写入网络流时,该死的东西永远不会写入它 - 永远不会。直到我关闭程序并关闭流,流才真正发送数据。到底发生了什么——TCP 是否在等待足够的数据发送?是不是在等我什么? (我怀疑前者,因为我可以写简单的行,而它做得很好。)
这是我的客户的代码:
TcpClient client = new TcpClient();
client.Connect(IPAddress.Parse("127.0.0.1"), 10100);
NetworkStream ns = client.GetStream();
StreamWriter writer = new StreamWriter(ns);
ListenerThread th = new ListenerThread(new StreamReader(ns));
new Thread(th.run).Start();
XmlSerializer serializer = new XmlSerializer(typeof(Message), new Type[] {typeof(AuthenticationMessage), typeof(ChangeChatRoomMessage), typeof(ChangePasswordMessage), typeof(ConnectionStatusMessage), typeof(InitializeMessage), typeof(StatusMessage), typeof(SuccessMessage), typeof(TextMessage)});
string file = "<some test xml file>";
while(true)
{
FileStream stream = new FileStream(file, FileMode.Open, FileAccess.Read);
StreamReader reader = new StreamReader(stream);
Message newmsg = (Message)serializer.Deserialize(reader);
stream.Close();
serializer.Serialize(writer, newmsg);
writer.Flush();
file = Console.ReadLine();
}
服务器代码如下:
public void HandleMessage()
{
Message msg = (Message)serializer.Deserialize(reader);
Console.WriteLine("Read Message " + msg.GetType());
}
public void Start()
{
while(true)
{
Socket socket = listener.AcceptSocket();
NetworkStream stream = new NetworkStream(socket);
reader = new StreamReader(stream);
HandleMessage();
stream.Close();
}
}
我的程序现在已经运行了 20 分钟,但没有向服务器发送任何内容。我尝试了所有我能想到的方法,刷新我的写入器缓冲区(TextWriter,显然不是 NetworkStream),并将客户端设置为 NoDelay,等等……发生了什么,为什么?
最佳答案
Alright, so I understand the whole idea that TCP is stream based and not message based - I don't care about that.
其实这很重要,你应该关心它。向服务器发送数据时,您不仅应该尝试发送一些消息,还应该定义一些协议(protocol)(或使用现有协议(protocol)之一),客户端在其中向服务器指示例如它打算发送多少数据。
下面是您如何继续的示例。在此示例中,客户端将总消息的长度作为前 4 个字节发送。
服务器:
class Program
{
static void Main()
{
var listener = new TcpListener(new IPEndPoint(IPAddress.Loopback, 10100));
listener.Start();
while (true)
{
using (var client = listener.AcceptTcpClient())
using (var stream = client.GetStream())
using (var reader = new BinaryReader(stream))
{
// The first 4 bytes of the message will indicate
// the total message length
var length = reader.ReadInt32();
var buffer = reader.ReadBytes(length);
Console.WriteLine("Received {0} bytes from client:", length);
Console.WriteLine("{0}", Encoding.UTF8.GetString(buffer));
}
}
}
}
客户:
class Program
{
static void Main()
{
using (var client = new TcpClient("127.0.0.1", 10100))
using (var stream = client.GetStream())
using (var writer = new BinaryWriter(stream))
{
var message = "<some test xml file>";
var buffer = Encoding.UTF8.GetBytes(message);
// Send the total message length in the first 4 bytes
// so that the server knows how much it has to read
writer.Write(buffer.Length);
writer.Write(buffer);
Console.WriteLine("Successfully sent {0} bytes to server", buffer.Length);
}
}
}
关于c# - NetworkStream 从不写入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7212918/
我希望有人可以解释这种行为,或者它是否可能是 .NET 中的错误。 由于夏令时而及时向后移动意味着 NetworkStream 不注意其属性 ReadTimeout,并且在此代码的情况下会导致循环旋转
我需要从 NetworkStream 中读取,它会随机发送数据,数据包的大小也会不断变化。我正在实现一个多线程应用程序,其中每个线程都有自己的流来读取。如果流中没有数据,应用程序应该一直等待数据到达。
我编写了以下函数来使用 NetworkStream 的异步读取函数(BeginRead 和 EndRead)实现超时功能。它工作正常,直到我注释掉行 Trace.WriteLine("bytesRea
如果 Internet 上的 B 类网络的子网掩码为 255.255.248.0,那么每个子网的最大主机数是多少?(一) 1022(乙) 1023(三) 2046(D) 2047 任何人都可以告诉我如
我读过一个 Tcp Echo Server 的例子,有些事情我不清楚。 TcpClient client = null; NetworkStream netStream = null; try {
This question already has answers here: NetworkStream.ReadAsync with a cancellation token never canc
我正在使用套接字编写一个简单的聊天程序。当我发送长消息时,随后刷新流和短消息,长消息的末尾会附加到短消息中。它看起来像这样: 发送“aaasdsd” 接收“aaasdsd” 发送“bb” 接收“bba
我目前正在从事一个网络项目,我在其中制定了一个二进制协议(protocol)。我的数据包看起来像这样:[1 字节类型][2 字节索引][2 字节长度][长度字节数据] 这是我接收数据包的代码: Net
我的应用程序打开一个 NetworkStream 和一个 StreamWriter 以将 HL7 消息发送到服务。此服务接收 HL7 消息并始终发回确认。我遇到以下问题:在发送 HL7 消息(有效,我
在同一台计算机上,我有 2 个控制台应用程序。 (客户端向服务器发送文件) 在开始之前,我只想提一下我正在使用这两个 async 函数: 从 NetworkStream 读取: public sta
我正在编写一个简单的客户端-服务器应用程序,在查看 MSDN 文档时,我遇到了一些有趣的流类型... http://msdn.microsoft.com/en-us/library/system.io
早上好 我需要一些建议,我正在使用从 TcpClient 流式传输的 networkStream,一切正常,但后来我需要其他地方的一些功能,这需要关闭流。一旦连接关闭,我似乎找不到重新打开连接的方法。
只是尝试使用 Networkstream,这是我写的一个简单代码: 客户端: TcpClient c = new TcpClient(); c.Connect("10.0
我使用 Moq 和 NUnit 作为单元测试框架。 我写了一个方法,将 NetworkStream 对象作为参数: public static void ReadDataIntoBuffer(Netw
好吧,所以我理解 TCP 是基于流而不是基于消息的整个想法 - 我不关心这个。 我想做的是简单地序列化一些东西,然后通过网络将它发送到另一个使用相同的基于消息的协议(protocol)的应用程序。 问
NetworkStream 从套接字缓冲区读取不应该存在的数据时出现问题。顺便说一句,我正在发送非常大的缓冲区。现在我刚刚在本地主机上进行测试。 这是我读取数据的方式,前 4 个字节包含消息的长度,然
我使用 TcpClient 和 NetworkStream 为我们的游戏创建了一个简单的持久套接字连接。正常连接、发送消息和断开连接(退出应用程序/服务器关闭/等)都没有问题。 但是,我遇到了一些问题
有问题的数据是一个 PNG 文件,前缀为 int 大小。 -Sending: ns.Write(BitConverter.GetBytes((int)data.Length),0,4); ns.Wri
NetworkStream.DataAvailable 是否知道发送方的发送缓冲区是否为空?或者它只是简单地指示接收方的读取缓冲区是否有数据?我的假设是后者... 具体来说,对于一些涉及正在进行的对话
我有一个类,它包装了一个 Stream 实例,所以我可以用它来包装 FileStreams 和 NetworkStreams。现在,我想测试流是否仍在传递任何数据,换句话说,我想测试 NetworkS
我是一名优秀的程序员,十分优秀!