1.你说的对 是该sleep一下
2。不明白你说的意思

解决方案 »

  1.   

    1、可以利用多线程的方式,起一个线程阻塞读取socket的inputstream--一般直接调用其read方法都是阻塞读取的了。一旦读取到消息后就采用事件触发或其他方法通知需要对消息处理的线程,这样应该是效率及性能最高的设计模式
    2、我没用过直接传送object的方法,因为我觉得网络传输有一个很好的跨语言跨平台的优势--我就常常用不同语言写的程序运行在不同的平台上通讯,所以没用过java自己的序列化对象的方法。
      

  2.   

    2、的意思是说一边用PassPortData s=(PassPortData)oin.readObject();的时候,总是捕捉到ClassNotFoundException,是说发送的类和接受的类不同,实际上是一样的,只是在不同的包里边。
      

  3.   

    我研究了一下Java的源代码 :)
    ObjectInputStream 构造的的时候,你必须捕获IOException异常的,为什么呢?
    因为构造函数会用参数InputStream的readShort()方法读取流的头(streameader)信息,Magic number & Version ;试想:如果用socket.getInputStream()作为ObjectInputStream构造函数的参数会出现什么问题?有可能会造成阻塞。
    和ObjectInputStream对应,ObjectOutputStream构造函数会写两个short的流的头信息。
    假设一个用于传输Object的Socket应用,如果Server和Client,同时声明(objin在前):
    ObjectInputStream objin = new ObjectInputStream(Sock.getInputStream());
    ObjectOutputStream objout = new ObjectOutputStream(Sock.getOutputStream());
    很明显双方都在等待对方输入流的头信息,造成了阻塞。
    可以试试下边这段程序便知:
    import java.io.*;
    public class test{
    public static void main(String args[]){
    try{
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("C:\\test.bin")));
    System.out.println("out has constrcuted.");
    ObjectInputStream in = new ObjectInputStream(System.in); 
    System.out.println("in has constrcuted.");
    }
    catch(IOException e){
    e.printStackTrace();
    }
    }
    }
      

  4.   

    运行上面那个程序会阻塞,一直等到你从控制台输入回车,通常会产生java.io.StreamCorruptedException异常,除非你输入的刚好是StreamHeader信息0xac ed 00 05,运行完成程序检查C盘根目录,文件test.bin已经存在,即使你没有调用writeObject方法,而文件的内容是0xac ed 00 05即Streamheader信息。
      

  5.   

    谢谢您的回答,虽然不是我还是觉得不很清楚(主要是自己理解能力的原因),第一个问题已经解决了,是我在捕获错误以后没有BREAK出去。那么继续请教第二个问题吧/
      

  6.   

    "我看了提示,它在类的名字前自动加了包的名字,因为包不一样,所以一样的类它也认为是不同的,强制转换也不行"
    把他们定义在相同的package中!
      

  7.   

    To masterz(MS MVP) :
    我把他们定义在不同的package中,并说明了相同的类。
    这样做是因为这是一个C/S系统,最终将分布在不同的两台机器上运行,不可能放在一个package 中吧?