2014-02-09 41 views
0

我已经编写了以下两个用于查找两个数字的GCD的代码。 (通过UDP服务器)在Java中寻找GCD,Socket编程

GCD_UDPClient.java

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

class GCD_UDPClient 
{ 
    public static void main(String args[]) throws Exception 
    { 
     BufferedReader InFromUser = new BufferedReader(new InputStreamReader(System.in)); 
     DatagramSocket ClientSocket = new DatagramSocket(); 
     InetAddress IPAddress = InetAddress.getByName("localhost"); 
     byte[] SendData = new byte[1024]; 
     byte[] ReceiveData = new byte[1024]; 

     System.out.print("First Number: "); 
     String input1 = InFromUser.readLine(); 
     System.out.print("Second Number: "); 
     String input2 = InFromUser.readLine(); 
     String Input = input1 + ' ' +input2; 

     SendData = Input.getBytes(); 
     DatagramPacket SendPacket = new DatagramPacket(SendData, SendData.length, IPAddress, 9836); 
     ClientSocket.send(SendPacket); 
     DatagramPacket ReceivePacket = new DatagramPacket(ReceiveData, ReceiveData.length); 
     ClientSocket.receive(ReceivePacket); 
     String ModifiedInput = new String(ReceivePacket.getData()); 
     System.out.println("GCD From Server: " +ModifiedInput); 
     ClientSocket.close(); 
    } 
} 

GCD_UDPServer.java

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

@SuppressWarnings("unused") 
class GCD_UDPServer 
{ 
    @SuppressWarnings("resource") 
    public static void main(String args[]) throws Exception 
    { 
     DatagramSocket ServerSocket = new DatagramSocket(9836); 
     byte[] ReceiveData = new byte[1024]; 
     byte[] SendData = new byte[1024]; 
     while(true) 
     { 
      DatagramPacket ReceivePacket = new DatagramPacket(ReceiveData, ReceiveData.length); 
      ServerSocket.receive(ReceivePacket); 
      String input = new String(ReceivePacket.getData()); 
      InetAddress IPAddress = ReceivePacket.getAddress(); 
      int port = ReceivePacket.getPort(); 

      int ar[] = new int[2],i=0; 
      for (String Number: input.split(" ", 2)) 
      { 
       ar[i] = Integer.parseInt(Number); 
       i=i+1; 
      } 
      String Answer = Integer.toString(calculategcd(ar[0],ar[1])); 

      SendData = Answer.getBytes(); 
      DatagramPacket SendPacket = new DatagramPacket(SendData, SendData.length, IPAddress, port); 
      ServerSocket.send(SendPacket); 
     } 
    } 

    public static int calculategcd(int a, int b) 
    { 
     if(b%a == 0) 
      return a; 
     else 
      return calculategcd(b%a,a); 
    } 
} 

ClientSocket.receive(ReceivePacket);似乎没有正常工作,任何线索,为什么?完整的代码只是为了清楚。由上述代码给出

输出:

First Number: 5 
Second Number: 25 
[waits indefinitely] 

输出所需:

First Number: 5 
Second Number: 25 
GCD From Server: 5 
+1

任何错误讯息?怎么了?你期望发生什么? –

+0

@GuntramBlohm >>编辑上述代码给出的输出:'和'输出必需:'。 –

+1

您是否在您的代码中检查了错误 >>> ar [i] = Integer.parseInt(Number); –

回答

1

您正在向服务器发送1024个字节,并且您将数据放入字符串“5 25”中。当你收到你分割的数据时,你将有“5”和“25”,其后是缓冲区中的其他字节。要么使用Number.trim()来丢弃这些额外的字节,要么发送一个较小的数据包(如果可能的话)。

+0

好的解释! –

1

我有一个测试中,GCD_UDPServer.java有像

Exception in thread "main" java.lang.NumberFormatException: For input string: "12" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:492) 
    at java.lang.Integer.parseInt(Integer.java:527) 
    at GCD_UDPServer.main(GCD_UDPServer.java:24) 

和一个简单的例外改线24

ar[i] = Integer.parseInt(Number); 

ar[i] = Integer.parseInt(Number.trim()); 

和它工作正常。