请教一个关于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的情况下进行通信?
...全文
623 23 打赏 收藏 转发到动态 举报
写回复
用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)

110,567

社区成员

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

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

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