2015-03-20 15 views
6

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ủ

+0

Bạn làm như mọi giao tiếp ổ cắm khác. – HamZa

+0

@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. –

+0

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

Trả lời

3

Java cung cấp ServerSocketSocket để 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ụ.

3

Đâ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); 
} 

} 
+0

Đ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/ –

1

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ó:

  1. đồng nghiệp Khám phá
  2. 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.

1

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.

Các vấn đề liên quan