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

解决方案 »

  1.   

    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