参考http://www.csharphelp.com/archives/archive133.htmlhttp://www.codeproject.com/csharp/simple_tcp_client.asp

解决方案 »

  1.   

    各位;
    这个应用的大致功能是Client向Server取数据,并把它显示出来,Server的发送的数据是无限条格式为:“DATA YYYYDDMM xxxxxxx”的数据,请问:Server是怎样发送这些数据?还有原理?当Client读取Server发过来的Stream流时,它是不是一条一条的读取,还是怎么读取?是不是取决于Server端的发送方式?
      

  2.   

    不是一条一条的读,即“数据无边界”。
    和server的发送方式无关。
      

  3.   

    TCP发送的数据是无边界的,所以呢,你可以先发送一个4字节的数据长度然后再接着发送实际的数据,自己写个函数实现
    static int SendData(Socket s,byte[] data)
    {
    int total = 0; //已发送的数据
    int size = data.Length; //数据长度
    int dataleft = size; //数据剩余
    int sent;
    //发送数据长度
    byte[] datasize = BitConverter.GetBytes(size);
    sent = s.Send(datasize); //发送数据
    while(total < size)
    {
    //sent为本次发送的实际数据大小
    sent = s.Send(data,total,dataleft,SocketFlags.None);
    total += sent;
    dataleft -= sent;
    }
    return total; //返回发送的数据大小
    }接受也可以自己写个函数,先接受4字节的数据得到下面将要收到的数据大小,再跟这个大小接收数据,函数如下 static byte[] ReceiveData(Socket s)
    {
    int total = 0; //已接受的数据
    int recv;
    byte[] datasize = new byte[4]; //接受数据长度
    recv = s.Receive(datasize,0,4,SocketFlags.None);
    int size = BitConverter.ToInt32(datasize,0); int dataleft = size; //剩余未接受的数据
    byte[] data = new byte[size]; while(total < size)
    {
    recv = s.Receive(data,total,dataleft,SocketFlags.None);
    total += recv;
    dataleft -= recv;
    }
    //返回一个Byte[]数组
    return data;
    }
      

  4.   

    server端的主函数为
    static void Main(string[] args)
    {
    int port = 9014;

    IPEndPoint ipep = new IPEndPoint(IPAddress.Any,port);
    Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    s.Bind(ipep);
    s.Listen(10);
    Console.WriteLine("等待连接....");
    Socket ns = s.Accept(); string strout = Console.ReadLine();
    byte[] data = Encoding.Unicode.GetBytes(strout);
    int send = SendData(ns,data); ns.Close();
    s.Close();
    }
      

  5.   

    Client主函数为
    static void Main(string[] args)
    { int port = 9014;

    IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"),port);
    Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    try
    {
    s.Connect(ipep);
    if(!s.Connected)
    {
    Console.WriteLine("连接失败");
    }
    }
    catch(SocketException e)
    {
    Console.WriteLine("连接失败");
    Console.WriteLine(e.ToString());
    }
    byte[] data = ReceiveData(s);
    strin = Encoding.Unicode.GetString(data);
    Console.WriteLine(strin); s.Shutdown(SocketShutdown.Both);
    s.Close();
    }
    贴的有点乱七八糟的,复制下来看看来成,如果不了解那些函数可以去查查MSDN。
      

  6.   

    有問了: 我有建立了一個Client到Server的連結,我能發送數據到Server,但不能讀取Server發送的數據,也就是發送完Client到Server的數據後,我要共有個聯結讀取Server發送的數據,這樣可行嗎?
    部分代碼如下:cTcpClient= new TcpClient (strIP,iPort); 
    nNetStream  = cTcpClient.GetStream();
    bytes = new byte[256];
    nNetStream.Write(Encoding.ASCII.GetBytes(sConnect.ToCharArray()), 0, sConnect.Length);
               // nNetStream .BeginWrite (bytes ,0,256,AsyncCallback (),state)
                 String data = null;
    Int32 i; 
    while((i = nNetStream.Read(bytes, 0, bytes.Length))!=0) 
    {
    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
    nNetStream.Close();
    }
      

  7.   

    //但不能讀取Server發送的數據与SERVER接受数据的原理相同,你可以在CLIENt上开一个端口进行监听。