服务器代码:
public class StackCalculator implements Runnable {
static Stack<Integer> numbers=new Stack<Integer>();
Socket currentSocket;
Scanner s;
PrintWriter pw;
public static void main(String[] args){
try{
ServerSocket guard=new ServerSocket(6600);
StackCalculator SC=new StackCalculator();
while(true){
SC.currentSocket=guard.accept();
System.out.println("Client connected");
Thread t=new Thread(SC);
t.start();
}
}catch(Exception e){
e.printStackTrace();
}
}
public void run(){
try{
try{
s=new Scanner(currentSocket.getInputStream());
pw=new PrintWriter(currentSocket.getOutputStream());
doService();
}finally{
currentSocket.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
public void doService(){
if(s.hasNext()==false){
return;
}
String request=s.next();
System.out.println("Request received:"+request);
PerformCalculation(request);
}
public void PerformCalculation(String request){
if(request.equals("PUSH")){
try{
String num=s.next();
int n=Integer.parseInt(num);
StackCalculator.numbers.push(n);
pw.println("OK");
}catch(NumberFormatException nf){
pw.println("ERROR");
}
}else if(request.equals("ADD")){
if(StackCalculator.numbers.size()<2){
pw.println("TOO_FEW_ELEMENTS");
}else{
int n1=StackCalculator.numbers.pop();
int n2=StackCalculator.numbers.pop();
int ns=n1+n2;
pw.println("RESULT "+ns);
}
}else if(request.equals("MULT")){
if(StackCalculator.numbers.size()<2){
pw.println("TOO_FEW_ELEMENTS");
}else{
int n1=StackCalculator.numbers.pop();
int n2=StackCalculator.numbers.pop();
int ns=n1*n2;
pw.println("RESULT "+ns);
}
}else if(request.equals("QUIT")){
pw.close();
s.close();
}else{
System.out.println("Unknown Command");
}
}
}
客户端代码:
public static void main(String[] args) {
try{
Socket sc=new Socket("localhost",6600);
Scanner s=new Scanner(sc.getInputStream());
PrintWriter pw=new PrintWriter(sc.getOutputStream());
pw.print("PUSH 11");
System.out.println("response created");
String response=s.nextLine();
System.out.println(response);
pw.close();
sc.close();
}catch(Exception e){
e.printStackTrace();
}
}
它没有传递数据,也没有显示任何错误,也没有程序自行终止。我让代码运行了一个多小时但没有显示进度。它是处于死锁的情况还是输入/输出流的某些问题。
答案 0 :(得分:2)
PrintWriter.print
不会自动刷新,因此您永远不会发送任何内容。您应该使用println
,或在flush()
print(...)