2017-10-07 23 views
1

私は、送受信とTCP接続を実行する作業コードを用意しています。ここで は私CreateCommThreadTaskWriteToServerCloseSocketTaskクラスです:Android - TCPクライアントからUDPクライアントへの変換

private class CreateCommThreadTask extends AsyncTask 
     <Void, Integer, Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      //---create a socket--- 
      serverAddress = 
        InetAddress.getByName("192.168.4.1"); 
      socket = new Socket(serverAddress, 8080); 
      commsThread = new CommsThread(socket); 
      commsThread.start(); 
     } catch (UnknownHostException e) { 
      Log.d("Sockets", e.getLocalizedMessage()); 
     } catch (IOException e) { 
      Log.d("Sockets", e.getLocalizedMessage()); 
     } 
     return null; 
    } 
} 

private class WriteToServerTask extends AsyncTask 
     <byte[], Void, Void> { 
    protected Void doInBackground(byte[]...data) { 
     commsThread.write(data[0]); 
     return null; 
    } 
} 

private class CloseSocketTask extends AsyncTask 
     <Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      socket.close(); 
     } catch (IOException e) { 
      Log.d("Sockets", e.getLocalizedMessage()); 
     } 
     return null; 
    } 
} 

このクラスでは私が入ってくるデータを読み取る:

public class CommsThread extends Thread { 
private final Socket socket; 
private final InputStream inputStream; 
private final OutputStream outputStream; 

public CommsThread(Socket sock) { 
    socket = sock; 
    InputStream tmpIn = null; 
    OutputStream tmpOut = null; 
    try { 
     //---creates the inputstream and outputstream objects 
     // for reading and writing through the sockets--- 
     tmpIn = socket.getInputStream(); 
     tmpOut = socket.getOutputStream(); 
    } catch (IOException e) { 
     Log.d("SocketChat", e.getLocalizedMessage()); 
    } 
    inputStream = tmpIn; 
    outputStream = tmpOut; 
} 

public void run() { 
    //---buffer store for the stream--- 
    byte[] buffer = new byte[1024]; 

    //---bytes returned from read()--- 
    int bytes; 

    //---keep listening to the InputStream until an 
    // exception occurs--- 
    while (true) { 
     try { 
      //---read from the inputStream--- 
      bytes = inputStream.read(buffer); 

      //---update the main activity UI--- 
      SocketsActivity.UIupdater.obtainMessage(
       0,bytes, -1, buffer).sendToTarget(); 
     } catch (IOException e) { 
      break; 
     } 
    } 
} 

//---call this from the main activity to 
// send data to the remote device--- 
public void write(byte[] bytes) { 
    try { 
     outputStream.write(bytes); 
    } catch (IOException e) { } 
} 

//---call this from the main activity to 
// shutdown the connection--- 
public void cancel() { 
    try { 
     socket.close(); 
    } catch (IOException e) { } 
} 

} 

は最終的に私はこのようなHandlerを使用して、私の受信データを使用します。

static Handler UIupdater = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     int numOfBytesReceived = msg.arg1; 
     byte[] buffer = (byte[]) msg.obj; 


     //---convert the entire byte array to string--- 
     //---extract only the actual string received--- 
     if(numOfBytesReceived>0) 
     { 
      strReceived = new String(buffer); 
      strReceived = strReceived.substring(0, numOfBytesReceived); 
     } 
     //---display the text received on the TextVie*--- 

    } 
}; 

これらのコードは、TCP接続で正常に動作します。私の質問は、これらをUDPクライアントに変換するために必要な変更です。 私が書いたTCPコードと同じAsyncTaskにUDPを実装したいと思います。

答えて

0

DatagramSocketDatagramPacketを使用してください。ここに素敵なチュートリアル - Writing a Datagram Client and Serverがあります。

byte[] receiveData = new byte[15]; //max length 15. 
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
DatagramSocket clientSocket = new DatagramSocket(port); 
clientSocket.receive(receivePacket); 
String receivedMessage = new String(receivePacket.getData()).trim(); 
1

UDPを使用するには、メッセージを送信するにはDatagramSocket

を使用する必要があります接続されたソケットである場合は、まず接続を確立してパケットを送受信する必要があります。 UDPではなく、直前の接続でIP +宛先ポートに直接パケットを送信しますが、接続されていないソケットです。

UDPの場合、パケットサイズは制限されていますが、TCPではなく、512バイトを超えないようにすることが推奨されます。

UDPの場合、パケットが相手側で受信されることは保証されず、送信側はTCPの代わりにそのような確認があるかどうかの確認を何もしません。

ますが、他の側で受信されて送信されたバイトは、あなたが実際にいくつかの携帯電話会社がこれ以上割り当てないことに注意しても、TCPを使用していない

をUDPとする必要があることを確認し、接続が必要な場合クライアントへのパブリックIPは、プライベートIPを割り当てます。このような状況では、Androidデバイスはサーバとして動作できません。つまり、受信したUDPパケットを待つことができず、ポートからWANにアクセスできないため、着信TCP接続を待機できません。

+0

私が書いたTCPコードとまったく同じように使用するにはどうすればよいですか? (AsyncTask) –

0

TCP & UDPとの主な違いは、TCPである:メッセージを受信するには

DatagramSocket serverSocket = new DatagramSocket(); 
InetAddress IPAddress = InetAddress.getByName(ipAddress); 
byte[] sendData = message.getBytes(); 
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); 
serverSocket.send(sendPacket); 

関連する問題