蒙特卡罗服务器计划

时间:2011-11-18 09:44:17

标签: java

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)

我认为问题在于它绑定的套接字。我尝试了不同的类型,但我仍然无法继续

1 个答案:

答案 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()方法 - 它只是有害的。