1、用socket发的数据都是先发先到的吗
不是。socket中的数据在发送的时候是利用一些网络传输协议再通过网络硬件完成的。比如tcp/ip,udp,snmp等传输协议。这些协议虽然都有自己的特点,但是基本的传输特征都是相似的,即把待传输的数据分割成帧,然后在每一个帧都加上一些特征码,比如协议头,校验码,帧序号等。这些被切碎的数据帧都是独立从源计算机通过网络后发送到目的计算机的。而哪一个帧先到目的计算机确实不能确定的,原因也很简单,中间的网络谁知道会发生什么事情呢,呵呵。但是一旦这些数据帧到达了目的计算机后,那么目的计算机就会通过对应的协议(tcp/ip,udp等),再根据接收到的数据包中的帧序号来把零碎的数据帧组成一个有序的数据帧,最终完全还原从源计算机发送来的整个数据内容。
2、socket中的数据最大能到多少
传统的tcp/ip协议,在网络层限制了tcp/ip的缓冲区大小为2M。

解决方案 »

  1.   

    socket就像一条路,从一边进,一边出。就是一端向socket发数据,另一端从socket接收数据,你要不接收,路就堵住了。但他又不是来一个送一个,他有一个buffer,这个size是可以自己调整的。当数据塞满一个buffer的时候,就送socket的一端送往另一端,但并不保证,每次这个buffer都是满的。或许说是“传送带”更形象点。
      

  2.   

    谢谢楼上的两位大哥,
    我的程序要传送大文件,想用socket做。
    你们能不能给我点建议,我的客户端该怎么发送数据,发什么样的数据呢。
      

  3.   

    传文件可以这么做import java.io.*;
    import java.net.*;
    public class Test{
    public static final int BUFFER_SIZE = 1024 * 50;
    private byte[] buffer; public Test() {
    buffer = new byte[BUFFER_SIZE];
    } public void startServer() throws Exception{
    ServerSocket socket = new ServerSocket(9000);
    Socket client = socket.accept();
    BufferedInputStream in = 
    new BufferedInputStream(
    new FileInputStream("a.zip"));
    BufferedOutputStream out = 
    new BufferedOutputStream( client.getOutputStream() ); int len = 0;
    while ((len = in.read(buffer)) > 0) {
    out.write(buffer, 0, len);
    System.out.print("#");
    }
    in.close();
    out.flush();
    out.close();
    client.close();
    socket.close();
    System.out.println("\nDone!");
    } public void startClient() throws Exception{
                    Socket socket = new Socket("192.168.0.188", 9000);
    BufferedInputStream in = 
    new BufferedInputStream( socket.getInputStream() );
    BufferedOutputStream out = 
    new BufferedOutputStream(
    new FileOutputStream("outa.zip")); int len = 0;
    while ((len = in.read(buffer)) > 0) {
        out.write(buffer, 0, len);
    System.out.print("#");
    }
    in.close();
    out.flush();
    out.close();
    socket.close();
    System.out.println("\nDone!");
    }    public static void main(String[] args) throws Exception{
            //insert code here
    Test test = new Test();
    if (args.length == 0) {
    test.startServer();
    } else {
        test.startClient();
    }    }
    }
      

  4.   

    to takecare(大厅):
    ftp还要装服务,我不想要客户端装服务。
    而且我的程序除了上传文件完毕后,还要写数据库等操作,ftp怎么弄啊
    to  yexiong(英熊):
    我开始的想法也和你的一样,可是当网络堵塞的时候,你不停的往socket里写,而客户端它没有收到,这时候怎么办。还有就是有可能你后往socket里写的数据,客户端先收到,crane_hit(柳絮) 说了啊。大家还有什么好的办法吗?
      

  5.   

    對﹐用socket傳文件是不是有點欠妥當
      

  6.   

    通过socket写数据不用担心数据的先后问题,你怎么往里写的,你收到的还是这个顺序。
    就用yexiong(英熊)的方式是没有问题的,如果你的网络阻塞,服务程序会停在out.write(buffer, 0, len);上的。当然对于一个socket你可以设定阻塞的时候是等待,还是抛例外。
      

  7.   

    对于用socket传送大文件,如果用FTP服务器,客户端取文件的时候还是要建立socket。
      

  8.   

    底层TCP/IP包是不保证顺序,正如柳絮所说。
    但是,这些无序的包,都有ID的,到了上层,会根据ID,把这些包重组。到你手里的数据还是有序的。
      

  9.   

    深的我也不懂,给你copy一段,
    TCP/IP的Socket提供下列三种类型的套接字 
        1。流式套接字(SOCKET_STREAM) 
        提供了一个面向连接,可靠的数据传输服务,数据无差错,无重复的发送且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。FTP协议即采用流式套接字。 
        2。数据报式套接字(SOCKET_DGRAM) 
        提供了一个无连接服务。数据包以独立包形式被发送,不提供无错保证,数据可能丢失或重复,并且接收顺序无序。网络文件系统NFS使用数据报式套接字。 
        3。原始式套接字(SOCKET_RAW) 
        该接口允许对较低层次协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备。 
    也让你们老总上上课。