2011-09-12 31 views
21

Tôi có một ứng dụng mà tôi cần phải tạo kết nối ổ cắm. Yêu cầu của tôi là, một khi kết nối socket của tôi được thiết lập, nó cần phải còn sống cho đến khi cá nhân tôi đóng nó lại. Cứ 3 phút tôi phải gửi gói dữ liệu đến đầu kia. Bất cứ ai có thể cung cấp cho tôi một số mẫu mã với sẽ giúp tôi làm điều này?cách tạo kết nối Socket trong Android?

+0

Bạn đang cố tạo ổ cắm máy chủ, ví dụ: một ổ cắm mà những người khác sẽ kết nối với? –

+0

Peter cảm ơn vì đã hỏi. nhưng tôi đã giải quyết tương tự. cảm ơn rất nhiều –

+1

Vâng, tôi đã nhìn thấy câu trả lời bạn đã chấp nhận. Nếu bạn dự định chạy một máy chủ trên thiết bị di động thì hãy xem nhận xét của tôi về câu trả lời đó. –

Trả lời

36

kết nối socket trong Android cũng giống như trong Java: http://www.oracle.com/technetwork/java/socket-140484.html

Những điều bạn cần phải nhận thức được:

  1. Nếu điện thoại đi ngủ ứng dụng của bạn sẽ không còn thực hiện, vì vậy ổ cắm sẽ cuối cùng hết giờ. Bạn có thể ngăn chặn điều này với khóa thức. Điều này sẽ ăn pin thiết bị rất nhiều - Tôi biết tôi sẽ không sử dụng ứng dụng đó.
  2. Nếu bạn làm điều này liên tục, ngay cả khi ứng dụng của bạn không hoạt động, thì bạn cần sử dụng Dịch vụ.
  3. Các hoạt động và dịch vụ có thể bị hệ điều hành tắt bất kỳ lúc nào, đặc biệt nếu chúng là một phần của ứng dụng không hoạt động.

Hãy xem AlarmManager, nếu bạn cần thực thi theo lịch của mã.

Bạn có cần chạy mã của mình và nhận dữ liệu ngay cả khi người dùng không sử dụng ứng dụng nữa (tức là ứng dụng không hoạt động)?

+0

Đối với tôi câu trả lời của bạn giống như nhiều hơn bất cứ điều gì. Tôi tìm thấy mọi thứ cần thiết hơn một ổ cắm. Cám ơn nhiều, ông bạn – bharath

4

đơn giản ứng dụng máy chủ socket dụ

Tôi đã đăng tải một ví dụ khách hàng tại địa chỉ: https://stackoverflow.com/a/35971718/895245, vì vậy ở đây đi một ví dụ máy chủ.

Ứng dụng ví dụ này chạy một máy chủ trả về một cypher ROT-1 của đầu vào.

Sau đó, bạn sẽ cần thêm một nút Exit + một số độ trễ khi ngủ, nhưng điều này sẽ giúp bạn bắt đầu.

Để chơi với nó:

  • cài đặt ứng dụng
  • nhận được điện thoại và máy tính của bạn vào một mạng LAN
  • tìm IP của điện thoại với https://android.stackexchange.com/a/130468/126934
  • chạy netcat $PHONE_IP 12345
  • loại một số dòng

Ổ cắm Android là giống như của Java, ngoại trừ chúng ta phải đối phó với một số vấn đề về quyền.

src/com/cirosantilli/android_cheat/socket

Chúng ta cần một phương pháp Service hoặc khác nền hoặc khác: 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.xml

Phải thêm: <uses-permission android:name="android.permission.INTERNET" /> hoặc khác: 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> 

On GitHub với một build.xml: https://github.com/cirosantilli/android-cheat/tree/92de020d0b708549a444ebd9f881de7b240b3fbc/socket

4

Ở đây, trong bài này, bạn sẽ tìm thấy mã chi tiết cho việc thiết lập ổ cắm giữa các thiết bị hoặc giữa hai ứng dụng trong cùng một thiết bị di động.

Bạn phải tạo hai ứng dụng để kiểm tra mã bên dưới.

Trong cả hai ứng dụng file manifest, thêm dưới sự cho phép

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

1st App mã: Khách hàng Ổ cắm

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> 

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(); 
    } 
} 

2nd App Mã - Máy chủ Ổ cắm

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; 
     } 
    } 
} 
Các vấn đề liên quan