2017-10-25 11 views
0

いくつかのオンラインサンプル(コピー/貼り付け)を使用して、Webサービスサーバーとクライアントを作成しました。 OKです。クライアントから要求が送信され(すべてが同じPC上で実行されます)、サーバーが応答します。今、私は接続して要求を送信する(クライアント情報を得る)コードを(サーバー側で)追加しようとしています。私はそれが行くべきだと思うところにそのコードを追加しましたが、NullPointerExceptionを取得します。私は明らかに何かが欠けている。 以下のコードは、Webサービスメソッドの実装を示しています。 addPersonメソッドに新しい "クライアント識別コード"を追加しました。 実行時にクライアントがaddPersonとサーバーを呼び出すと、次のようになります。
HttpExchange exchange =(HttpExchange)msgx.get( "com.sun.xml.ws.http.exchange");Java:クライアント情報を取得するWebサービスサーバー

私はこれが何か単純であることを知っています(コードは間違った場所にありますか?)しかし、私はこのwedサービスコンセプトには全く新しいです。どんな助けでも大歓迎です。 https://www.journaldev.com/9123/jax-ws-tutorial

@WebService(endpointInterface = "tests.PersonService") 

public class PersonServiceImplementation implements PersonService { 

    @Resource 
    WebServiceContext wsContext; 

    private static Map<Integer,Person> persons = new HashMap<Integer,Person>(); 

    @Override 
    @WebMethod 
    public boolean addPerson(Person p) { 
     //// idetify who poked us //// 
     MessageContext msgx = wsContext.getMessageContext(); 
     HttpExchange exchange = (HttpExchange)msgx.get("com.sun.xml.ws.http.exchange"); 
     InetSocketAddress remoteAddress = exchange.getRemoteAddress(); 
     String remoteHost = remoteAddress.getHostName(); 
     System.out.println("Who poked us: " + remoteHost); 
     ////////////////////////////// 
     if(persons.get(p.getId()) != null) return false; 
     persons.put(p.getId(), p); 
     return true; 
    } 

    @Override 
    public boolean deletePerson(int id) { 
     if(persons.get(id) == null) return false; 
     persons.remove(id); 
     return true; 
    } 

    @Override 
    public Person getPerson(int id) { 
     return persons.get(id); 
    } 

    @Override 
    public Person[] getAllPersons() { 
     Set<Integer> ids = persons.keySet(); 
     Person[] p = new Person[ids.size()]; 
     int i=0; 
     for(Integer id : ids){ 
      p[i] = persons.get(id); 
      i++; 
     } 
     return p; 
    } 

} 

答えて

0
InetSocketAddress remoteAddress = exchange.getRemoteAddress(); 
String remoteHost = remoteAddress.getHostName(); 

コードは、あなたが条件を追加する必要があり、NullPointerException.Soをスローします)[リモートその後remoteAddress.getHostName(nullの場合[リモートは、値を持っていることを確認しています。

InetSocketAddress remoteAddress = exchange.getRemoteAddress(); 
String remoteHost; 
if(remoteAddress != null){ 
    remoteHost = remoteAddress.getHostName(); 
} 
System.out.println("Who poked us: " + remoteHost); 
+0

コードが失敗する:InetSocketAddress remoteAddress = exchange.getRemoteAddress();私はどのようにクライアントがアドレスを持っているか分かりませんか?私はローカルマシン(ローカルホスト)からの接続を意味する何かを返す必要があります。それ以外の場合、サーバーへの接続方法はどうすればわかりますか?どうも – kr16

関連する問題