请教一个关于TcpClient NetworkStream通信的问题

longhui666888 2008-12-29 04:30:44
要做个TcpClient TcpListener通信的程序.
现在通过TcpClient GetStream 获取到的NetworkStream进行通讯.

NetworkStream ns = new NetworkStream(tcpClient.Client, true);
ns.Write(sendData, 0, sendData.Length);
ns.Close();


现在的问题是,ns不关闭,数据发送不出去,关闭了ns,TcpClient也跟着就断开了.请问可不可以在不断开TcpClient的情况下进行通信?
...全文
663 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
longhui666888 2009-01-31
  • 打赏
  • 举报
回复
谢谢大家的关注,因为回家较早,没能及时结贴.
我还是用的Socket,功能强些,可控制度高.
homejiji 2009-01-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 homejiji 的回复:]

不好意思现在才回复你,前段时间在休假。。。。
1。TcpClient close可以关闭已经连接的socket。上面说错了[/Quote]
homejiji 2009-01-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 longhui666888 的回复:]
回复homejiji

是不是即使TcpClient Close掉,连接依然存在呢?如果想真正断掉连接,得通过TcpClient.Client返回的socket去关闭?
那下次再发送数据怎么办?再new 一个TcpClient?然后再去Connect么?
[/Quote]
不好意思现在才回复你,前段时间在休假。。。。
1。是的TcpClient close并不能关闭已经连接的socket。如果你用的是socket那当然用socket关闭比较方便,但是你如果用的是networkstream的话也可以用networkstream的Close方法去关闭
2。只要不断开socket的连接,下次再发数据不需要再new了,直接用原来连接的socket或者networkstream进行发送就可以了


homejiji 2009-01-05
  • 打赏
  • 举报
回复
谢谢楼上的,学习了呵呵
bbbbbb888888 2009-01-05
  • 打赏
  • 举报
回复
果然不一样,我看的是2005的.
homejiji 2009-01-05
  • 打赏
  • 举报
回复
汗。。找到原因了,版本不同。。。
2008会关闭。。
2005之前的不会。。。
那最好还是
加上networkstream的Close方法去关闭。。
homejiji 2009-01-05
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 bbbbbb888888 的回复:]
引自msdn:
TcpClient:
public void Close ()

Close 方法可将该实例标记为已释放,但不关闭 TCP 连接。如果调用此方法,将不会释放用于发送和接收数据的 NetworkStream。您必须调用 Close 方法才能关闭该流和 TCP 连接。
--------------------------------------------------
NetworkStream:
public void Close()

Close 方法释放与 NetworkStream 关联的非托管资源和托管资源。如果 NetworkStream 拥有基础 Soc…
[/Quote]

Close()
释放此 TcpClient 实例,而不关闭基础连接。

备注
Close 方法将该实例标记为已释放并关闭 TCP 连接。调用此方法将关闭 Socket,并且还将关闭用于发送和接收数据的关联 NetworkStream(如果创建有一个这样的流)。
地址。。
http://msdn.microsoft.com/zh-cn/library/system.net.sockets.tcpclient.close.aspx

并且我实际做个例子试验过确实用close就能直接断开连接了。。。

基础连接和基础socket。。没什么区别。。但是已经连接的socket和基础socket有区别。。
bbbbbb888888 2009-01-05
  • 打赏
  • 举报
回复
基础连接和基础socket有什么区别?
bbbbbb888888 2009-01-05
  • 打赏
  • 举报
回复
引自msdn:
TcpClient:
public void Close ()

Close 方法可将该实例标记为已释放,但不关闭 TCP 连接。如果调用此方法,将不会释放用于发送和接收数据的 NetworkStream。您必须调用 Close 方法才能关闭该流和 TCP 连接。
--------------------------------------------------
NetworkStream:
public void Close()

Close 方法释放与 NetworkStream 关联的非托管资源和托管资源。如果 NetworkStream 拥有基础 Socket,则后者也会关闭。

ls的msdn是这么写得哦..
homejiji 2009-01-05
  • 打赏
  • 举报
回复
楼上的。。。close是可以关闭已经连接的NetworkStream和socket的
只是不能关闭基础连接而已。。。
msdn上有解释
并且你可以实际做个例子试一下。。
bbbbbb888888 2009-01-05
  • 打赏
  • 举报
回复
public NetworkStream TcpClient.GetStream ();
用这个方法.不需要new NetworkStream();
对于TcpClient,close并不能关闭连接,而是关闭NetworkStream才是关闭连接.
yhy0611 2008-12-30
  • 打赏
  • 举报
回复
ns.Flush();
一游 2008-12-30
  • 打赏
  • 举报
回复
CLOSE关闭了就关闭了,你那个使用流读写的方法有问题,不是每次都要关的,具体代码我忘了,

不过FLUSH肯定是要加的,这个还是有点应该的,伴随着写的动作flush就会出现
longhui666888 2008-12-30
  • 打赏
  • 举报
回复
回复whn1119

