本帖最后由 ZHFIFA 于 2010-09-12 06:49:33 编辑

解决方案 »

  1.   

    你的服务器端确定仅是拿了第一行,
    System.out.println(clientSendContent.readLine()); 这行不是在循环中那就只读取一次。
    你应该用一个循环来处理这个 socketSendContent 读取到的东西。
    如果需要能同时处理多个客户端,就需要把这个 Socket 交给另一个线程来处理,服务端主线程接着进行 serverSocket.accept() 等待另一个客户端请求。
            while (true) 
            {
                Socket socketClient = serverSocket.accept();
                System.out.println(socketClient.getInetAddress());
                BufferedReader clientSendContent = new BufferedReader(new InputStreamReader(
                        socketClient.getInputStream()));        
                
                System.out.println(clientSendContent.readLine());
                
            }
      

  2.   

    System.out.println(clientSendContent.readLine());
    这个也要循环
    while(clientSendContent.readLine() != null){
        System.out.println(clientSendContent.readLine());
    }
      

  3.   


    我明明循环了啊,各位大哥看看我的代码啊,我都放在while循环里面了
      

  4.   

    看你代码了,让你2层while循环试试
      

  5.   


    不是,我调试后发现在accept的地方,就已经不动了。
      

  6.   

    当然了,这就是这个API的用法,flush之后,就只能close了。
      

  7.   

    晕,accept方法是阻塞的啊,当然不动了。。
    readLine方法也是阻塞的啊
      

  8.   


    我的意思是,当我客户端发送数据后,accept也不动,也就是不能accept数据
      

  9.   

    不是accept接收数据  accept是要等待客户端连接,接收数据的是readLine方法。如果LZ只要求与一个客户端通信,可以把 
    Socket socketClient = serverSocket.accept();
                System.out.println(socketClient.getInetAddress());
                BufferedReader clientSendContent = new BufferedReader(new InputStreamReader(
                        socketClient.getInputStream()));
    这三句话挪到循环外面。        
      

  10.   

    这个代码给你参考一下吧,以前有人提问的帖子拷的
    public class SocketServer {    public void start()
        {
            try{
                ServerSocket ss = new ServerSocket(10000);
                System.out.println("等待客户端连接");
                int i = 1;
                while(true){
                    Socket s = ss.accept();
                    System.out.println("第"+String.valueOf(i)+"客户端连接进来了");
                    InceptFileThread ifThread = new InceptFileThread(s, i);
                    ifThread.start();
                    i++;
                }
            } catch (IOException e){
                e.printStackTrace();
            }
        }
        
        public static void main(String[] args)
        {
            SocketServer ss = new SocketServer();
            ss.start();
        }
    }class InceptFileThread extends Thread {    private Socket s;
        private int fileNumber;
        
        public InceptFileThread(Socket s, int fileNumber){
            this.s = s;
            this.fileNumber = fileNumber;
        }
        
        public void run(){
            try{
                DataInputStream is = new DataInputStream(s.getInputStream());
                //BufferedReader br = new BufferedReader(new InputStreamReader(is));
                System.out.println("第"+String.valueOf(fileNumber)+"个文件开始上传");
                String fileName = is.readUTF();//.readLine();
                System.out.println("文件名称"+fileName);
                String fileSizeStr = is.readUTF();//.readLine();
                System.out.println("文件长度"+fileSizeStr);
                StringBuilder filePath = new StringBuilder();
                filePath.append("c://file")
                        .append(fileNumber);
                File fileCatalog = new File(filePath.toString());
                if(!fileCatalog.exists())
                    fileCatalog.mkdirs();
                filePath.append("//").append(fileName);
                File file = new File(filePath.toString());
                //FileOutputStream fos = new FileOutputStream(file);
                DataOutputStream fos = new DataOutputStream(new FileOutputStream(file));
                byte[] buffer = new byte[1024];
                System.out.println("开始接收文件");
                int len = 0;
                while((len = is.read(buffer,0,1024)) != -1){
                    fos.write(buffer,0,1024);
                    fos.flush();
                }
                is.close();
                fos.close();
                System.out.println("文件"+fileNumber+"上传完毕");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
      

  11.   

    服务器端每读一行就重新弄一个socket,而客户端就一个,咋行?链接都断了,怎么读
    把你服务器端while里面的内容除了System.out.println(clientSendContent.readLine());
    其余都弄到外面试试
      

  12.   

    或者客户端while里面判断clientSocket.isConnected
    如果连接断开了重新连
      

  13.   

      while (true) 
            {
                Socket socketClient = serverSocket.accept(); // 等待一个客户端
                System.out.println(socketClient.getInetAddress());
                BufferedReader clientSendContent = new BufferedReader(new InputStreamReader(
                        socketClient.getInputStream()));        
                
                System.out.println(clientSendContent.readLine()); //读取这个客户的第一行,那第二行在哪儿读取呢?你这句代码仅读取了第一行之后就回到上面去 accept 等待另一个客户端,而之前的那一个客户端没有人理会。你需要把这一行代码连同人个 Socket 客户端对象交给另一个线程去单独处理它的内容。例如:           new Worker(socket).start();  // 开启一个 worker 线程处理这个客户端的 I/O 情况。之后我们的 ServerSocket 主线程继续监听另一个客户端的请求。
                
            }        class Worker extends Thread { // 这只是一个简化版本,实现上这么简单的设计会有很多意想不到的问题。可以自己运行几次,同时用 Process Explorer 从进程中故意 Kill 掉一个客户端来查看 TCP 连接意外断开(比如掉线)时会出现什么情况,你的服务器是不是够健壮(不健壮的服务器表现为:直接异常退出了,或没有日志用于诊断问题)。另外需要说明的是 Socket 现在都是全双工,如果你同时有 Input 和 Output 而且与客户端没有约定数据交换的次序的话,那就需要同时为 Input 和 Ouput 各开一个线程去处理,当然这种情况也可以用 Java 1.4 开始提供的 NIO (New IO) 的 Socket Channel /Selector 去处理(它不用每个 socket 或 I/O 多开线程而是用对各个 Socket 执行轮询,有事件发生时才工作,因为基本网络不可以忙到每时每刻每个 socket 都有事情做的地步)。                 private Socket client;
                     Worker(Socket client) { this.client = client;}
                     public void run () {
                              while(true){
                                 System.out.println(clientSendContent.readLine()); 
                              }
                     }
            }
      

  14.   

    忍不住登录回复,accept是接受新连接的,不是接受send的数据的。哈哈