我想從android設備傳輸消息到桌面應用程序。我的問題是,我可以連接的Android WiFi設備與桌面WiFi設備沒有任何使用互聯網連接。我想像藍牙一樣使用它。這可能嗎?如果有可能,那我該如何執行它?使用Android的WIFI到WIFI連接性
感謝和問候 阿米特Thaper
我想從android設備傳輸消息到桌面應用程序。我的問題是,我可以連接的Android WiFi設備與桌面WiFi設備沒有任何使用互聯網連接。我想像藍牙一樣使用它。這可能嗎?如果有可能,那我該如何執行它?使用Android的WIFI到WIFI連接性
感謝和問候 阿米特Thaper
這裏是mreichelt的建議的實施。當我遇到同樣的問題時,我查找了這個問題,並且認爲我只是發佈瞭解決方案的實施。它非常簡單。我還構建了一個Java服務器,用於偵聽來自android設備的傳入請求(主要用於調試目的)。這裏的代碼發送的東西通過無線:
import java.net.*;
import java.io.*;
import java.util.*;
import android.app.Activity;
import android.content.Context;
import android.content.ContentValues;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.util.Log;
public class SMSConnection {
/* The socket to the server */
private Socket connection;
/* Streams for reading and writing the socket */
private BufferedReader fromServer;
private DataOutputStream toServer;
/* application context */
Context mCtx;
private static final String CRLF = "\r\n";
/* Create an SMSConnection object. Create the socket and the
associated streams. Initialize SMS connection. */
public SMSConnection(Context ctx) throws IOException {
mCtx=ctx;
this.open();
/* may anticipate problems with readers being initialized before connection is opened? */
fromServer = new BufferedReader(new InputStreamReader(connection.getInputStream()));
toServer = new DataOutputStream(connection.getOutputStream());
}
public boolean open(String host, int port) {
try {
connection = new Socket(host, port);
return true;
} catch(IOException e) {
Log.v("smswifi", "cannot open connection: " + e.toString());
}
return false;
}
/* Close the connection. */
public void close() {
try {
connection.close();
} catch (IOException e) {
Log.v("smswifi","Unable to close connection: " + e.toString());
}
}
/* Send an SMS command to the server. Check that the reply code
is what is is supposed to be according to RFC 821. */
public void sendCommand(String command) throws IOException {
/* Write command to server. */
this.toServer.writeBytes(command+this.CRLF);
/* read reply */
String reply = this.fromServer.readLine();
}
}
這是一個連接類的基本骨架。你只需實例化這個類,然後在使用主機和端口創建的實例上調用open(不要忘記在完成時關閉連接),並且可以根據自己的喜好更改sendCommand的主體。作爲一個例子,我在函數體中包含了一個讀/寫操作。
這是在遠程機器上運行服務器的代碼,該服務器偵聽連接並生成一個線程來處理每個請求。它可以輕鬆地與上面的代碼進行交互以進行調試(或任何使用)。
import java.io.*;
import java.net.*;
import java.util.*;
public final class smsd {
///////MEMBER VARIABLES
ServerSocket server=null;
Socket client=null;
///////MEMBER FUNCTIONS
public boolean createSocket(int port) {
try{
server = new ServerSocket(port);
} catch (IOException e) {
System.out.println("Could not listen on port "+port);
System.exit(-1);
}
return true;
}
public boolean listenSocket(){
try{
client = server.accept();
} catch (IOException e) {
System.out.println("Accept failed: ");
System.exit(-1);
}
return true;
}
public static void main(String argv[]) throws Exception {
//
smsd mySock=new smsd();
//establish the listen socket
mySock.createSocket(3005);
while(true) {
if(mySock.listenSocket()) {
//make new thread
// Construct an object to process the SMS request message.
SMSRequest request = new SMSRequest(mySock.client);
// Create a new thread to process the request.
Thread thread = new Thread(request);
// Start the thread.
thread.start();
}
}
//process SMS service requests in an infinite loop
}
///////////end class smsd/////////
}
final class SMSRequest implements Runnable {
//
final static String CRLF = "\r\n";
Socket socket;
// Constructor
public SMSRequest(Socket socket) throws Exception
{
this.socket = socket;
}
// Implement the run() method of the Runnable interface.
public void run()
{
try {
processRequest();
} catch (Exception e) {
System.out.println(e);
}
}
private static void sendBytes(FileInputStream fis, OutputStream os) throws Exception
{
// Construct a 1K buffer to hold bytes on their way to the socket.
byte[] buffer = new byte[1024];
int bytes = 0;
// Copy requested file into the socket's output stream.
while((bytes = fis.read(buffer)) != -1) {
os.write(buffer, 0, bytes);
}
}
private void processRequest() throws Exception
{
// Get a reference to the socket's input and output streams.
InputStream is = this.socket.getInputStream();
DataOutputStream os = new DataOutputStream(this.socket.getOutputStream());
// Set up input stream filters.
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
// Get the request line of the SMS request message.
String requestLine = br.readLine();
//print message to screen
System.out.println(requestLine);
//send a reply
os.writeBytes("200");
// Close streams and socket.
os.close();
br.close();
socket.close();
}
}
nb4namingconventions。
差點忘了。您需要在AndroidManifest.xml中的標籤內設置這些權限才能使用無線。
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
這是容易地如果兩個設備都使用相同的WiFi網絡可以相互ping。您可以在桌面上創建一個Java應用程序,創建一個ServerSocket
。然後,您可以使用桌面的IP地址在Android應用程序中打開Socket
,並通過OutputStream
發送數據。
我相信阿米特是指使用無線方式直接相互連接的機器。
目前有Wifi-direct規範的開發允許即插即用設置接入點。目前的問題是確保其中一臺機器是其他機器可以建立連接的AP。
我對這與Ad-Hoc網絡的關係感興趣。我沒有解決方案,但是我對這個問題也很感興趣! (假設這是你的問題阿米特)。
是的,我想通過Eric定義的方式進行連接。例子來澄清答案是手機藍牙。我想要像藍牙一樣使用WiFi與兩臺設備配對,而不使用任何路由器。 – 2011-02-10 10:38:41
這個問題很難閱讀,請檢查你的格式! – 2010-11-24 11:36:25