2011-03-15 99 views
1

我处于网络课程中,并被分配了一个项目,我们可以在任何语言或环境中完成该项目。作为我的Android爱好者,我当然想在我的手机上做到这一点。我遇到的问题应该很简单,我开始认为我无法在电话之间使用UDP建立连接。我试图做的是使用一个电话作为服务器,一个作为客户端。客户端向服务器发送消息,服务器将字符串更改为大写。 (这不是项目,但是看看它是否正常工作是一个很好的步骤。)有谁知道为什么服务器和客户端不会连接,或者甚至有可能吗?Android-手机之间的UDP连接

这是服务器,下面是客户端,主要推出屏幕,并且main.xml中

package com.csc.networking; 
import java.net.*; 

import android.util.Log; 


public class UDPServer 
{ 

    public void main() throws Exception 
    { 
     Log.d("s","1"); 
     DatagramSocket serverSocket = new DatagramSocket(6699);//create a datagram socket at the specified port number 
     byte[] receiveData = new byte[1024]; 
     byte[] sendData = new byte[1024]; 
     Log.d("s","2"); 
     while(true) 
     { 
      Log.d("s","3"); 
      DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length); 
      //To Do: construct a DatagramPacket object called receivePacket. Use the constructor of the class DatagramPacket 
      //that takes two parameters: 1. the array of bytes (receiveData) and 2. the length of that array. 
      Log.d("s","3.5"); 
      //To Do: use the method receive on the DatagramSocket object to receive the packet sent from the client. 
      //the method receive takes one parameter (the DatagramPacket object constructed in the above step). 


      serverSocket.receive(receivePacket); 
      Log.d("s","again"); 

      Log.d("s","3.75"); 
      String sentence = new String(receivePacket.getData());//extract the String from the array of bytes. 
      Log.d("s",sentence); 
      Log.d("s","4"); 
      InetAddress IPAddress = receivePacket.getAddress();//extract the IP address of the client 

      int port = receivePacket.getPort();//extract the port number from the packet 

      String capitalizedSentence = sentence.toUpperCase();//change the sentence received by the server 
      sendData = capitalizedSentence.getBytes();//convert it to an array of bytes 
      Log.d("s","5"); 
      DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); 
      //To Do: construct a DatagramPacket object called sendPacket. Use the constructor of the class DatagramPacket 
      //that takes 4 parameters: 1. the array of bytes to be sent. 2. the length of that array of bytes. 
      //3. the IP address of the client (use the object IPAddress) and 4. the port number of the process running in 
      //the client. 

      //To Do: send the packet to the client using the method send on the DatagramSocket object. The metho send 
      //takes one parameter which is the packet constructed in the above step. 
      Log.d("s","5.5"); 
      serverSocket.send(sendPacket); 
      Log.d("s","6"); 
     } 
    } 

} 





package com.csc.networking; 

import java.io.*; 
import java.net.*; 

import android.util.Log; 
import android.widget.*; 



public class UDPClient { 
    public void main(String string) throws Exception 
     { 
     Log.d("help", "1"); 
     //EditText connectAddress = (EditText)findViewById(R.id.connectAddress); 
     Log.d("help", "2"); 
     String hostIP = "10.60.5.79"; //connectAddress.getText().toString(); 
     Log.d("help", "3"); 
     String coded = string; 
     Log.d("help", "4"); 
      DatagramSocket clientSocket = new DatagramSocket();//this line creates a datagram socket, this does not 
      //create a TCP connection with the server, note how we do not have server and process info as parameters to 
      //the constructor 
      Log.d("help", "5"); 

      InetAddress IPAddress = InetAddress.getByName(hostIP); //this line invokes DNS to lookup the IP address 
      //of the hostname. If IP address is provided, it stores it in the object IPAddress. 
      Log.d("help", "6"); 
      byte[] sendData = new byte[1024]; //array of bytes to be sent to server 
      Log.d("help", "7"); 
      byte[] receiveData = new byte[1024]; //array of bytes that client will receive from server 

      Log.d("help", "8"); 


      sendData = coded.getBytes(); //this converts sentence to an array of bytes and stores it in sendData. 
      Log.d("help", "9"); 
      DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,IPAddress,6699); 
      //To DO: construct a DatagramPacket object called sendPacket. The constructor of the DatagramPacket class 
      //takes the following parameters: 1. the array of bytes to be sent. 2. the length of the array of bytes. 
      //3. the IPAddress of the destination (use the object IPAddress) and 4. the port number of the process running 
      //at the destination. 
      Log.d("help", "10"); 
      clientSocket.send(sendPacket); 
      //To DO: call the method send on the DatagramSocket object to send the datagram packet. The method send takes 
      //the DatagramPacket object as a prameter and sends it through the socket. 
      Log.d("help", "11"); 
      DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length); 
      //To Do: construct a new DatagramPacket object called recievePacket. This is the packet that the client will 
      //receive from the destination. Use the constructor that takes two parameters: 1. an array of bytes (receiveData) and 
      //2. the length of that array. 
      Log.d("help", "12"); 
      clientSocket.receive(receivePacket); 
      //To Do: use the method receive on the DatagramSocket object to receive the datagram packet from the server. 
      //The method receive takes a parameter which is the DatagramPacket constructed in the above step. 

      Log.d("help", "13"); 
      String modifiedSentence = new String(receivePacket.getData());//this converts an array of bytes to a string. 

      Log.d("help", "14"); 
      TextView decoded = (TextView)findViewById(R.id.decoded); 
      Log.d("help", "15"); 
      decoded.setText(modifiedSentence); 
      Log.d("help", "16"); 
      clientSocket.close();//this closes the connection. 
      Log.d("help", "17"); 
     } 

    private EditText findViewById(int connectaddress) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
} 




