2016-08-04 20 views
0

私はJavaを使い慣れていませんが(このプロジェクトでは基本的にこのことを学んでいました)、XMLコマンドをサーバーに送信しようとしています私の研究室で)いくつかのデータを取得します。これを行うために、私はJavaプログラムを書いており、コマンドラインから実行しています。接続は正常に確立され、メッセージは正常に送信されていますが、「応答待ち」になっています。Javaを使用してTCP/IP経由でXMLを送信するレスポンスを受信して​​いません

ここに私のJavaコードが参考になります。私はクライアント/サーバのTCPチュートリアルからこれを得て、それに応じてIP、ポート、および発信メッセージを調整しました。繰り返しますが、私はこれにはとても新しいので、どんな助けもありがとうございます。

// Java Socket Example - Client 
 

 
import java.io.IOException; // Throws exception if there is an issue with input or output 
 
import java.io.ObjectInputStream; 
 
import java.io.ObjectOutputStream; 
 
import java.net.InetAddress; // This class represents an Internet Protocol address 
 
import java.net.Socket; 
 
import java.net.UnknownHostException; 
 

 
/** 
 
* This class implements java socket Client 
 
*/ 
 

 
public class SocketClientExample { 
 
\t public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException, InterruptedException { 
 
\t \t // get the localhostIP address, if server is running on some other IP, use that 
 
\t \t System.out.println("Attempting connection to GE Reuter Stokes"); 
 
\t \t InetAddress host = InetAddress.getByName("10.212.160.4"); // IP GOES HERE 
 
\t \t Socket socket = null; // start out as null, protocal 
 
\t \t ObjectOutputStream oos = null; // This will change, just setting default 
 
\t \t ObjectInputStream ois = null; 
 
\t \t // establish the socket connection to the server 
 
\t \t socket = new Socket("10.212.160.4", 3010); // 9876 is just the port number 
 
\t \t System.out.println("Made it past Socket Initialization"); 
 
\t \t // write to socket using ObjectOutputStream 
 
\t \t oos = new ObjectOutputStream(socket.getOutputStream()); // new instance of OOS that will write to the socket 
 
\t \t System.out.println("Sending request to Socket Server"); 
 
\t \t // Initializing request string 
 
\t \t String request = new String("0xF00041 " + "<Discovery><CommChannelName>Unknown</CommChannelName></Discovery>"); 
 
\t \t // In our version, this is where the XML script would go 
 
\t \t oos.writeObject(request); 
 
\t \t System.out.println("Request was sent. Awaiting response."); 
 
\t \t // read the server response message 
 
\t \t ois = new ObjectInputStream(socket.getInputStream()); 
 
\t \t // convert the response into a string 
 
\t \t String message = (String) ois.readObject(); 
 
\t \t System.out.println("Message: " + message); 
 
\t \t // close your resources 
 
\t \t ois.close(); 
 
\t \t oos.close(); 
 
\t \t Thread.sleep(100); 
 
\t } 
 
}

これはセンサーで何か可能性がより多くのだ - 私はそれがコード上の目の第2のセットを持っていて損はないと考えました。

+0

ルール:

は、(センサが要求と同様のヘッダ+ XML形式でレスポンスを返すと仮定して)の代わりにもっとこのような何かを試してください。このためのテストサーバーを作成し、取得したデータと関連するデバッグメッセージを出力します。この質問を結果と編集します。これには 'ServerSocket'を使います。 GoogleはServerSocketのドキュメントをアップ。新しいServerSocketを作成した後、 'Socket client = server.accept();'で接続を受け入れ、その 'client'の出力ストリームからデータを読み込み、それを出力して返信します。 – Aaron

+1

'ObjectOutputStream'と' ObjectInputStream'は、この状況で使う正しい種類のストリームではなく、 'writeObject()'と 'readObject()'メソッドではありません。 'OutputStreamWriter'(その上に' BufferedWriter')または 'DataOutputStream'と' InputStreamReader'(その上に 'BufferedReader'を付けて)を使うべきです。 –

+1

また、表現しようとしている '0xF00041 'は何ですか?あなたはあなたがそれを3-4バイトの整数ではなく8文字の文字列として送信していることを認識していますか?実際にあなたが送信するセンサーは何ですか?いくつかのプロトコルのドキュメントを提供できますか? –

答えて

1

センサはXMLがバイナリ5バイトのヘッダによって先行されることを想定していますが、代わりに、文字列エンコード8文字の16進としてヘッダを送信しています。

また、ObjectOutputStreamObjectInputStreamを使用しています。これはJavaオブジェクトのシリアル化を目的としていますが、Javaオブジェクトの送受信は行っていません。したがって、これらは完全に間違ったストリームクラスです。

あなたのコードはセンサーが期待しているものを送信していないので、受信できる応答を送信するのではなく、要求を正しく受信することはありません。最初のサーバサイドアウト

import java.io.IOException; 
import java.io.DataOutputStream; 
import java.io.DataInputStream; 
import jva.io.BufferedInputStream; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.nio.charset.StandardCharsets; 
import java.nio.ByteBuffer; 

public class SocketClientExample { 
    public static void main(String[] args) throws UnknownHostException, IOException, ClassNotFoundException, InterruptedException { 
     System.out.println("Attempting connection to GE Reuter Stokes"); 

     // establish the socket connection to the server 
     // using the local IP address, if server is running on some other IP, use that 
     Socket socket = new Socket("10.212.160.4", 3010); 
     System.out.println("Socket Connected"); 

     // write to socket using OutputStream 
     DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 

     // Initializing request content 
     byte[] request = "<Discovery><CommChannelName>Unknown</CommChannelName></Discovery>".getBytes(StandardCharsets.UTF_8); 

     // DataOutputStream.writeInt() writes in big endian and 
     // DataInputStream.readInt() reads in big endian. 
     // using a ByteBuffer to handle little endian instead. 

     byte[] header = new byte[5]; 
     ByteBuffer buf = ByteBuffer.wrap(header, 1, 4); 
     buf.order(ByteOrder.LITTLE_ENDIAN); 

     // Initializing request header 
     header[0] = (byte) 0xF0; 
     buf.putInt(request.length); 

     System.out.println("Sending request to Socket Server"); 

     // Sending request 
     dos.write(header); 
     dos.write(request); 
     dos.flush(); 

     System.out.println("Request was sent. Awaiting response."); 

     // read from socket using InputStream 
     DataInputStream dis = new DataInputStream(new BufferedInputStream(socket.getInputStream())); 

     // Read response header 
     dis.readFully(header); 
     buf.flip(); 

     // Read response content 
     byte[] response = new byte[buf.getInt()]; 
     dis.readFully(response); 

     // convert the content into a string 
     String message = new String(response, StandardCharsets.UTF_8); 
     System.out.println("Message: " + message); 

     // close your resources 
     dis.close(); 
     dos.close(); 
     socket.close(); 

     Thread.sleep(100); 
    } 
} 
+0

あなたは命の恩人です!ありがとうございました! –

関連する問題