我正在通过NetWorkStream将序列化的对象发送到另一台计算机,在接收端我想反序列化这些对象。
当我通过NetworkStream接收数据时,我将发送许多连续的对象,如何知道第一个JSON文档何时结束才能让JSON.NET从接收到的字符串中解析文档?
还是更好,还有什么方法可以让Json.NET直接从NetworkStream中读取并反序列化/解析生成的JSON文档?
让我知道问候
阿尔伯特
当我试图在一个安装在unix系统上的窗口文件夹上写一个文件时,我有帖子的标题错误.我开发了一个在Linux操作系统上运行Tomcat 6的Web服务,需要在Windows网络文件夹上编写.系统管理员已将其安装在Linux服务器上,并且在其上创建和修改文件没有问题.当我尝试执行发布的代码时,我得到以下异常:
权限被拒绝java.io.IOException:在java.io.File.create文件中的java.io.UnixFileSystem.createFileExclusively(本机方法)中的权限被拒绝(File.java:850)
奇怪的是,它似乎与网络文件夹上的File.createNewFile方法有关,实际上该服务可以在本地文件系统上编写而没有问题,无论是在调试(用于开发服务的PC)还是tomcat文件夹系统管理员在linux服务器上提供了我.文件已创建但为空,并且不会打印create方法后面的日志条目.此外,如果我使用普通的输出流来创建和写入文件我没有问题.
我在网上找不到关于例外的任何解释.由于我对java不是很有经验,我想知道为什么我会收到这个错误.我是以错误的方式使用它吗?这是图书馆的错误吗?我想错过传递一些参数吗?如上所述,我使用普通的输出流解决了这个问题,这是一个提高我对java的理解的问题.
FileOutputStream fos = null;
try{
log.info(String.format("file length: %s",streamAttach.length));
log.info(String.format("check File : %s",filename));
File f = new File(filename);
if(f.exists())
...
boolean done= f.createNewFile();//here comes the exception
//nothing of the following happens
if(!done)
throw new NWSException("error creating file");
log.info(String.format("file %s creato", nomeFile));
Run Code Online (Sandbox Code Playgroud)
提前谢谢您的回答
我在我的应用程序中有一个要求,我需要在网络驱动器中创建文件,但是如果网络断开应用程序挂起一段时间并抛出异常,则在progess中创建文件.
我们有什么方法可以设置超时File.Create吗?
我已经实现了一个模拟串行端口的DataReceived事件的系统,从而使用BeginRead()方法触发从TCPClient对象的NetworkStream读取数据,如下所示:
TcpClient server = new TcpClient();
server.Connect(IPAddress.Parse(ip), 10001);
server.GetStream().BeginRead(buffer, 0, buffer.Length, new AsyncCallback(DataReceived), server.GetStream());
Run Code Online (Sandbox Code Playgroud)
从另一个线程调用以下方法:
private void DataReceived(IAsyncResult result)
{
res = result;
server.GetStream().EndRead(result);
//append received data to the string buffer
stringBuffer += System.Text.ASCIIEncoding.ASCII.GetString(buffer);
//clear the byte array
Array.Clear(buffer, 0, buffer.Length);
//trigger the parser
waitHandle.Set();
server.GetStream().BeginRead(buffer, 0, buffer.Length, new AsyncCallback(DataReceived), buffer);
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常.我可以毫无问题地向网络上的设备发送和接收数据.但是,当我尝试使用以下方法断开连接时,程序崩溃:
public override void disconnect()
{
server.Close();
}
Run Code Online (Sandbox Code Playgroud)
它会引发以下错误:
A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll
Run Code Online (Sandbox Code Playgroud)
我也尝试过如下实现disconnect方法:
server.GetStream().Close();
Run Code Online (Sandbox Code Playgroud)
但这会导致以下错误:
A first chance exception of type …Run Code Online (Sandbox Code Playgroud) 根据问题数量,论坛帖子等,BCL中的TcpClient/NetworkStream实现似乎缺乏对取消IO操作的良好支持.随着.NET 4.5中Async方法的增加,这种缺少取消(或者不错的超时支持)使得事情变得更加令人沮丧,因为在执行IO时取消拒绝监视其CancellationToken的任务变得更加复杂(几乎不可能) .
我已经看到许多实现启动其他线程来监视网络操作并在事情看起来出错时关闭底层流.在我们试图通过使用异步操作来节省这些资源的世界中,这感觉非常脏.
任何人都可以指导我处理有效取消/超时网络IO操作或实际工作的强大第三方实施的指导方向吗?
NetworkStream从流类型的TCP套接字读取C#时,BinaryReader.ReadChar偶尔会引发异常System.ArgumentException: The output char buffer is too small to contain the decoded characters, encoding 'Unicode (UTF-8)'
所有缓冲区都有其默认大小(没有一个是手动设置的),并且设置更大的缓冲区大小不会影响该问题。
完全令人沮丧的是:
使用断点并逐步通过ReadCharcall 行时,不会发生异常
如果ReadChar先于该异常,则不会发生该异常Thread.Sleep(1000)(但仍会在较小的超时时发生)
使用BinaryReaderon 时不会发生异常FileStream,在该位置存储了TCP服务器答案的所有精确字节。
那么,从套接字流中缓冲单个字符可能是与时间相关的问题?
我想解码互联网音频流,但我不想将数据写入磁盘,因此数据仅位于内存中。
但是当我想将数据解码为原始数据时,我必须初始化格式上下文,因此我需要使用 avformat_open_input。但是这些函数需要文件的详细位置。
有没有人有解决方案,如何将我的内存定位数据放入格式上下文中以将此数据解码为原始数据?
我有一个线程向NetworkStream写入请求.另一个线程正在读取此流的响应.
我想让它容错.如果网络出现故障,我希望将NetworkStream替换为全新的.
我让两个线程处理IO/Socket异常.他们每个人都会尝试重新建立连接.我正在努力协调这两个线程.我不得不放置锁定部分,使代码相当复杂且容易出错.
有没有推荐的方法来实现这个?也许使用单个线程但是进行读或写异步?
我使用围绕构建的网络协议TcpClient,BinaryReader用于从底层读取字节NetworkStream(相反,BinaryWriter用于写入)。
该协议以UTF-8编码传输字符串,并正在调用reader.ReadString()以从流中读取它们(writer.Write(someStr)用于写入)。
是否有一种简单的方法来确定从NetworkStream读取(或写入)的字节数,而不必跳过箍来计算所传输字符串的实际字节长度?
请注意,BinaryWriter.Write()在字符串的实际字节之前写入一个7位编码的整数,这会使任何手动计算变得更加复杂。
另请注意,NetworkStream该Position属性不支持该属性,因为它抱怨无法使用Seek。
此外,我想避免将必须复制/扫描数据的中介引入到读/写过程中,以免影响整个系统的性能。
是否有一种简单,高级的方法来计数通过网络接口传递的字节,而无需手动考虑字符串的编码和长度?
现在我有一个通过网络发送文件的应用程序。我正处于需要优化应用程序以便传输速度理想的阶段。
Y - 发送时间。X - 缓冲区大小。
Y 是发送时间,X 是缓冲区/数据包大小。你有没有看到,从我的实验中我注意到如果缓冲区大小太小发送时间很慢,如果缓冲区大小太大发送时间太长。有一个甜蜜点,缓冲区大小似乎是理想的。这就是我需要一些希望在网络方面有更多经验的人的帮助的地方。
现在这就是我发送缓冲区的方式。
for (int i = 0; i < NoOfPackets; i++)
{
if (totalFileLength > netBufferSize)
{
currentPacketLength = netBufferSize;
totalFileLength = totalFileLength - currentPacketLength;
}
else
currentPacketLength = totalFileLength;
SendingBuffer = new byte[currentPacketLength];
compressed.Read(SendingBuffer, 0, currentPacketLength);
netWorkStreamVar.Write(SendingBuffer, 0, currentPacketLength);
}
Run Code Online (Sandbox Code Playgroud)
现在我遇到的最快的发送缓冲区大小是1024 * 256。问题清单:
我如何确定那个甜蜜点?(其中发送缓冲区大小是理想的)
是由文件类型决定的?
是否取决于我的网络配置。
有“行业”标准吗?
networkstream ×10
c# ×6
.net ×2
binaryreader ×2
io ×2
tcpclient ×2
asynchronous ×1
asyncsocket ×1
buffer ×1
c++ ×1
ffmpeg ×1
file ×1
java ×1
json ×1
networking ×1
pcm ×1