自己发现了,是我的一个错误。
在发送的时候最后把writer关闭了,就会产生这样的情况,不过不知道这是为什么啊?

解决方案 »

  1.   

    给你看一个我写过的程序吧,你修改一下用来传XML多线程中的socket通讯(server的多客户服务)注意点:对象输入输出流的创建时间,和创建顺序需要小心,这可能是大多数人会遇到的问题,applet和servelt通讯时也会有同样的问题。
    package zzw.test.server;
    import java.net.*;
    import java.io.*;
    /**
     * <p>服务端管理线程 </p>
     * <p>用于管理所有和客户端通讯的线程, 每当从客户端接受到请求它会开启一个对应与客户端的服务线程</p>
     * @auther [email protected]
     */
    public class ServerManager extends Thread
    {
            //管理线程主体
    public void run(){
    ServerSocket server = null;
    try{
                            //从8001端口斟听请求
    server = new ServerSocket(7788);
    }catch(IOException ioe){ioe.printStackTrace();}
    Socket socket = null;
    System.out.println("开始侦听请求...");
    while(true){
    try{
    //侦听请求
    socket = server.accept();
    serverThread st = new serverThread(socket);
                                    //System.out.println("已经取得请求,开启服务...");
    st.start();
    }catch(Exception e){
    System.out.println("建立侦听出错!"+e.getMessage());
    break;
    } }}
    public static void main (String[] args)
    {
    //server thread manager
    ServerManager sev = new ServerManager();
    sev.start();
    }
    }/**
     *  服务线程
     *  服务于每个客户端请求
     *  主要是进行和客户端的套接口通讯
     **/
    class serverThread extends Thread{
            private InputStream tin;
            private OutputStream tout;
    private ObjectInputStream  in;
    private ObjectOutputStream out;
    private Socket socket;
    private int wait; public serverThread(Socket sock){
    try{
                        socket = sock;
    }catch(Exception e){e.printStackTrace();}
    } public void run(){
    try{
    //synchronized(this){
                                //取得输入输出流,这里必须注意,建立输入输出流必须和客户端对应
                                tin = new BufferedInputStream(socket.getInputStream());
                                tout = new BufferedOutputStream(socket.getOutputStream());
                                in = new ObjectInputStream(tin);
                                out = new ObjectOutputStream( tout );
    //}
    }catch(Exception ee){
    System.out.println("取得输入输出流出错:"+ee.getMessage());
    }
    while(true){
    //受到请求
    String clientRequest;
    try{
                                    //从输入流读入命令对象
                                    Object getted = in.readObject();
                                    clientRequest = (String)getted;
    //根据读入的字符串命令响音客户端
                                    if( clientRequest.startsWith( "HELP" ) ){
    System.out.println( "server getted command : " + clientRequest );
    Thread.sleep(200);
    //将字符串"server will help you! :)"传送到客户端
                                            out.writeObject( "server will help you! :)" );
    out.flush();
    }else
    if( clientRequest.startsWith( "QUIT" ) ){
    System.out.println( "server getted command : " + clientRequest );
    Thread.sleep(200);
    out.writeObject( "server closed!" );
    out.flush();
    break;
    }else{
    if( clientRequest != null ){
    System.out.println( "server getted command : " + clientRequest );
    }
    Thread.sleep(200);
    out.writeObject( "Server can't understand this command!!!" );
    out.flush();
    }
    }catch(Exception e){
    System.out.println("交互中出错:"+e.getMessage());
    break;
    }
    }//end while
    try{
    out.close();
    in.close();
    }catch(Exception e){}
    }
    }
    package zzw.test.client;
    import java.io.*;
    import java.net.*;/**
     * 客户端连接请求管理
     * 创建多个socket连接请求线程,并且进行通讯
     * 传输对象可以自定义类进行传输不过类必须实现序列化接口
     * 客户发送命令给服务器,比如HELP, QUIT(命令服务器结束服务线程)...
     * @auther [email protected]
     */
    public class Client
    { public static void main (String[] args)
    {
    Client c1 = new Client();
    clientThread client=null;
    String url;
    int port;
    //取得参数行
    if( args.length == 2 ){
    url = args[0];
    port = Integer.parseInt( args[1] );
    }else{
    throw new RuntimeException("参数出错!");
    }
    //进行50次套接口连接请求
    for( int i = 1 ; i <= 50 ; i++){
    client = new clientThread( url , port , c1);
    client.start();
    try{
    Thread.sleep(100);
    }catch(Exception e){} }
                    /*
    try{
    System.in.read();
    }catch(Exception e){}
                  */
    }
    }
    /**
     *客户线程
     */
    class clientThread extends Thread{
    public static int count = 0;
    private Object o;//同步器
    private String url;
    private int port;
    private int wait;
    public clientThread(String url , int port , Object o){
    this.port = port ;
    this.wait = 100;
    this.url  = url;
    this.o = o;
    } public void run(){
    //client
    try{
                            InputStream in;
                            OutputStream out;
                            ObjectInputStream oin;
    ObjectOutputStream oout ;
                            //建立过程必须同步,因为同时只能有一个线程在取得连接
    synchronized(o){
    Socket client = new Socket(url , port);
    //建立对象输入、出流
                                    in = new java.io.BufferedInputStream(client.getInputStream());
                                    out = new java.io.BufferedOutputStream(client.getOutputStream());
    }
                                    //取得当前客户线程的名字
    String name = this.getName();
    System.out.println("\n**************************"+name+"*****************************");
                                    //********************************//
                                    //****以下是命令发送和接受应答过程****//
                                    //********************************//                                //1. send Hello object to server
                                    oout = new ObjectOutputStream( out );
                                    //可以自定义类进行传输,不过类必须实现序列化接口
                                    System.out.println("----"+name+" send HELLO to server-------");
    oout.writeObject( "HELLO from "+name );
    oout.flush();
    Thread.sleep(wait);
    //get answer from server
                                    oin = new ObjectInputStream( in );
    System.out.println( " SERVER RESPONSE : "+oin.readObject()+"\n" );
    Thread.sleep(wait); System.out.println("----"+name+" send HELP to server-------");
    //2. send "HELP from..."to server,the name of this thread was sent to server.
                                    oout.writeObject( "HELP from"+name );
    oout.flush();
    Thread.sleep(wait);
    //get answer from server
    System.out.println( " SERVER RESPONSE : " + oin.readObject()+"\n");
    Thread.sleep(wait); System.out.println("---"+name+" send QUIT to server-------");
                                    //3. send QUIT to server,命令服务端对应的服务线程停止
    oout.writeObject( "QUIT from"+name);
    oout.flush();
    Thread.sleep(wait); //get answer from server
    System.out.println( " SERVER RESPONSE : "+ oin.readObject() +"\n");
    Thread.sleep(wait); out.close();
    oin.close(); count++;
    System.out.println("目前线程数:"+count); }catch(Exception e){
    e.printStackTrace();
    } }
    }