2016-01-24 175 views
0

我正在尝试编写一个客户端服务器程序来处理多个客户端请求使用服务器(Server1),而服务器又从另一个服务器(计算服务器)请求计算。多个客户端和多个服务器使用线程

客户端要求形式为a1b1 + a2b2 + ...的表达式,其中a1,b1等是2X2矩阵。用户然后输入表达式,然后输入2X2矩阵的值。客户将每个值与','连接起来,同时将每个矩阵附加';'并将结果字符串发送到服务器(Server1)。

服务器(Server1)在接收到该表达式后,将其分解为标记(用'+'分隔)并将令牌(a1和b1的值)转发给另一个计算服务器。计算服务器(1)从服务器1接收令牌,(2)提取2×2矩阵并执行它们的矩阵乘法,以及(3)将矩阵乘法的结果返回给服务器1。 Server1然后计算计算服务器返回的值的总和,并将最终结果发送回客户端。

例如,如果用户输入像'a1b1 + a2b2'(无空格)的表达式,并且值1,1,1,1(对于矩阵a1)等,则客户端向表单1中的字符串发送一个字符串'1,1,1,1; 2,2,2,2; + 3,3,3,3; 4,4,4,4; +'。 Server1发送1,1,1,1; 2,2,2,2;到计算服务器。计算服务器计算{1,1,1,1}和{2,2,2,2}的矩阵乘法,并将结果{4,4,4,4}返回给Server1。 Server1再次发送3,3,3,3; 4,4,4,4;到计算服务器等等。最后,Server1将表达式{28,28,28,28}的结果返回给客户端。

我的代码如下:

TCPClient.java

import java.io.*; 
import java.net.*; 

public class TCPClient{ 
public static void main(String [] args) throws Exception{ 
    Socket s = new Socket("127.0.0.1",5555); 
    DataOutputStream out = new DataOutputStream(s.getOutputStream()); 

    System.out.print("Enter an expression of the form a1b1+a2b2... : "); 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    String exp = br.readLine(); 
    String exp2 = ""; 
    int terms = exp.length() - exp.replace("+", "").length() + 1; 
    int i = 1; 
    String input; 
    do{ 
     System.out.print("\nEnter value for element 00 of a" + i + ": "); 
     input = br.readLine(); 
     exp2 += input + ","; 
     System.out.print("Enter value for element 01 of a" + i + ": "); 
     input = br.readLine(); 
     exp2 += input + ","; 
     System.out.print("Enter value for element 10 of a" + i + ": "); 
     input = br.readLine(); 
     exp2 += input + ","; 
     System.out.print("Enter value for element 11 of a" + i + ": "); 
     input = br.readLine(); 
     exp2 += input + ";"; 

     System.out.print("\nEnter value for element 00 of b" + i + ": "); 
     input = br.readLine(); 
     exp2 += input + ","; 
     System.out.print("Enter value for element 01 of b" + i + ": "); 
     input = br.readLine(); 
     exp2 += input + ","; 
     System.out.print("Enter value for element 10 of b" + i + ": "); 
     input = br.readLine(); 
     exp2 += input + ","; 
     System.out.print("Enter value for element 11 of b" + i + ": "); 
     input = br.readLine(); 
     exp2 += input + ";+"; 

     i++; 
    }while(i <= terms); 

    System.out.println("\nExpression sent to server = "+exp2);  
    out.writeUTF(exp2); 

    DataInputStream in = new DataInputStream(s.getInputStream()); 
    String result = in.readUTF(); 
    System.out.println("\nResult of expression is "+ result); 
    s.close(); 
} 
} 

TCPServer1.java

import java.io.*; 
import java.net.*; 

public class TCPServer1{ 
public static void main(String [] args) throws Exception{ 
    ServerSocket ss = new ServerSocket(5555); 
    System.out.println("Server started..."); 

    while(true){ 
     Socket s = ss.accept(); 
     Connection c = new Connection(s); 
    } 
} 
} 

