我也不清楚是不是TCP双工造成的问题,情况是这样的:
     
     1.客户端启动两个线程(相差很短时间间隔)向服务器申请下载文件。
     2.服务器读取了第一个线程的请求,发送文件。
     3.服务器响应完第一个线程的请求后,读取不到第二个线程发来请求的信息。
     我想知道,第二个线程发来的数据发送到哪里去了?服务器接收到了没有,如果接收到了怎么才能读取出来,多谢~

解决方案 »

  1.   

    可能我说的不清楚,抱歉。服务器对于每一个用户单独启用一个线程用来服务,我采用的是自制协议的方式交流,服务器的模型为
    BufferedInputStream bis = new BufferedInputStream(socket.getInputStream);
    int orderType;
    while(ture)
    {
        orderType = bis.read();
     
        if(orderType == DOWNLOAD)
        {     }
    }
      

  2.   

       while(true){
                    Socket socket = serverSocket.accept();
                    启动线程进行下载是这样的吗? 
                    
                }
      

  3.   

    服务器端:
    while(true){
      Socket socket = serverSocket.accept();
      启动服务线程之后再次监听客户端连接。
       
      }服务器端服务线程:
    BufferedInputStream bis = new BufferedInputStream(socket.getInputStream);
    int orderType;
    while(ture)
    {
      orderType = bis.read();
     
      if(orderType == DOWNLOAD)
      {  }
    }
      

  4.   

    你把run方法拿出来看看 估计大神路过就帮你解决了(服务器客户端都给给)
      

  5.   

    Client:
    public class XCli 
    {
        private static int bufSize = 32;
        private static byte[] buff = new byte[bufSize];
        private static FileInputStream fis;         
        private static ObjectInputStream ois;
        private static BufferedOutputStream bos;
        private static BufferedInputStream bis;    
        private static Socket s;
        
        public static void main(String[] args)
        {
            try
            {
                s = new Socket("127.0.0.1",20003);
                bis =new BufferedInputStream(s.getInputStream());
                bos = new BufferedOutputStream(s.getOutputStream());
                int s2cType;    
                
                while((s2cType = bis.read())!=-1)           //问题出在这里吗?第一个线程的请求接收到了,第二个线程的请求就没有接收到                 
                {   
                    if(s2cType == 1)
                    {
                        ois = new ObjectInputStream(s.getInputStream());
                        String name = (String)ois.readObject();
                        bos = new BufferedOutputStream(s.getOutputStream());
                        bos.write(1);
                        bos.flush();
                        sendFile(name);                        
                    }
                }        }
            catch(Exception e)
            {
                e.printStackTrace();
            }        
        }
    }服务器主线程:
    public class Xserv {
    private static String savepath = "C:\\hello.txt";
    private static int bufSize = 32;
    private static byte[] buff = new byte[bufSize];
    private static final int serverPort = 20003;
    private static Socket s;
    private static FileOutputStream fos;
    private static BufferedInputStream bis;
    public static final ReentrantLock socketWriteLock = new ReentrantLock();
    public static RequestThread t1;
    public static RequestThread t2;
    public static Object obj = new Object();    public static void main(String[] args) 
        {
              try 
              {   
                ServerSocket ss = new ServerSocket(serverPort);  
                s = ss.accept();
                            t1 = new RequestThread(s,"C:\\Codes\\test.java");
                t1.start();           
                t2 = new RequestThread(s,"C:\\Codes\\test2.java");
                t2.start();
                bis = new BufferedInputStream(s.getInputStream());
                int type = 0;
                
                while((type = bis.read())!=-1)
                {     
                    System.out.println(type);           
                    if(type == 1)
                        resvFile();
                }
            }  
            catch(Exception ioe)
            {
                ioe.printStackTrace();
                System.out.println("bis出错");
            }       
        }
    }
    服务器请求线程:
    class RequestThread extends Thread
    {
        private String name;
        Socket s;
        RequestThread(Socket so,String n)
        {
            s = so;
            name = n;
        }
        
        public void run()
        {
            System.out.println("here");
            Xserv.socketWriteLock.lock();
            try
            {
                BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());
                bos.write(1);
                bos.flush();
                ObjectOutputStream oos = new  ObjectOutputStream(s.getOutputStream());
                oos.writeObject(name);
                oos.flush();
            }
            catch(Exception e)
            {
                
            }  
               
            System.out.println("请求线程结束");
            System.out.println(Xserv.socketWriteLock.getHoldCount());
        }
    }
    可能与上文说的有点出入,请大神帮忙指点,急
      

  6.   

    你是不是没有监听啊 只有监听一次
      ServerSocket ss = new ServerSocket(serverPort);   
      s = ss.accept();
     多用户一般要循环监听的 while(true){
               s = ss.accept();}不知道对不  你改改试试
                   
      

  7.   

    是你的锁没有释放System.out.println("请求线程" + this + "结束");

    System.out.println(Xserv.socketWriteLock.getHoldCount());

    Xserv.socketWriteLock.unlock();
    你试试看行不行
      

  8.   

    当然是要用两个socket了,不然两个文件就合在一起了
      

  9.   

    在线程结束后
    Xserv.socketWriteLock.unlock();