package montecarlo;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
*
* @author hafiz
*/
public class PICalcDistributedMaster {
ObjectOutputStream ostream;
ObjectInputStream istream;
Socket s;
String numThrows;
public void go(){
Scanner input = new Scanner(System.in);
System.out.println("Please enter number of throws: ");
numThrows = input.next();
int num = Integer.parseInt(numThrows);
try{
ServerSocket sock = new ServerSocket(100);
s = new Socket("127.0.0.1",100);
System.out.println("Waiting for connection");
System.out.println("Connection received from " + s.getInetAddress());
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
pw.println("Sending Number");
pw.println(num);
ostream = new ObjectOutputStream(s.getOutputStream());
ostream.flush();
istream = new ObjectInputStream(s.getInputStream());
System.out.println("IO streams found");
istream.read(); //reads the input stream
}
catch (IOException ie){
ie.printStackTrace();
}
}
public static void main(String [] args){
PICalcDistributedMaster pim = new PICalcDistributedMaster();
pim.go();
}
}
我已将代码调整为你告诉我的内容。我在运行多次后仍然出现错误,我认为这与垃圾收集器问题有关。我的错误是
java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:365)
at java.net.ServerSocket.bind(ServerSocket.java:319)
at java.net.ServerSocket.<init>(ServerSocket.java:185)
at java.net.ServerSocket.<init>(ServerSocket.java:97)
at montecarlo.PICalcDistributedMaster.go(PICalcDistributedMaster.java:31)
at montecarlo.PICalcDistributedMaster.main(PICalcDistributedMaster.java:56)
我认为问题在于它绑定的套接字。我尝试了不同的类型,但我仍然无法继续
答案 0 :(得分:0)
我想建议用较小的块编程。你在这里有一个很多的代码,我认为大部分代码都不会运行:
ServerSocket sock = new ServerSocket(5000);
s = new Socket("127.0.0.1",5000);
s = sock.accept();
此代码创建服务器套接字,将其绑定到端口。
然后创建一个新的套接字s
以连接到服务器套接字。 (还没有听。)
你使用s
结果销毁你的新套接字sock.accept()
- 当你丢失了最后一个引用时,套接字可以免费进行垃圾回收,而你只有一个引用它 - s
。
sock.accept()
调用可能应该阻塞,直到新连接到达。如果它没有阻塞,那意味着你甚至在所有这些代码之前就触发了异常。
顺便提一下,在创建内容后几乎立即覆盖内容的另一个例子是:
String message = "connection successful";
message = (String) istream.readObject();
你从不从你的程序中看到connection successful
,因为你已经覆盖了对字符串的唯一引用。
整个程序中最令人震惊的错误 - 阻止你做出任何真正的进步的错误 - 可能是你扔掉所有异常信息:
try{
go(null);
}
catch(Exception e){
System.err.print("Connection terminated");
}
catch(Exception e) { /* print message */ }
表示您未获得有关程序中实际发生的错误的任何诊断信息。 (由于你从不使用go()
的参数,你应该完全删除它,并在这里删除不必要的null
。)
如果您确信您的产品能够捕获更具体的内容,几乎是防弹的,并且您的客户需要始终可靠的产品,那么这些全部catch
语句中的一个可能会很有用。但它没有开发的地方 - 您需要尽可能详细地提醒您的程序中的错误,以便找到并修复所有错误。
删除它。完全摆脱你的process()
方法 - 它只是有害的。