class Connection extends Thread{ 
Socket c; 
DataInputStream in; 
DataOutputStream out; 
public Connection(Socket c) throws Exception{ 
    this.c = c; 
    in = new DataInputStream(c.getInputStream()); 
    out = new DataOutputStream(c.getOutputStream()); 
    this.start(); 
} 
public void run(){ 
    try{ 
     String data = new String(); 
     data = in.readUTF(); 
     System.out.println("Received from client: " + data); 
     data = data.substring(0, data.length()-1); 
     System.out.println("data: " + data); 
     String[] tokens = data.split("\\+"); 
     System.out.println("tokens[0]: " + tokens[0]); 
     int[][] finalsum = new int [2][2]; 

     Socket s = new Socket("127.0.0.1",6666); 
     DataOutputStream out2 = new DataOutputStream(s.getOutputStream()); 

     int numtokens = tokens.length; 
     int i = 0; 
     while (i < numtokens) { 
      System.out.println("Writing to CM: " + tokens[i]); 
      out2.writeUTF(tokens[i]); 
      DataInputStream in2 = new DataInputStream(s.getInputStream()); 
      String matmul = in2.readUTF(); 
      System.out.println("Received from Computation Machine: " + matmul); 
      findSum(finalsum, matmul); 
      System.out.println("Finalsum intermediate: " + finalsum[0][0] + " " + finalsum[0][1] + " " + finalsum[1][0] + " " + finalsum[1][1]); 
      i++; 
     } 
     String finalres = String.valueOf(finalsum[0][0]) + "," +String.valueOf(finalsum[0][1]) + ","; 
     finalres += String.valueOf(finalsum[1][0]) + "," + String.valueOf(finalsum[1][1]); 
     System.out.print("finalres to be sent to client: " + finalres); 
     out.writeUTF(finalres); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    }finally{ 
     try{ 
      c.close(); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

public static void findSum(int [][] finalsum, String matmul) { 
    int [][] arr = new int [2][2]; 
    String[] tokens = matmul.split(","); 

    arr[0][0] = Integer.parseInt(tokens[0]); 
    arr[0][1] = Integer.parseInt(tokens[1]); 
    arr[1][0] = Integer.parseInt(tokens[2]); 
    arr[1][1] = Integer.parseInt(tokens[3]); 

    for(int i = 0; i < 2; i++) 
     for(int j = 0; j < 2; j++) 
      finalsum[i][j] += arr[i][j]; 
} 
} 

ComputationServer.java

import java.io.*; 
import java.net.*; 

public class ComputationServer { 
public static void main(String [] args) throws Exception{ 
    ServerSocket ss = new ServerSocket(6666); 
    System.out.println("Computation Server started..."); 
    int count = 1; 

    Socket s = ss.accept(); 
    DataInputStream in; 
    DataOutputStream out; 
    in = new DataInputStream(s.getInputStream()); 
    out = new DataOutputStream(s.getOutputStream()); 

    while(true){ 
     System.out.println("Entered CM " + (count++) + " times"); 
     String data = in.readUTF(); 
     System.out.println("Received from server: " + data); 

     String[] tokens = data.split(";"); 
     System.out.println("tokens[0]: " + tokens[0]); 
     System.out.println("tokens[1]: " + tokens[1]); 

     String[] subtoken1 = tokens[0].split(","); 
     String[] subtoken2 = tokens[1].split(","); 
     int[][] first = new int [2][2]; 
     int[][] second = new int [2][2]; 

     first[0][0] = Integer.parseInt(subtoken1[0]); 
     first[0][1] = Integer.parseInt(subtoken1[1]); 
     first[1][0] = Integer.parseInt(subtoken1[2]); 
     first[1][1] = Integer.parseInt(subtoken1[3]); 

     second[0][0] = Integer.parseInt(subtoken2[0]); 
     second[0][1] = Integer.parseInt(subtoken2[1]); 
     second[1][0] = Integer.parseInt(subtoken2[2]); 
     second[1][1] = Integer.parseInt(subtoken2[3]); 

     int[][] res = new int [2][2]; 

     for(int i = 0; i < 2; i++) 
      for(int j = 0; j < 2; j++) 
       for(int k = 0; k < 2; k++) 
        res[i][j] += first[i][k] * second[k][j]; 

     String matmul = String.valueOf(res[0][0]) + "," +String.valueOf(res[0][1]) + ","; 
     matmul += String.valueOf(res[1][0]) + "," + String.valueOf(res[1][1]); 
     System.out.println("matmul: " + matmul); 
     out.writeUTF(matmul); 
     //out.flush(); 
    } 
} 
} 

为了执行,我先启动Computation服务器,然后启动Server1,然后启动客户端程序。

我面临的问题是我的程序对第一个客户端正常工作,但如果我尝试为第二个客户端计算此值,计算服务器不接受进一步的请求。

如果我按照以下方式更改我的计算服务器,则它不接受来自Server1的第二个令牌(对于第一个客户端)。

ComputationServer.java

import java.io.*; 
import java.net.*; 

public class ComputationServer { 
public static void main(String [] args) throws Exception{ 
    ServerSocket ss = new ServerSocket(6666); 
    System.out.println("Computation Server started..."); 
    int count = 1; 

    while(true){ 
     System.out.println("Entered CM " + (count++) + " times"); 
     Socket s = ss.accept(); 
     DataInputStream in; 
     DataOutputStream out; 
     in = new DataInputStream(s.getInputStream()); 
     out = new DataOutputStream(s.getOutputStream()); 
     String data = in.readUTF(); 
     System.out.println("Received from server: " + data); 
//rest of the code same as above 

任何帮助将非常感激。提前致谢!

+1

哦,男人,你的问题与你的数据输入和输出无关,那么你为什么打扰我们这些细节呢?更好地描述你的意思是“它行不通”。 – Heri

+1

请不要介意,这是我在这里的第一篇文章。 –

回答

1

我认为“它不起作用”意味着来自第二个客户端的呼叫永远不会到达您的ComputationServer。您的ComputationServer只接受一个连接,然后无限循环,永远不会再输入accept方法。那么,为什么你会期望你的server1在收到第二个请求后可以打开一个新的连接?

+0

你说得对,计算服务器不接受第二个请求。但我也尝试将接受部分放在循环中,如下所示: 'while(true){s} ss.accept(); DataInputStream in; DataOutputStream输出; in = new DataInputStream(s.getInputStream()); out = new DataOutputStream(s.getOutputStream()); ' 在这种情况下,计算服务器不处理来自Server1的第二个令牌。你能否提出一个解决方案? –

相关问题