日期:2014-05-17  浏览次数:20983 次

关于TcpClient传输数据
我对Socket不是非常了解
现在用TcpClient只是简单的传输数据。
比如我传输一个文件,我首先定义了一个500字节的固定byte[],里面放文件名称,大小等,在接收端先获取500字节,然后,解析。然后根据500字节里面定义的文件长度,来接收传过来的文件流,直到接收到的数据大小和定义的长度一样,表示接收完成。
我始终感觉这种方法比较笨拙:
1,如果头部需要超出500字节的定义,那么这个方法就不行,就需要扩展头部500字节到更大的字节。
2,在网络传输过程中,有没有可能数据传送错误,导致传过来的字节一直达不到头部定义的字节长度,会导致超时?
3,常听说TCP协议三次握手,具体体现在哪里,像第二个问题,如果中途传送数据有丢失,是否会自动重新发送数据?
感谢大家回复

------解决方案--------------------
把信息大小放在包的最前面

接收时先解析大小,如果超了保留下次用,如果不够继续等待接受。

网络无法保证100%,出错你自己重发,这就需要你定义包头信息要详细
------解决方案--------------------
socket与TcpListener/TcpClient/UdpClient 的区别及联系
应用程序可以通过 TCPClient、TCPListener 和 UDPClient 类使用传输控制协议 (TCP) 和用户数据文报协议 (UDP) 服务。这些协议类建立在 System.Net.Sockets.Socket 类的基础之上,负责数据传送的细节。(也就是说TCPClient、TCPListener 和 UDPClient 类是用来简化Socket)

TcpClient 和 TcpListener 使用 NetworkStream 类表示网络。使用 GetStream 方法返回网络流,然后调用该流的 Read 和 Write 方法。NetworkStream 不拥有协议类的基础套接字,因此关闭它并不影响套接字。

UdpClient 类使用字节数组保存 UDP 数据文报。使用 Send 方法向网络发送数据,使用 Receive 方法接收传入的数据文报。

1.TcpClient
TcpClient 类提供了一些简单的方法,用于在同步阻止模式下通过网络来连接、发送和接收流数据。为使 TcpClient 连接并交换数据,使用 TCP ProtocolType 创建的 TcpListener 或 Socket 必须侦听是否有传入的连接请求。可以使用下面两种方法之一连接到该侦听器: 
(1)创建一个 TcpClient,并调用三个可用的 Connect 方法之一。
(2)使用远程主机的主机名和端口号创建 TcpClient。此构造函数将自动尝试一个连接。
给继承者的说明要发送和接收数据,请使用 GetStream 方法来获取一个 NetworkStream。调用 NetworkStream 的 Write 和 Read 方法与远程主机之间发送和接收数据。使用 Close 方法释放与 TcpClient 关联的所有资源。

下面的例子给出怎么利用TcpClient连接到服务器:

using System;

using System.Collections.Generic;

using System.Text;

using System.Net.Sockets;

using System.Net;

 

namespace tcpclient

{

class Program

{

private static int portNum = 11000;

private static string hostName = Dns.GetHostName().ToString();

public static void Main(String[] args)

{

try

{

Console.WriteLine("主机名字:"+ Dns.GetHostName());

Console.WriteLine("主机IP地址:"+ Dns.GetHostAddresses(Dns.GetHostName())[0]);

TcpClient client = new TcpClient(hostName, portNum);

NetworkStream ns = client.GetStream();

byte[] bytes = new byte[1024];

int bytesRead = ns.Read(bytes, 0, bytes.Length);

//将字节流解码为字符串

Console.WriteLine(Encoding.ASCII.GetString(bytes, 0, bytesRead));

client.Close();

}

catch ( 
http://www.2cto.com/kf/201007/52253.html