2011-09-12 11 views
21

मेरे पास एक ऐसा एप्लिकेशन है जहां मुझे सॉकेट कनेक्शन बनाने की आवश्यकता है। मेरी आवश्यकता यह है कि, जब मेरा सॉकेट कनेक्शन स्थापित हो जाता है तो इसे ज़िंदा रहने की आवश्यकता होती है जब तक कि मैं इसे व्यक्तिगत रूप से बंद न कर लेता। हर 3 मिनट में मुझे दूसरी तरफ डेटा पैकेट भेजना पड़ता है। क्या कोई मुझे कुछ कोड नमूना प्रदान कर सकता है जिससे मुझे ऐसा करने में मदद मिलेगी? एंड्रॉयड मेंएंड्रॉइड में सॉकेट कनेक्शन कैसे बनाएं?

+0

यदि आप किसी सर्वर सॉकेट बनाने का प्रयास करते हैं, उदाहरण के हैं एक सॉकेट जो दूसरों से जुड़ जाएगी? –

+0

पीटर पूछने के लिए धन्यवाद। लेकिन मैंने इसे हल कर लिया है। बहुत बहुत धन्यवाद –

+1

हां मैंने आपके द्वारा स्वीकार किए गए उत्तर को देखा। यदि आप मोबाइल डिवाइस पर सर्वर चलाने की योजना बना रहे हैं तो उस उत्तर पर मेरी टिप्पणी देखें। –

उत्तर

36

सॉकेट कनेक्शन जावा में के रूप में ही कर रहे हैं: http://www.oracle.com/technetwork/java/socket-140484.html

चीजें आप के बारे में पता करने की आवश्यकता है:

  1. फोन अपने ऐप अब निष्पादित करेंगे निष्क्रिय हो जाती है, इसलिए यदि सॉकेट अंत में होगा समय समाप्त। आप इसे लॉक लॉक से रोक सकते हैं। यह बैटरी बैटरी को काफी हद तक खाएगा - मुझे पता है कि मैं उस ऐप का उपयोग नहीं करूंगा।
  2. यदि आप लगातार ऐसा करते हैं, तब भी जब आपका ऐप सक्रिय नहीं होता है, तो आपको सेवा का उपयोग करने की आवश्यकता होती है।
  3. किसी भी समय ओएस द्वारा गतिविधियां और सेवाएं मार दी जा सकती हैं, खासकर यदि वे एक निष्क्रिय ऐप का हिस्सा हैं। अगर आप अपने कोड की निर्धारित फांसी की जरूरत

AlarmManager पर एक नजर डालें।

क्या आपको अपना कोड चलाने और डेटा प्राप्त करने की आवश्यकता है भले ही उपयोगकर्ता ऐप का उपयोग न करे (यानी ऐप निष्क्रिय है)?

+0

मेरे लिए आपका उत्तर किसी भी चीज़ से ज्यादा है। मुझे बस एक सॉकेट की तुलना में सब कुछ चाहिए। दोस्त बहुत - बहुत धन्यवाद – bharath

4

सरल सॉकेट सर्वर अनुप्रयोग उदाहरण

मैं पहले से ही में एक ग्राहक उदाहरण पोस्ट किया है: https://stackoverflow.com/a/35971718/895245, इसलिए यहाँ एक सर्वर उदाहरण चला जाता है।

यह उदाहरण ऐप एक सर्वर चलाता है जो इनपुट के आरओटी -1 साइफर लौटाता है।

