我现在的项目中要做一个处理订单的服务端,客户端将包含订单信息的xml文件发给服务端 ,等到服务端接受数据并处理完并给客户端发送处理后的结果后 ,客户端再往下进行 ,但现在有个问题就是我的服务端还没有接受完从客户端传过来的数据 ,这时客户端就向服务端请求处理后的结果 ,当然是取不到了 ,如何让客户端如何等到服务端接受处理完成并返回处理结果后再往下进行 . 我的代码如下 :
服务端 SocketSer.java
package com.test.socket;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer { public static void main(String[] args) { BufferedReader reader=null;
PrintStream output=null;
try {
 synchronized ("") {
 ServerSocket serverSocket=new ServerSocket(2009);
 Socket clientSocket= serverSocket.accept();
 InputStream inputStream=clientSocket.getInputStream();
 reader=new BufferedReader(new InputStreamReader(inputStream));
 System.out.println("Server get date from client is : ");
 /* String string=reader.readLine();
 System.out.println(string);
 string=reader.readLine();
 System.out.println(string);*/
 String string="";
 while((string=reader.readLine())!=null){
System.out.println(string);
 }
 
  System.out.println("接收数据完毕处理后将向客户端发送处理后的结果");
 OutputStream outputStream=clientSocket.getOutputStream();
 output = new PrintStream(outputStream);
 output.println("Hello Client :这是从上海发过来的一张订单 。");
 output.println("This is a second data 2");
 output.flush();
 }
 
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(output!=null)
output.close();
if(reader!=null)
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端类 ClientSocket.java
package com.test.socket;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;import java.net.Socket;public class ClientSocket {

public static void main(String[] args) {
PrintStream output=null;
BufferedReader reader=null;
try {
 Socket clientSocket = new Socket("127.0.0.1",2009);
 OutputStream outputStream=clientSocket.getOutputStream();
 output = new PrintStream(outputStream);
 output.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
 output.println("<order><orderno>20090912ShanHai001</orderno></order>");
 output.flush();
 
 System.out.println("开始从服务端接受处理后的结果.....");
 InputStream inputStream=clientSocket.getInputStream();
 reader=new BufferedReader(new InputStreamReader(inputStream));
             String string="";
 while((string=reader.readLine())!=null){
 System.out.println(string);
 }
} catch (Exception e) {
e.printStackTrace();
} finally{
    try {
     if(output!=null)
     output.close();
     if(reader!=null)
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
先开启服务端后 ,再开启客户端 程序运行后的结果是 :
服务端还没有处理到绿色的部分
System.out.println("接收数据完毕处理后将向客户端发送处理后的结果");
这时客户端已经开始向服务端请求处理后的结果 运行到红色部分了
System.out.println("开始从服务端接受处理后的结果.....");这其中有个小问题如果服务端读取客户端数据时不用while循环就用两次readLine(如服务端被注释的部分) ,则程序中客户端会等到服务端处理完成后 ,再向下进行也就是服务端会执行到绿色的部分 达到了我的要求 但是我并不知道客户端的订单的xml到底有多少行 ,所以还是要用while循环读取数据 ,但是这样客户端总是拿不到服务端处理后的结果 ,因为服务端还没有处理完 ,客户端就向服务端请求处理结果了(好像服务端的循环跳不出来了) .我也是刚接触socket编程 , 不是很懂 ,想请各位高手帮帮忙 ,在些先谢谢大家了 。

解决方案 »

  1.   

    在客服端发送时,还发送一个表示本次发送结束的字符串,然后在服务器端读取时,while循环里比较的条件不是NULL,改成表述结束的字符串。这样应该就能跳出while了
      

  2.   

    我一般就是设一个boolean变量,初始为false,一旦处理完就改成true,再这期间就不断repaint等待页面,为true的时候就进行下一步操作
      

  3.   

    同意三楼的说法 也可以在服务器接受处理的语句下面 像客户端发送一个信号 比如说发送一个“OK”,客户端这面如果收到“OK”,表明服务器端处理完毕,客户端可以接着处理下面的代码