在socket通讯中获得客户端传来的消息,read()方法只要取得一个字节就返回,read(byte[] b)取得数组长度的数据就返回,而readLine()只要输入流汇总有一行字符串就返回。
我有这样几个问题:
1,read(byte[],b)是读取到字节数目与参数b数组的长度相同才返回吗?但是我用java做服务端,而客户端使用PB的WINSOCK控件方式,当我发送一个字节的数据时,这个方法照样返回,并且只有第一个字节有数据,其他的位置空。
2,readLine()说是要读入一行数据才返回,那么这个一行数据是如何定义的。我使用客户端狂发数据,但是这个方法就是不返回,只要在我关闭客户端的时候才会返回数据。
3,想问一下大家在接受客户端传来数据时的接受方式

解决方案 »

  1.   

    1.读满b数组长度或字节流结束,你属于第二种情况
    2.你可能没有flush,你发的数据还在内存中
    3.不明白
      

  2.   

    socket进来的收是字节流~~
    如果你确认你要处理的流是可打印的字符,那么使用字符流会看上去简单一点。如果不确认,那么用字节流总是不会错的。
      

  3.   

    已经flush了。但是还是不行,只要在关闭socket的时候才能显示出来数据
      

  4.   

    问题是readLine()一直处于阻塞的状态,我如何才能获取数据。也就是说客户端其实已经发送数据了,但是服务端看不到,只有等客户端关闭之后服务端才能显示出数据
      

  5.   

    你可以试试把socket的inputstream导入到Scanner,用Scanner的nextLine()
      

  6.   

    蝈蝈,哪里讲清楚了?
    为什么readLine()会一直阻塞
    为什么read(byte[] b)会收到一个字节就返回了呢?谢谢大家
      

  7.   

    readLine,顾名思义,需要读一行数据。当遇到\r\n或者\t或者遇到结束标志则返回(具体你要自己试一下,我记得是\r\n或者\t)。其实你自己一试就明白。
      

  8.   


    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    ServerSocket serverSoc = null;
    Socket soc = null;
    boolean flag = true; try {
    serverSoc = new ServerSocket(8000);
    soc = serverSoc.accept();
    InputStream input = soc.getInputStream();
    DataInputStream in = new DataInputStream(input); OutputStream output = soc.getOutputStream();
    PrintStream out = new PrintStream(output);
    // to get the ip of client
    InetAddress ip = soc.getInetAddress();
    System.out.println("the client's ip:" + ip);
    int port = soc.getPort();
    System.out.println("the client's port:" + port);
    // send the message to client
    out.println("welcome...");
    // read the message the client send
    while (flag) {
    String str = in.readLine();
    if (!(str.equals("quit"))) {
    System.out.println("the client's message:" + str);
    } else {
    flag=false;
    System.out.println("the client stop...");
    input.close();
    output.close();
    try {
    soc.close(); } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    } } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    我以前练习的,接受客户端传送的数据没问题。
      

  9.   

    以前我使用powerbuilder工具,它提供一个winsock控件。这个控件会在dataarrival时间中监测数据,一旦发现,则调用getdata函数即可获得,根本不管你是几个字节。所以在使用winsock控件时的解包的流程是:
    getdata(ref lb_data),把传过来的二进制数据存起来,然后根据协议一个字节一个字节的拆。
    但java在读取输入流的时候无法获得某一次客户端传过来的数据的长度,只能先把包头解开,获得包长度。然后再读取这个长度的字节。有点糊涂了,winsock是采用什么原理实现的呢?本身对流的概念也不是很清晰
      

  10.   

     out.println("welcome..."); 
     后面应该flush()
      

  11.   

    可以参考下列的例子 
    http://blog.csdn.net/hzhxxx/archive/2009/12/09/4970196.aspx下列描述了JNSP(java  network service platform)服务的部署和功能,如有不明白之处,自己查看源代码,我无力和没有太多时间回答太多的问题.
    源代码一起提供,可以随意修改,发布,并商业化,但请保留作者的信息.为了技术的进步,请注意共享成就.目前已经发布于:http://download.csdn.net/source/1885332;http://hzhxxx.download.csdn.net/
    如果查看后有技术问题探讨和建议的,欢迎致电致信联系.系统架构设计和实现有如下特点:
    A. 采用 Accept-Connect 通讯模型,能统一管理系统中使用的所有 Socket 资源;
    B. 系统支持通信和协议分离的实现原则,支持自定义协议解析模块;通信负责数据收发,协议负责数据鉴别,两者配合实现通信和协议的和谐工作;
    C. 灵活支持业务处理功能重定义,分级支持慢业务和快业务的不同业务处理线程;
    D. 丰富灵活的配置参数,能满足高扩展性;
    E. 配合业务处理和通信模型,能异步的管理所有的交互步骤;
    F. 分布式服务设计和部署,实现动态(热拔插)的增加和较少业务服务器,减少乃至拒绝单点服务;