<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:baselineAligned="true" android:orientation="vertical" 
     android:layout_width="wrap_content" android:layout_height="fill_parent"> 


     <TextView android:text="@string/Title" android:id="@+id/Title" 
      android:layout_width="fill_parent" android:gravity="center" 
      android:textSize="24px" android:layout_height="wrap_content" /> 


     <EditText android:id="@+id/editText1" android:layout_below="@+id/Title" 
      android:layout_alignLeft="@+id/Title" android:layout_alignRight="@+id/Title" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" android:scrollbarAlwaysDrawVerticalTrack="true" android:scrollbars="vertical" android:singleLine="true" android:hint="@string/Hint"/> 

     <RelativeLayout android:layout_width="wrap_content" 
      android:layout_below="@+id/editText1" android:id="@+id/relativeLayout1" 
      android:layout_height="wrap_content" android:layout_alignLeft="@+id/editText1" 
      android:layout_alignRight="@+id/editText1"> 
      <Button android:layout_width="wrap_content" 
       android:layout_below="@+id/startServer" android:layout_height="wrap_content" 
       android:layout_alignLeft="@+id/startServer" 
       android:layout_alignRight="@+id/startServer" android:id="@+id/Send" 
       android:text="@string/Send" /> 
      <EditText android:layout_width="wrap_content" android:layout_below="@+id/Send" android:layout_height="wrap_content" android:layout_alignLeft="@+id/Send" android:layout_alignRight="@+id/Send" android:id="@+id/connectAddress" android:hint="Enter Ip Address Here"></EditText> 
      <TextView android:text="Decoded" android:layout_width="wrap_content" android:layout_below="@+id/connectAddress" android:id="@+id/decoded" android:layout_height="wrap_content" android:layout_alignLeft="@+id/connectAddress" android:layout_alignRight="@+id/connectAddress"></TextView> 
      <Button android:layout_width="fill_parent" android:id="@+id/startServer" android:text="@string/Start " android:layout_height="wrap_content" android:layout_alignParentRight="true"></Button> 
     </RelativeLayout> 





    </RelativeLayout> 

package com.csc.networking; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

public class launchScreen extends Activity { 


    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 


     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Button SendButton = (Button)findViewById(R.id.Send); 
     SendButton.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
        try { 
         Log.d("click", "1"); 
         EditText codedMessage = (EditText)findViewById(R.id.editText1); 
         UDPClient client = new UDPClient(); 
         String msg = codedMessage.getText().toString(); 
         Log.d("click", msg); 
         Log.d("click", "2"); 
         client.main(msg); 
         Log.d("click", "3"); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
      } 
     }); 
     Button ServerButton = (Button)findViewById(R.id.startServer); 
     ServerButton.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       try { 
        UDPServer server = new UDPServer(); 
        server.main(); 
       } 
       catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       } 
      }); 
    } 

} 

回答

0

如果您使用的是3G连接,入站防火墙可能会阻止您的(传入)连接。请参阅this

我的建议是从无线本地网络开始,这样IP就会静止/知名,然后移动到互联网连接。

1

首先,你正在尝试在UI线程上做网络的东西。在较新的Android中,它会导致异常,并且用户体验非常糟糕。当服务器或客户端中等待方法:

socket.receive() 

更好的办法是把这些东西丝线或AsyncTasks。这可能有帮助联网networking in android

根据你的问题,我可以建议多次发送这个数据包。 UDP不保证数据包传输,并且发送一个且仅有一个数据包风险很大。

把你的socket.send()方法放入循环,并发送可以说10次的同一个数据包。

您也可以尝试将它发送到您的计算机的IP地址,并检查软件如 Wireshark是否收到。

最后但并非最不重要的,在你的情况下,更好的选择将是TCP客户端和服务器,其中包交付是保证。 UDP在流媒体等方面效果最好,其中重传根本没有用处。