【问题标题】:Java Multi-threaded Server with Array Programming具有数组编程的 Java 多线程服务器
【发布时间】:2015-02-12 20:43:37
【问题描述】:

我是 Java 分布式计算的新手。当我尝试创建具有与客户端连接的多线程的服务器时遇到了一个问题。

客户端将使用随机生成器计算一个 Pi 值,然后将其结果发送到服务器,服务器将收集传入的值并计算并显示平均值。

我希望客户计算 pi。并将其发送到服务器。服务器将收集每个 pi 结果并计算并显示在屏幕上。比如client 1计算的值为3.141,client 2计算的值为3.143,那么服务器会连接各个线程,显示3.142。

它不是通过结果来的。我不知道我的问题是什么。看来我在构建线程时遇到了问题。谁可以帮我这个事?谢谢。

以下是我的代码:

服务器代码:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {
  public static void main(String[] args) throws IOException {
    final int size = 5; //4, 5, 6, etc.
    double sum = 0;
    final int PORT = 1234;
    ServerSocket serverSocket = null;
    MyThread[] a = new MyThread[size];
    Thread[] t = new Thread[size];

    try {
      serverSocket = new ServerSocket(PORT);
    } catch (Exception e) {
      System.out.println("Error: " + e);
      System.exit(0);
    }

    for (int i = 0; i < size; i++) {
      a[i] = new MyThread(serverSocket.accept());
      System.out.println("server is ready...");
      t[i] = new Thread(a);
      t[i].start();
    }
    for (int i = 0; i < size; i++) {
      try {
        t[i].join();
      } catch (Exception e) {
        System.out.println("Error: " + e);
        System.exit(0);
      }
    }
    for (int i = 0; i < size; i++) {
      sum += a[i].getValue();
    }
    System.out.println("The average is: " + sum / size);
  }
}

线程代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class MyThread implements Runnable {
  private double value = 0;
  public double getValue() {
    return value;
  }

  Socket socket;
  MyThread(Socket socket) {
    this.socket = socket;
  }
  public void run() {
    try {
      String message = null;
      BufferedReader buff = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      while ((message = buff.readLine()) != null) {
        System.out.println("Incoming client message: " + message);
        value = Double.parseDouble(message);
      }
      socket.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

客户代码:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Random;

public class MyClient {
  public static void main(String[] args) throws IOException, IOException {
    Socket socket = new Socket("localhost", 1234);
    PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);

    long toss, number_of_tosses, number_in_circle = 0;
    double x, y, distance_squared, pi_estimate;
    Random generator = new Random();
    number_of_tosses = generator.nextInt(5000) + 5000;
    for (toss = 0; toss < number_of_tosses; toss++) {
      x = 2 * Math.random() - 1;
      y = 2 * Math.random() - 1;
      distance_squared = x * x + y * y;
      if (distance_squared <= 1) number_in_circle++;
    }
    pi_estimate = 4 * number_in_circle / ((double) number_of_tosses);
    printWriter.println(pi_estimate);
  }
}

【问题讨论】:

  • 请提供您遇到的任何异常情况和结果。
  • 我想如果我把 t[i] = new Thread(a) 改成 t[i] = new Thread(a[i]) 问题就解决了吧?
  • 这应该是创建自定义线程的正确方法,是的。但我仍然不确定您是否遇到任何异常或其他情况。

标签: java arrays multithreading distributed-computing


【解决方案1】:

当您使用 PrintWriter 时,建议在之后调用 flush() 方法。 像这样:`

 try{
   Socket socket = new Socket("127.0.0.1", 5000);
   PrintWriter writer = new PrintWriter(socket.getOutputStream());
   writer.println("message");
   writer.flush(); // In your case: printWriter.flush();

 catch(IOException exception) {
       exception.printStackTrace();
 }

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    相关资源
    最近更新 更多