आपको फिर Exit बटन + कुछ नींद देरी जोड़ने की आवश्यकता होगी, लेकिन यह आपको प्रारंभ करना चाहिए। कुछ पंक्तियाँ साथ https://android.stackexchange.com/a/130468/126934

  • रन netcat $PHONE_IP 12345
  • प्रकार अपने फोन के आईपी

    • एप्लिकेशन
    • एक लैन
    • पर अपने फोन और पीसी मिल स्थापित लगता है:

      इसके साथ खेलने के लिये

    एंड्रॉइड सॉकेट हैं जावा के समान, सिवाय इसके कि हमें कुछ अनुमति मुद्दों से निपटना होगा। How to fix android.os.NetworkOnMainThreadException?

    package com.cirosantilli.android_cheat.socket; 
    
    import android.app.Activity; 
    import android.app.IntentService; 
    import android.content.Intent; 
    import android.os.Bundle; 
    import android.util.Log; 
    
    import java.io.BufferedReader; 
    import java.io.IOException; 
    import java.io.InputStreamReader; 
    import java.io.PrintStream; 
    import java.net.ServerSocket; 
    import java.net.Socket; 
    
    public class Main extends Activity { 
        static final String TAG = "AndroidCheatSocket"; 
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         Log.d(Main.TAG, "onCreate"); 
         Main.this.startService(new Intent(Main.this, MyService.class)); 
        } 
    
        public static class MyService extends IntentService { 
         public MyService() { 
          super("MyService"); 
         } 
         @Override 
         protected void onHandleIntent(Intent intent) { 
          Log.d(Main.TAG, "onHandleIntent"); 
          final int port = 12345; 
          ServerSocket listener = null; 
          try { 
           listener = new ServerSocket(port); 
           Log.d(Main.TAG, String.format("listening on port = %d", port)); 
           while (true) { 
            Log.d(Main.TAG, "waiting for client"); 
            Socket socket = listener.accept(); 
            Log.d(Main.TAG, String.format("client connected from: %s", socket.getRemoteSocketAddress().toString())); 
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
            PrintStream out = new PrintStream(socket.getOutputStream()); 
            for (String inputLine; (inputLine = in.readLine()) != null;) { 
             Log.d(Main.TAG, "received"); 
             Log.d(Main.TAG, inputLine); 
             StringBuilder outputStringBuilder = new StringBuilder(""); 
             char inputLineChars[] = inputLine.toCharArray(); 
             for (char c : inputLineChars) 
              outputStringBuilder.append(Character.toChars(c + 1)); 
             out.println(outputStringBuilder); 
            } 
           } 
          } catch(IOException e) { 
           Log.d(Main.TAG, e.toString()); 
          } 
         } 
        } 
    } 
    

    AndroidManifest:

    src/com/cirosantilli/android_cheat/सॉकेट

    हम एक Service या अन्य पृष्ठभूमि विधि वरना जरूरत है।एक्सएमएल

    जोड़ना होगा: <uses-permission android:name="android.permission.INTERNET" /> वरना: Java socket IOException - permission denied

    <?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
         package="com.cirosantilli.android_cheat.socket" 
         android:versionCode="1" 
         android:versionName="1.0"> 
        <uses-sdk android:minSdkVersion="22" /> 
        <uses-permission android:name="android.permission.INTERNET" /> 
        <application android:label="AndroidCheatsocket"> 
         <activity android:name="Main"> 
          <intent-filter> 
           <action android:name="android.intent.action.MAIN" /> 
           <category android:name="android.intent.category.LAUNCHER" /> 
          </intent-filter> 
         </activity> 
         <service android:name=".Main$MyService" /> 
        </application> 
    </manifest> 
    

    GitHub पर एक build.xml साथ: https://github.com/cirosantilli/android-cheat/tree/92de020d0b708549a444ebd9f881de7b240b3fbc/socket

  • 4

    यहाँ, इस पोस्ट में आप उपकरणों के बीच या बीच सॉकेट की स्थापना के लिए विस्तृत कोड मिलेगा एक ही मोबाइल में दो आवेदन।

    आप नीचे दिए गए कोड का परीक्षण करने के दो आवेदन बनाना होगा। क्लाइंट सॉकेट

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?> 
    
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"> 
    
        <TableRow 
         android:id="@+id/tr_send_message" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:gravity="center" 
         android:layout_alignParentLeft="true" 
         android:layout_alignParentStart="true" 
         android:layout_alignParentTop="true" 
         android:layout_marginTop="11dp"> 
    
         <EditText 
          android:id="@+id/edt_send_message" 
          android:layout_width="0dp" 
          android:layout_height="wrap_content" 
          android:layout_weight="1" 
          android:layout_marginRight="10dp" 
          android:layout_marginLeft="10dp" 
          android:hint="Enter message" 
          android:inputType="text" /> 
    
         <Button 
          android:id="@+id/btn_send" 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:layout_marginRight="10dp" 
          android:text="Send" /> 
        </TableRow> 
    
        <ScrollView 
         android:layout_width="match_parent" 
         android:layout_height="match_parent" 
         android:layout_alignParentLeft="true" 
         android:layout_alignParentStart="true" 
         android:layout_below="@+id/tr_send_message" 
         android:layout_marginTop="25dp" 
         android:id="@+id/scrollView2"> 
    
         <TextView 
          android:id="@+id/tv_reply_from_server" 
          android:layout_width="match_parent" 
          android:layout_height="wrap_content" 
          android:orientation="vertical" /> 
        </ScrollView> 
    </RelativeLayout> 
    
    :

    दोनों आवेदन के मैनिफ़ेस्ट फ़ाइल में, अनुमति

    <uses-permission android:name="android.permission.INTERNET" /> 
    

    1 अनुप्रयोग कोड के नीचे जोड़ने

    MainActivity.java

    import android.os.Bundle; 
    import android.os.Handler; 
    import android.support.v7.app.AppCompatActivity; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.EditText; 
    import android.widget.TextView; 
    
    import java.io.BufferedReader; 
    import java.io.IOException; 
    import java.io.InputStreamReader; 
    import java.io.OutputStream; 
    import java.io.PrintWriter; 
    import java.net.Socket; 
    
    /** 
    * Created by Girish Bhalerao on 5/4/2017. 
    */ 
    public class MainActivity extends AppCompatActivity implements View.OnClickListener { 
    
        private TextView mTextViewReplyFromServer; 
        private EditText mEditTextSendMessage; 
    
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
    
         Button buttonSend = (Button) findViewById(R.id.btn_send); 
    
         mEditTextSendMessage = (EditText) findViewById(R.id.edt_send_message); 
         mTextViewReplyFromServer = (TextView) findViewById(R.id.tv_reply_from_server); 
    
         buttonSend.setOnClickListener(this); 
        } 
    
        @Override 
        public void onClick(View v) { 
    
         switch (v.getId()) { 
    
          case R.id.btn_send: 
           sendMessage(mEditTextSendMessage.getText().toString()); 
           break; 
         } 
        } 
    
        private void sendMessage(final String msg) { 
    
         final Handler handler = new Handler(); 
         Thread thread = new Thread(new Runnable() { 
          @Override 
          public void run() { 
    
           try { 
            //Replace below IP with the IP of that device in which server socket open. 
            //If you change port then change the port number in the server side code also. 
            Socket s = new Socket("xxx.xxx.xxx.xxx", 9002); 
    
            OutputStream out = s.getOutputStream(); 
    
            PrintWriter output = new PrintWriter(out); 
    
            output.println(msg); 
            output.flush(); 
            BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
            final String st = input.readLine(); 
    
            handler.post(new Runnable() { 
             @Override 
             public void run() { 
    
              String s = mTextViewReplyFromServer.getText().toString(); 
              if (st.trim().length() != 0) 
               mTextViewReplyFromServer.setText(s + "\nFrom Server : " + st); 
             } 
            }); 
    
            output.close(); 
            out.close(); 
            s.close(); 
           } catch (IOException e) { 
            e.printStackTrace(); 
           } 
          } 
         }); 
    
         thread.start(); 
        } 
    } 
    

    2 अनुप्रयोग कोड - सर्वर सॉकेट

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"> 
    
        <Button 
         android:id="@+id/btn_stop_receiving" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:text="STOP Receiving data" 
         android:layout_alignParentTop="true" 
         android:enabled="false" 
         android:layout_centerHorizontal="true" 
         android:layout_marginTop="89dp" /> 
    
        <ScrollView 
         android:layout_width="match_parent" 
         android:layout_height="match_parent" 
         android:layout_below="@+id/btn_stop_receiving" 
         android:layout_marginTop="35dp" 
         android:layout_alignParentLeft="true" 
         android:layout_alignParentStart="true"> 
    
         <TextView 
          android:id="@+id/tv_data_from_client" 
          android:layout_width="match_parent" 
          android:layout_height="wrap_content" 
          android:orientation="vertical" /> 
        </ScrollView> 
    
        <Button 
         android:id="@+id/btn_start_receiving" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:text="START Receiving data" 
         android:layout_alignParentTop="true" 
         android:layout_centerHorizontal="true" 
         android:layout_marginTop="14dp" /> 
    </RelativeLayout> 
    

    MainActivity.java

    import android.os.Bundle; 
    import android.os.Handler; 
    import android.support.v7.app.AppCompatActivity; 
    import android.view.View; 
    import android.widget.Button; 
    import android.widget.TextView; 
    
    import java.io.BufferedReader; 
    import java.io.IOException; 
    import java.io.InputStreamReader; 
    import java.io.PrintWriter; 
    import java.net.ServerSocket; 
    import java.net.Socket; 
    
    /** 
    * Created by Girish Bhalerao on 5/4/2017. 
    */ 
    public class MainActivity extends AppCompatActivity implements View.OnClickListener { 
    
        final Handler handler = new Handler(); 
    
        private Button buttonStartReceiving; 
        private Button buttonStopReceiving; 
        private TextView textViewDataFromClient; 
        private boolean end = false; 
    
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
         super.onCreate(savedInstanceState); 
         setContentView(R.layout.activity_main); 
    
         buttonStartReceiving = (Button) findViewById(R.id.btn_start_receiving); 
         buttonStopReceiving = (Button) findViewById(R.id.btn_stop_receiving); 
         textViewDataFromClient = (TextView) findViewById(R.id.tv_data_from_client); 
    
         buttonStartReceiving.setOnClickListener(this); 
         buttonStopReceiving.setOnClickListener(this); 
    
        } 
    
        private void startServerSocket() { 
    
         Thread thread = new Thread(new Runnable() { 
    
          private String stringData = null; 
    
          @Override 
          public void run() { 
    
           try { 
    
            ServerSocket ss = new ServerSocket(9002); 
    
            while (!end) { 
             //Server is waiting for client here, if needed 
             Socket s = ss.accept(); 
             BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
             PrintWriter output = new PrintWriter(s.getOutputStream()); 
    
             stringData = input.readLine(); 
             output.println("FROM SERVER - " + stringData.toUpperCase()); 
             output.flush(); 
    
             try { 
              Thread.sleep(1000); 
             } catch (InterruptedException e) { 
              e.printStackTrace(); 
             } 
             updateUI(stringData); 
             if (stringData.equalsIgnoreCase("STOP")) { 
              end = true; 
              output.close(); 
              s.close(); 
              break; 
             } 
    
             output.close(); 
             s.close(); 
            } 
            ss.close(); 
           } catch (IOException e) { 
            e.printStackTrace(); 
           } 
          } 
    
         }); 
         thread.start(); 
        } 
    
        private void updateUI(final String stringData) { 
    
         handler.post(new Runnable() { 
          @Override 
          public void run() { 
    
           String s = textViewDataFromClient.getText().toString(); 
           if (stringData.trim().length() != 0) 
            textViewDataFromClient.setText(s + "\n" + "From Client : " + stringData); 
          } 
         }); 
        } 
    
        @Override 
        public void onClick(View v) { 
    
         switch (v.getId()) { 
          case R.id.btn_start_receiving: 
    
           startServerSocket(); 
           buttonStartReceiving.setEnabled(false); 
           buttonStopReceiving.setEnabled(true); 
           break; 
    
          case R.id.btn_stop_receiving: 
    
           //stopping server socket logic you can add yourself 
           buttonStartReceiving.setEnabled(true); 
           buttonStopReceiving.setEnabled(false); 
           break; 
         } 
        } 
    } 
    
    संबंधित मुद्दे