2017-08-25 42 views
1

私は単純なUDPServerUDPClientを構築しようとしています。文字列比較は機能しません。ここ
は、私がこれまでに得たものです:なぜこのString.equals()は機能しませんか?

import java.io.*; 
import java.net.*; 
import java.util.concurrent.TimeUnit; 

public class UDPSender 
{ 
    public static void main(String args[]) throws Exception 
     { 
     DatagramSocket serverSocket = new DatagramSocket(9877); 
      byte[] receiveData = new byte[1024]; 
      byte[] sendData = new byte[1024]; 
      boolean weiter = true; 

      do { 
        DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
        serverSocket.receive(receivePacket); 
        String sentence = new String(receivePacket.getData()); 
        System.out.println("RECEIVED: " + sentence); 
        InetAddress IPAddress = receivePacket.getAddress(); 
        int port = receivePacket.getPort(); 

        /*I'm trying to make the if()-statement true, but the program always enters the else()-clause, no matter what I do.*/ 
        if("Shutdown".equals(sentence)) { 
         weiter = false; 
         String bye = ("Auf Wiedersehen! Verbindung wird gekappt..."); 
         sendData = bye.getBytes(); 
         DatagramPacket sendPacket = 
           new DatagramPacket(sendData, sendData.length, IPAddress, port); 
         serverSocket.send(sendPacket); 
         serverSocket.close(); 
        } else {      
         String capitalizedSentence = sentence.toUpperCase(); 
         sendData = capitalizedSentence.getBytes(); 
         DatagramPacket sendPacket = 
           new DatagramPacket(sendData, sendData.length, IPAddress, port); 
         serverSocket.send(sendPacket);      
        } 
       } while(weiter); 
     } 
} 

そして、これがクライアントである:

import java.io.*; 
import java.net.*; 
import java.util.ArrayList; 

class 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]; 

     //Look, I'm explicitly sending Shutdown, too!    
     String sentence = "Shutdown"; 
     sendData = sentence.getBytes(); 
     DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9877); 
     clientSocket.send(sendPacket); 
     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
     clientSocket.receive(receivePacket); 
     String modifiedSentence = new String(receivePacket.getData()); 
     System.out.println("FROM SERVER:" + modifiedSentence); 
     clientSocket.close(); 
    } 
} 

両方が、今のところ、同じコンピュータ上で動作するかどう私は幸せになるが、この文字列の問題がある後固定された、私はより多くのPCを関与させる必要があります。 stackoverflowと他の同様の質問で提案されたすべてのソリューションについて、最初の3ページに記載されている何かを試してみましたが、何も私のために働いていませんでした。私はできない何かを見ることができますか?

+1

public String(byte[] bytes, int offset, int length)は、あなたがトンを確認しましたhat 'sentence'はヌル文字、スペース(または他の非印刷物)で埋められませんか? –

+1

デバッガを使ってコードを実行し、ブレークポイントを比較に加え、変数に正確に何が入っているかを確認します。 –

+0

Mark Rotteveel、あなたの疑惑が正しいことが判明しました。ヌル文字がありました。 ^^; Reimeusのソリューションはそれを私のために修正しました。ありがとう^^ – Aye

答えて

0

ここで問題となるのは、固定サイズのバッファbyte[] ... = new byte[1024]を使用してパケットを送受信することです。

String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength()); 
receivePacket.getLength()方法で得られた長さに応じて、サーバー側で Stringインスタンスを

String sentence = "Shutdown"; 
byte[] sendData = sentence.getBytes(); 
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9877); 

...と作成:

私のアドバイスはあなたが本当に必要なデータのみを送信することです


も参照してください

関連する問題