这个方法不管用的,MSDN上说,NetworkStream 不进行缓冲处理,所以此方法对网络流无效。
longhui666888 2008-12-30
  • 打赏
  • 举报
回复
回复homejiji

是不是即使TcpClient Close掉,连接依然存在呢?如果想真正断掉连接,得通过TcpClient.Client返回的socket去关闭?
那下次再发送数据怎么办?再new 一个TcpClient?然后再去Connect么?
whn1119 2008-12-29
  • 打赏
  • 举报
回复
我的理解是.Write方法只是把数据写入了缓冲区
加上.Flush方法应该可以了

菜鸟,如有误,还请高手指点

关注
whn1119 2008-12-29
  • 打赏
  • 举报
回复
NetworkStream ns = new NetworkStream(tcpClient.Client, true);
ns.Write(sendData, 0, sendData.Length);
ns.Flush();

加这一行代码试下呢?
homejiji 2008-12-29
  • 打赏
  • 举报
回复
不用,连接不被异常断开,只要连接一次就够了。上面给你的只是msdn上的一个例子
longhui666888 2008-12-29
  • 打赏
  • 举报
回复
那是不是每次使用TcpClient发送数据,都要从新连接,然后发送数据,最后再Close掉呢?
homejiji 2008-12-29
  • 打赏
  • 举报
回复
我想既然TcpClient是Sock的封装,使用起来应该会更简单,相应的出问题的机会也就比较小.查了些资料,似乎只能使用NetworkStream进行读写.
也可以用socket进行发送,另外你这样使用tcpclient好像有点奇怪。。。

TcpClient tcpClient = new TcpClient ();

。。。。。。。。

// Uses the GetStream public method to return the NetworkStream.
NetworkStream netStream = tcpClient.GetStream ();

if (netStream.CanWrite)
{
Byte[] sendBytes = Encoding.UTF8.GetBytes ("Is anybody there?");
netStream.Write (sendBytes, 0, sendBytes.Length);
}
else
{
Console.WriteLine ("You cannot write data to this stream.");
tcpClient.Close ();

// Closing the tcpClient instance does not close the network stream.
netStream.Close ();
return;
}

if (netStream.CanRead)
{
// Reads NetworkStream into a byte buffer.
byte[] bytes = new byte[tcpClient.ReceiveBufferSize];

// Read can return anything from 0 to numBytesToRead.
// This method blocks until at least one byte is read.
netStream.Read (bytes, 0, (int)tcpClient.ReceiveBufferSize);

// Returns the data received from the host to the console.
string returndata = Encoding.UTF8.GetString (bytes);

Console.WriteLine ("This is what the host returned to you: " + returndata);

}
else
{
Console.WriteLine ("You cannot read data from this stream.");
tcpClient.Close ();

// Closing the tcpClient instance does not close the network stream.
netStream.Close ();
return;
}
netStream.Close();

用socket
TcpClient client = new TcpClient();
Socket s = client.Client;

if (!s.Connected)
{
s.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReceiveBuffer, 16384);
Console.WriteLine(
"client is not connected, ReceiveBuffer set\n");
}
else
Console.WriteLine("client is connected");


加载更多回复(3)
资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 松下电工数字压力传感器用户手册详细介绍了DP-100系列数字压力传感器,涵盖其技术参数、操作方法及适用场景等,适用于各类需要精准压力测量的工业环境。 双屏显示:主屏与输出动作同步,可同时显示当前值和基准值,便于实时监控与调整。显示屏为12段字母数字显示,数字清晰易读。 三色指示:屏幕颜色随传感器状态变化(红、绿、橙),便于快速判断工作状态。 紧凑结构:尺寸仅□30mm,适合空间狭窄的安装环境。 多种操作模式:提供RUN模式(日常操作)、菜单设定模式(深入设置如输出模式切换)及PRO模式(高级功能如应差调整、复制设定)。 安全认证:DP-101(A)/102(A)型号通过特定认证,确保产品安全可靠。 复制功能:可通过数据通信将主传感器设定内容复制到其他传感器,减少人工设定错误,节省时间。 高性能传感:具备高精度,分辨率1/2,000,反应时间2.5ms(最长5,000ms可调),温度特性±0.5%F.S.,重复精度±0.1%F.S. 电子元件吸附检测:监测吸盘是否成功吸附电子元件。 总压力监测:测量管道或容器内的压力水平。 空气泄漏检测:通过压力变化检测泄漏情况。 DP-101□:适用于低压环境(-100kPa至100kPa)。 DP-102□:适用于高压环境(0kPa至1MPa)。 订购时需根据实际需求选择合适型号,考虑传感器的适用范围和工作条件。手册提供详细订购流程及注意事项,包括相关认证信息(如韩国S标志)。 复制功能:通过数据通信将主传感器设定复制到其他传感器,支持多种设定模式,避免设定错误,节省时间。 操作模式:RUN模式用于日常监控,菜单设定模式用于深入设置,PRO模式提供高级功能。 使用前需仔细阅读手册,了解各功能使用方法。遵循安全指南,正确安装和使用传感器,避免损坏。对于

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