首页 文章

使用Android的WIFI到WIFI连接

提问于
浏览
12

我想将消息从Android设备传输到桌面应用程序 . 我的问题是,我可以连接Android WiFi设备与桌面WiFi设备,而无需使用互联网连接 . 我想像蓝牙一样使用它 . 这有可能吗?如果有可能那么我该如何实现呢?

谢谢并问候Amit Thaper

3 回答

  • 15

    这是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" />
    
  • 2

    如果两个设备使用相同的wifi网络并且可以相互ping通,则这很容易实现 . 您可以在桌面上创建一个创建ServerSocket的Java应用程序 . 然后,您可以使用桌面的IP地址在Android应用中打开Socket,然后通过 OutputStream 发送数据 .

  • 2

    我相信Amit指的是让机器使用无线直接相互连接 .

    目前正在开发Wifi-direct规范以允许接入点的即插即用设置 . 目前的问题是确保其中一台机器是其他机器可以 Build 连接的AP .

    我对这与Ad-Hoc网络的关系感兴趣 . 我没有解决方案,但我对这个问题也很感兴趣! (假设这是你的问题Amit) .

相关问题