我现在的项目中要做一个处理订单的服务端,客户端将包含订单信息的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编程 , 不是很懂 ,想请各位高手帮帮忙 ,在些先谢谢大家了 。
服务端 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编程 , 不是很懂 ,想请各位高手帮帮忙 ,在些先谢谢大家了 。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货