我的服务端做成线程,可以正常接受客户端传过来的数据!但是服务端只能
监听一次!我要求服务端一只处于监听中,参照网上的建议,用while(listening=true){...}来一直监听,但是报错java.io.StreamCorruptedException:invalid Stream header
这是什么问题?
   

解决方案 »

  1.   

    自己顶一下查了下网上的资料:说是ObjectInputStream,ObjectOutputStream的问题,但是为什么不加循环的时候可以?
      

  2.   

    你搜一下ObjectInputStream,我回答过很多这样的问题了Object流在创建的时候会产生一个头数据,来标示对象流开始.用循环可以,但不要在循环外面初始化对象流,而是在循环内部创建,也就是说每循环一次都new一下对象流while(true){
     ...
     ObjectInputStream ois=new ObjectInputStream(inputStream);
     ois.readObject();
     ...
    }发送数据的地方也一样就可以了
      

  3.   

    接受到一个请求就起一个线程,再继续监听
       ServerSocket sc=new ServerSocket(8189);
           while(true)
           {
             final Socket socket =sc.accept();
             Thread thread=new Thread(new Runnable()
                           {public void run()
                               {                            try {
                                    OutputStream out = socket.getOutputStream();
                                    PrintWriter pw=new PrintWriter(out,true);
                                    pw.println("wo kao");
                                } catch (IOException ex) {
                              }                           }
                           });       }
      

  4.   

    public static void main(String[] args) {
         int port = 10000;  //建立通信的主机的端口号
         ServerSocket socServer = null;
         try{
                socServer = new ServerSocket(port);
                Socket Client=socServer.accept();
                while(true){
                   new ChatServer(Client).start();
            }}...
     
    public void run(){   
            try{
                ObjectInputStream ois=new ObjectInputStream(fromClient.getInputStream());
                //对客户端传过来的数据进行处理
                String mess=(String)ois.readObject();...
       } } 
    我是在循环里面新建的啊
      

  5.   

    把 Socket Client=socServer.accept();放到循环里
    不就循环监听拉,我前面那个例子,你可以试下~~
      

  6.   

    public class DelegateOper {
        String addpath=null;
        String delpath=null;
        UserInfo user=null;
        CommonMethod pro=new CommonMethod();    //通过socket把数据从客户端写到服务端(在每个代理上都开一个socket用来监听数据)
        public void addUser(String addpath,UserInfo user){
          String addmessage="客户端向服务段写数据:增加";
          int port=10000;
          Socket socket=null;
          try{
              socket=new Socket("192.168.2.79",port);
              ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
              oos.writeObject(addmessage);
              oos.close();
          } catch (UnknownHostException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
    发送的代码
      

  7.   

    public class ChatServer extends Thread {
        private Socket fromClient=null;//主机与客户机的通信套节字:fromClient
        private static boolean listening=true;
        
        public ChatServer(Socket client){
            fromClient=client;
        }
        
        public static void main(String[] args) {
            int port = 10000;  //建立通信的主机的端口号
            ServerSocket socServer = null;
            try{
                socServer = new ServerSocket(port);
                Socket Client=socServer.accept();
                while(listenin){
                      new ChatServer(Client).start();
             
                }
            }catch (IOException e){
                System.err.println("Could not listen on port: "+port);
                System.exit(1);
            }
        }    public void run(){   
            try{
                ObjectInputStream ois=new ObjectInputStream(fromClient.getInputStream());
            
                //对客户端传过来的数据进行处理
                String mess=(String)ois.readObject();
                String []data=mess.split(",");
                CommonMethod oper=new CommonMethod();
                if(mess!=null&&data[0].equals("add")){
                    oper.IniFile("D://ftp-date//AccInfo.ini");
                    UserInfo user=new UserInfo();
                    AcceptParPro par=new AcceptParPro();
                    user=par.process(data);
            
                    System.out.print(mess);
                    oper.addUserInfo(user);
                    oper.save2();
                } 
             }
                ois.close();
                fromClient.close();//关闭套节字前要关闭所有的流连接
            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }    
        }
    接受的代码...
      

  8.   

    lixiaoxue85(蛮野蛮) ( ) 
    谢谢你的回复,我看用DateObjectOutputStream能解决吗?不行我就用你说的OutPutStream
      

  9.   

    问题解决了,我看了下别人的代码
    0.ObjectInputStream ois=new ObjectInputStream(fromClient.getInputStream());
    这一句都分成2步来做的:
    1.ObjectInputStream ois=null 定义成全局变量
    2.ois=new ObjectInputStream(fromClient.getInputStream()); 在循环中创建
    不知道分开做与一起做的区别在哪里?有点奇怪,感觉没什么区别啊?--------------------------
    一个号不能回复3次,只好又注了个号把结果写出来了
      

  10.   

    开始的代码:
    Socket Client=socServer.accept();  //这里
    while(listenin){
         new ChatServer(Client).start();     
    }
    修改后的代码
    while(listening){
         Socket Client=socServer.accept(); //这里,先后顺序改变了
         new ChatServer(Client).start();
    }
    现在是彻底正常了,写出来给大家参考
      

  11.   

    import java.io.*;
    import java.net.*;
    public class MultiThreadServer{
    public static void main(String[] args)
    {
    try
    {
    //建立通信套接字
    ServerSocket serverSocket = new ServerSocket(8000);
    int clientNo = 1;
    while(true)
    {
    //监听
    Socket connectToClient = serverSocket.accept();
    //如果有连接,建立一个线程进行处理
    HandleAClient thread = new HandleAClient(connectToClient);
    thread.start();
    clientNo++;
    }
    }catch(IOException ex)
    {
    System.err.println(ex);
    }
    }
    }
    //处理客户短消息进程类
    class HandleAClient extends Thread{
    private Socket connectToClient;
    public HandleAClient(Socket socket)
    {
    connectToClient= socket;
    }
    public void run()
    {
    try
    {
    DataInputStream isFromClient = new DataInputStream(
    connectToClient.getInputStrem());
    DataOutputStream osToClient = new DataOutputStream(connectToClient.getOutputStream());
    while(true)
    {
    //业务逻辑
    }
    }catch(IOException ex)
    {
    System.err.println(ex);
    }
    }
    }