Tôi đang cố gắng phát triển một ứng dụng Android có thể trao đổi dữ liệu trên kết nối ngang hàng với các thiết bị khác không có máy chủ. Vì vậy, xin vui lòng đề nghị làm thế nào tôi có thể làm điều này. Cảm ơn bạn trước.Làm thế nào tôi có thể kết nối hai thiết bị Android bằng ổ cắm không có máy chủ
Trả lời
Java cung cấp ServerSocket và Socket để giao tiếp các thiết bị b/w. Một trong những thiết bị mà bạn có thể thực hiện như máy chủ và thiết bị khác mà bạn có thể thực hiện với tư cách máy khách và giao tiếp b/w 'em mà không giới thiệu máy chủ được lưu trữ trên một số máy.
Tùy chọn khác và tốt hơn là Sử dụng Wi-Fi Peer-to-Peer. WifiP2pManager giúp bạn đạt được mục đích của mình. Here là một ví dụ.
Đây là mã hoàn chỉnh để trò chuyện bằng SocketProgramming không có máy chủ.
Trong ứng dụng của tôi, trước tiên bạn là khách hàng và bạn tìm kiếm một máy chủ. Khi bạn không tìm thấy bất kỳ máy chủ, bạn trở thành một máy chủ và chờ đợi cho một khách hàng.
public class MainActivity extends ActionBarActivity {
private Handler handler = new Handler();
private TextView text;
private EditText input;
private Button send;
private Socket socket;
private DataOutputStream outputStream;
private BufferedReader inputStream;
private String DeviceName = "Device";
private boolean searchNetwork() {
log("Connecting");
String range = "192.168.56.";
for (int i = 1; i <= 255; i++) {
String ip = range + i;
try {
socket = new Socket();
socket.connect(new InetSocketAddress(ip, 9000), 50);
outputStream = new DataOutputStream(socket.getOutputStream());
inputStream = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
DeviceName += "1";
Log.i("Server", DeviceName);
log("Connected");
return true;
} catch (Exception e) {
}
}
return false;
}
private void runNewChatServer() {
ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(9000);
log("Waiting for client...");
socket = serverSocket.accept();
DeviceName += "2";
log("a new client Connected");
} catch (IOException e) {
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.text);
input = (EditText) findViewById(R.id.input);
send = (Button) findViewById(R.id.send);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
if (!searchNetwork()) {
runNewChatServer();
}
outputStream = new DataOutputStream(
socket.getOutputStream());
inputStream = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
while (true) {
String Message = inputStream.readLine();
if (Message != null) {
log(Message);
}
}
} catch (IOException e) {
log("Error: IO Exception");
e.printStackTrace();
}
}
});
send.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (outputStream == null) {
return;
}
try {
String Message = input.getText().toString() + "\n";
outputStream.write(Message.getBytes());
log2(input.getText().toString());
} catch (IOException e) {
e.printStackTrace();
}
input.setText("");
}
});
thread.start();
}
private void log(final String message) {
handler.post(new Runnable() {
String DeviceName2="";
@Override
public void run() {
if (DeviceName.equals("Device1")) {
DeviceName2 = "Device2";
}else if(DeviceName.equals("Device2")) {
DeviceName2 = "Device1";
}else{
DeviceName2 = "UnknowDevice";
}
text.setText(text.getText() + "\n" + DeviceName2 + " :"
+ message);
}
});
}
private void log2(final String message) {
handler.post(new Runnable() {
@Override
public void run() {
text.setText(text.getText() + "\n" + "you" + " :"
+ message);
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.exit(0);
return true;
}
return super.onKeyDown(keyCode, event);
}
}
Điều này có một giả định trên mặt nạ mạng con. Thay vào đó, bạn tốt hơn có thể gửi một datagram trên ip phát sóng của mạng, một cái gì đó như chi tiết ở đây: http://michieldemey.be/blog/network-discovery-using-udp-broadcast/ –
Nếu bạn đang tìm kiếm P2P như vậy trên một mạng cục bộ, có hai phần với nó:
- đồng nghiệp Khám phá
- Giao tiếp với đồng nghiệp
Trong số API Android , bạn có thể sử dụng Network Service Discovery APIs cho điều này hoặc Wifi P2P Service Discovery APIs.
Có thư viện trình bao trong đó sử dụng các thư viện này trong nội bộ và có tài liệu tương đối tốt hơn - Salut, cũng có thể được sử dụng.
Tôi cũng đã tạo a library for P2P - Near, sử dụng ổ cắm trực tiếp. Vấn đề tôi phải đối mặt với API Android là khám phá đó không xảy ra chắc chắn mỗi lần và vấn đề cơ bản chưa được biết.
Nếu bạn đang tìm kiếm P2P qua internet, socket IO là giải pháp phổ biến. Ngay cả Near cũng có thể tạo thuận lợi cho việc chuyển nếu bạn cung cấp địa chỉ IP và chúng không nằm sau tường lửa NAT.
thiết kế của bạn có một vấn đề lớn: ...
Nếu không có máy chủ trung tâm một số thiết bị Android nên đóng vai trò là khách hàng và những người khác như máy chủ nhưng điều này sẽ không làm việc trong một số trường hợp:
Khi nhà cung cấp điện thoại di động gán IP riêng tư và không công khai IP
Khi thiết bị được kết nối với mạng Wi-Fi nhưng không có quy tắc NAT nào được xác định trên bộ định tuyến.
Trong cả hai trường hợp, cổng nghe của thiết bị phải hoạt động như máy chủ không thể truy cập được.
- 1. Có thể có bao nhiêu kết nối ổ cắm?
- 2. Làm cách nào để kết nối hai máy chủ node.js với ổ cắm web?
- 3. không thể kết nối với ổ cắm bluetooth trên android
- 4. Cách kết nối máy chủ Ổ cắm qua proxy HTTP
- 5. Có thể kết nối hai thiết bị ios bằng cách sử dụng ổ cắm bằng cách nhận địa chỉ IP của chúng không?
- 6. Ổ cắm Android: java.net.SocketException: Không có đường dẫn đến máy chủ
- 7. xem máy chủ web qua ổ cắm. . .
- 8. Ổ cắm Java: Tôi có thể viết một máy chủ TCP với một luồng không?
- 9. Ổ cắm Java (Android tới máy chủ Java)
- 10. Cách thiết bị IoT kết nối với máy chủ
- 11. Làm cách nào để kiểm tra xem ổ cắm có được kết nối không?
- 12. Ổ cắm ActionScript 3.0 không thể kết nối lại
- 13. Tôi có thể đóng và mở lại ổ cắm không?
- 14. Không thể kết nối đến máy chủ MySQL địa phương thông qua homebrew ổ cắm
- 15. Ổ cắm Java và các kết nối bị rơi
- 16. NodeJS: Làm thế nào tôi có thể tạo ra một ổ cắm tcp giả cho các máy chủ thử nghiệm
- 17. Có thể tạm thời vô hiệu hóa kết nối ổ cắm web trong môi trường máy chủ cục bộ không?
- 18. Làm thế nào để biết khi nào một Ổ cắm đã bị ngắt kết nối
- 19. Quy tắc kết nối ổ cắm liên tục của Android
- 20. Đặt lại kết nối ổ cắm trước khi tôi có thể đọc dữ liệu
- 21. Bạn có thể thiết lập nhiều kết nối Bluetooth giữa hai thiết bị giống nhau trong Android không?
- 22. Tôi có thể gặp lỗi "không thể thiết lập kết nối" cho kết nối websocket không thành công không?
- 23. Lỗi ổ cắm: kết nối bị từ chối - tôi đang làm gì sai?
- 24. Kết nối máy khách IPv4 với máy chủ IPv6: kết nối bị từ chối
- 25. PyQt5: Làm thế nào tôi có thể kết nối QPushButton với một khe cắm?
- 26. Việc đóng luồng đầu vào của ổ cắm cũng có đóng kết nối ổ cắm không?
- 27. Android nghe tin nhắn từ ổ cắm máy chủ
- 28. Máy chủ IO ổ cắm vào máy chủ
- 29. Làm thế nào tôi có thể nhận được tất cả các ổ đĩa USB (cắm vào)
- 30. Kết nối Ổ cắm PHP Qua Proxy
Bạn làm như mọi giao tiếp ổ cắm khác. – HamZa
@HamZa Bạn có thể đưa ra bất kỳ tham chiếu nào vì tôi mới trong giao tiếp socket không. –
Bạn thậm chí không muốn tạo một android làm máy chủ và một máy khách khác là máy khách – ashutiwari4