2016-04-09 32 views
0

私はソケットプログラミングの新機能です。私は無線LANホットスポットネットワークを介してブロードキャストのためにマルチキャストソケットを使用しています。しかし、私は受信側で問題に直面しています。ここ は私のコードは私の問題は、それが()メソッドをsocket.receiveに行くとき立ち往生私のクライアント側のコードである サーバー側データ受信時にマルチキャストソケットAndroidエラーが発生しましたか?

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import android.app.Service; 
import android.content.Intent; 
import android.os.IBinder; 
import android.util.Log; 

public class SenderService extends Service 
{ 
SenderThread currentSender; 

public class SenderThread extends Thread 
{ 

    public void run() 
    { 
     Log.d("in thread","in service"); 
     try 
     { 
      InetAddress group = InetAddress.getByName("224.0.0.3"); 
      int port=10000; 
      DatagramSocket sock=new DatagramSocket(); 
      sock.setBroadcast(true); 
      String msg="hello"; 
      byte []b3=new byte[1024]; 
      DatagramPacket packet; 
      b3=msg.getBytes(); 

      while (true) 
      { 
       try 
       { 
        packet = new DatagramPacket(b3, b3.length,group, port); 
        sock.send(packet); 
        Log.d("MSG:", "sent"); 
       } catch (IOException e) 
       { 
        Log.d("Send Excp:", e+""); 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       finally 
       { 
        sock.close(); 
       } 
      } 

     } catch (Exception e) 
     { 

      e.printStackTrace(); 
     } 

    } 
} 
@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
} 

@Override 
public IBinder onBind(Intent arg0) 
{ 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    new SenderThread().start(); 
    return Service.START_STICKY; 
} 
} 

クライアント側のコード

import java.io.IOException; 
import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.net.InetSocketAddress; 
import java.net.MulticastSocket; 
import java.net.NetworkInterface; 
import java.util.Enumeration; 

import android.app.Activity; 
import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.net.wifi.WifiManager; 
import android.net.wifi.WifiManager.MulticastLock; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

public class ReceiverActivity extends Activity 
{ 
    Button b; 
    Handler h; 
    class MyRTh extends Thread 
    { 
     InetAddress group=null ; 
     WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
     MulticastLock lock = wifi.createMulticastLock("HelloAndroid"); 

     public void run() 
     { 
      try 
      { 
       lock.acquire(); 
      } 
      catch (Exception e) { 
       // TODO: handle exception 
       Log.d("lock",e+""); 
      } 
      try 
      { 
       final MulticastSocket sock=new MulticastSocket(10000); 
       group= InetAddress.getByName("224.0.0.3"); 
       //sock.setSoTimeout(15000); 
       try 
       { 
        sock.joinGroup(group); 
       } 
       catch(Exception e) 
       { 
        Log.d("join",""+e.toString()); 
       } 
       while(true) 
       { 
       try 
       { 
        Log.d("in try","l4"); 
        byte[] data = new byte[1024]; 

        // TODO Auto-generated method stub 
        DatagramPacket packet = new DatagramPacket(data, data.length); 
        Log.d("in run","l4"); 
        try { 
         sock.receive(packet); 
         String s = new String(packet.getData()); 
         Log.e("MSG:", "Received"); 
         Log.d("msg",s); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
         Log.d("err",e.toString()); 
        } 
       } 
       catch (Exception e) 
       { 
        Log.d("Excp", e.toString()+""); 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       } 
       }catch (Exception e) { 
       // TODO: handle exception 
      } 
     } 
    } 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_receiver); 
    Toast.makeText(getApplicationContext(), "Receiving", Toast.LENGTH_SHORT).show(); 
    Log.d("1","l1"); 

    b=(Button)findViewById(R.id.buttonr); 
    b.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) 
     { 
      MyRTh th=new MyRTh(); 
      th.start(); 
     } 
    }); 
} 

}

です。私は両面で自分の携帯データを始めました。サーバー側でホットスポットを開始し、クライアントから接続しました。

+0

あなたは実際にあなたが作業している場所をこのコードでインデントしますか? – EJP

答えて

-1

これを有効に設定しようとします。enable socket.setBroadcast(true);

byte[] buf = new byte[256]; 
    packet = new DatagramPacket(buf, buf.length); 
    socket.setBroadcast(true); 
    socket.receive(packet); 
+0

彼は放送していない、彼はマルチキャストしています。 – EJP

0

私の問題は、それが(socket.receiveに行くとき立ち往生私のクライアント側のコードである)方法

それブロック

InetAddress group = InetAddress.getByName("224.0.0.3"); 

ここに問題があります。 224.0.0.0〜224.0.0.255の範囲のマルチキャストアドレスは、低レベルのマルチキャストサポート操作用に予約されています。 224.0.1.0〜239.255.255.255の範囲のアドレスを使用しますが、RFC 2365も参照してください。

sock.setBroadcast(true); 

不要です。削除します。あなたは放送していない、マルチキャストしている。

byte []b3=new byte[1024]; 
DatagramPacket packet; 
b3=msg.getBytes(); 

あなたは2行、後でそれを再割り当てするときb3を初期化する必要はありません。

finally 
{ 
    sock.close(); 
} 

ループはwhile (true)ループ内に閉じています。したがって、マルチキャストを1つ送信し、ここでは報告していない「ソケットクローズ」例外を出して終了します。削除します。

String s = new String(packet.getData()); 

new String(packet.getData(), packet.getOffset(), packet.getLength()である必要があります。

関連する問題