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?
Trả lời
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:
- 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 đó.
- 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ụ.
- 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)?
Đố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
đơ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
Ở đâ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;
}
}
}
- 1. Lập trình socket Android mà không cần kết nối WIFi
- 2. Thời gian chờ kết nối socket Python
- 3. Kết nối HTTP Android
- 4. Tạo SSL-Socket trên Android với chứng chỉ tự ký
- 5. boost :: asio :: ip :: tcp :: socket được kết nối?
- 6. Làm thế nào để mô phỏng mất kết nối socket?
- 7. node.js không gửi socket ngắt kết nối sự kiện
- 8. Bất kỳ sự khác biệt nào giữa kết nối socket và kết nối tcp?
- 9. Kết nối JDBC trong Android
- 10. Làm thế nào để tôi kết nối lại một cách hiệu quả boost :: socket sau khi ngắt kết nối?
- 11. cách kiểm tra Internet thực được kết nối trong Android?
- 12. Android: Cách kết nối với Lịch Google?
- 13. Cách tạo nút Liên kết trong android
- 14. Trình tạo trình kết nối Android không thành công
- 15. Kết nối mạng gói trong Android
- 16. C, lập trình socket: Kết nối nhiều máy khách với máy chủ bằng cách chọn()
- 17. Giá trị mặc định cho kết nối và thời gian chờ socket trong DefaultHttpClient trên Android là gì?
- 18. Cách kết nối với facebook trong ứng dụng Android
- 19. Cách tắt tự động kết nối WIFI trong Android
- 20. Cách tắt kết nối GSM trong Android theo lập trình
- 21. Làm cách nào để tạo vòng kết nối có số?
- 22. Kết nối 2 hình ảnh trong android
- 23. bluetooth android không thể kết nối
- 24. Internet kết nối kiểm tra trong Android
- 25. Lỗi kết nối Bluetooth Android
- 26. Kết nối WiFi qua android
- 27. Kết nối/Ghép nối tai nghe Bluetooth và Android
- 28. Cách sử dụng tệp .key và .pem để tạo SSL socket trong Android?
- 29. cách tạo kết nối pymongo theo yêu cầu trong Flask
- 30. Trong Java, tại sao readLine() chặn trên một kết nối socket đóng?
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? –
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 –
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 đó. –