2013-02-17 198 views
0

如果这是一个非常普遍的问题,我很抱歉,但我不知道从哪里开始,所以我正在寻找想法。Windows应用程序和Android应用程序之间的通信

我有一个Windows应用程序(音乐分数编辑),我目前正在将它移植到Andriod,它会顺利进行。

我想添加功能比在Windows应用程序中创建的文件可以发送给用户的Android平板电脑。我想知道,如何在Android上编写某种监听程序,Windows端可以打开一个套接字或将某个数据发送到它,假设它们都在同一个本地网络上。

谢谢

回答

0

我认为直接通过本地网络发送文件不是最好的办法。你很容易受到很多用户抱怨分享不起作用......这主要是由于他们自己的网络配置问题。

为什么不使用像DropBox这样的服务来实现文件共享?

像DropBox这样的服务提供了简单的API,可以在应用程序中使用,以便将文件保存到远程文件夹中,并从远程文件夹中读取文件。

这样,用户就不必在同一个网络中......而实现文件共享的大部分工作将由一个专注于此的服务完成。

增加:

如果你不想需要像DropBox的一个单独的服务帐户,可以考虑这种方法:自己的Web服务器上实现一个非常简单的DropBox般的服务。制作一个简单的脚本,允许用户通过HTTP匿名上传文件到服务器。上传完成后,他们会收到一个5位数的ID文件或其他可以共享的链接。从第二个应用程序使用此ID或链接时,可以下载该文件(再次通过HTTP)。如果您在几个小时后从服务器自动删除文件,则不会耗尽空间。

您可以使用大约20行PHP代码实现这样的服务。所需的应用程序代码非常简单(因为它只依赖于HTTP)。如果您担心Web服务器的成本,您可以从每月5美元左右获得一个,甚至可以使用Google App Engine等免费服务(如果您的带宽+空间要求较低,则免费)。

代码example用于文件上传。下载应该足够简单,可以独自完成。关于定期文件删除 - 明显的方法是cron,但我认为没有它就很容易管理。只要您接受新的上传(在PHP脚本中),请检查所有下载并删除旧的。

+0

有趣的想法,但需要用于获得一个Dropbox帐户的权利?另外,它是否支持在Windows端?看起来像它只是android和ios API。但我会研究它。谢谢 – steveh 2013-02-17 15:42:22

+0

查看更新回答 – talkol 2013-02-17 15:49:45

+0

我很乐意收到有关downvote的评论,所以我可以改进回答 – talkol 2013-02-17 16:43:55

0

我写了一个小东西,所以我的Windows应用程序可以找到我的本地网络上运行的Android应用程序的一个实例,在这里。这是Android的代码首先

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.Arrays; 

import android.os.AsyncTask; 
import android.util.Log; 

public class TabSyncServer extends AsyncTask<Void, Void, Void> { 

    ServerSocket mServerSocket = null; 
    Socket mSocket = null; 
    DataInputStream mDataInputStream = null; 
    DataOutputStream mDataOutputStream = null; 

    @Override 
    protected void onPreExecute() { 

     try { 
      mServerSocket = new ServerSocket(2112); 
      //System.out.println("Listening :2112"); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected Void doInBackground(Void... args) { 
     byte[] bytebuf = new byte[1024]; 
     while (true) { 
      try { 

       mSocket = mServerSocket.accept(); 
       mDataInputStream = new DataInputStream(mSocket.getInputStream()); 
       mDataOutputStream = new DataOutputStream(mSocket.getOutputStream()); 
       Log.d("TabSyncServer", "ip: " + mSocket.getInetAddress()); 
       mDataInputStream.read(bytebuf); 

       String str = new String(bytebuf, "UTF8"); 
       Log.d("TabSyncServer", "message: " + str); 
       if(str.contains("Hello Android")) { 
        Log.d("TabSyncServer", "sending reply"); 
        mDataOutputStream.writeBytes("Hello Windows"); 
       } 

       // 

      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } finally { 
       if (mSocket != null) { 
        try { 
         mSocket.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 

       if (mDataInputStream != null) { 
        try { 
         mDataInputStream.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 

       if (mDataOutputStream != null) { 
        try { 
         mDataOutputStream.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 

    } 

} 

和Windows MFC代码

void CMainFrame::OnBrowseMobile() { 


    CMobileSync* con = new CMobileSync(); 
    CString ipaddr_base; 
    int my_last_digit; 
    if(!con->getMyIP(ipaddr_base, my_last_digit)) { 
     setMobilePath("Can't find local network"); 
     return; 
    } 


    for(int i=1 ; i<98 ; i++) { 
     if(i==my_last_digit) 
      continue;  // don;t check self 

     CString ipaddr; ipaddr.Format("%s.%d", ipaddr_base, i); 
     bool res = con->ConnectToHost(ipaddr); 
     if(res) { 
      res = con->SendMsg ("Hello Android"); 

      if(res) { 
       TRACE1("send ok %s\n",ipaddr.GetBuffer()); 
#define RD_BUF_LEN 80 
       char buffer[RD_BUF_LEN]; 
       if(con->ListenOnPortBlocking(buffer, RD_BUF_LEN)) { 
        if(strncmp(buffer, "Hello Windows", 12)==0) { 
         TRACE1("reply ok %s", buffer); 
         setMobilePath(ipaddr); 
         con->CloseConnection(); 
         return; 
        } 
       } 
      } else { 
       TRACE("send FAILED\n"); 
      } 
     } 
     con->CloseConnection(); 
    } 
    setMobilePath("No TabTrax on local network"); 
} 

#include "stdafx.h" 
#include <winsock.h> 
#include "MobileSync.h" 

#define TTPORT 2112 
bool CMobileSync::getMyIP(CString& ipaddr_front, int& ipaddr_lastdigit) 
{ 
    char szBuffer[1024]; 

    #ifdef WIN32 
    WSADATA wsaData; 
    WORD wVersionRequested = MAKEWORD(2, 0); 
    if(::WSAStartup(wVersionRequested, &wsaData) != 0) 
     return false; 
    #endif 


    if(gethostname(szBuffer, sizeof(szBuffer)) == SOCKET_ERROR) 
    { 
     #ifdef WIN32 
     WSACleanup(); 
     #endif 
     return false; 
    } 

    struct hostent *host = gethostbyname(szBuffer); 
    if(host == NULL) 
    { 
     #ifdef WIN32 
     WSACleanup(); 
     #endif 
     return false; 
    } 

    //Obtain the computer's IP 
    unsigned char b1, b2, b3, b4; 
    b1 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b1; 
    b2 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b2; 
    b3 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b3; 
    b4 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b4; 

    ipaddr_front.Format("%d.%d.%d", b1, b2, b3); 
    ipaddr_lastdigit = b4; 
    #ifdef WIN32 
    WSACleanup(); 
    #endif 
    return true; 
} 

//CONNECTTOHOST – Connects to a remote host 
bool CMobileSync::ConnectToHost(const char* IPAddress) 
{ 
    //Start up Winsock… 
    WSADATA wsadata; 

    int error = WSAStartup(0x0202, &wsadata); 

    //Did something happen? 
    if (error) 
     return false; 

    //Did we get the right Winsock version? 
    if (wsadata.wVersion != 0x0202) 
    { 
     WSACleanup(); //Clean up Winsock 
     return false; 
    } 

    //Fill out the information needed to initialize a socket… 
    SOCKADDR_IN target; //Socket address information 

    target.sin_family = AF_INET; // address family Internet 
    target.sin_port = htons (TTPORT); //Port to connect on 
    target.sin_addr.s_addr = inet_addr (IPAddress); //Target IP 

    mSocket = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); //Create socket 
    if (mSocket == INVALID_SOCKET) 
    { 
     return false; //Couldn't create the socket 
    } 

    //Try connecting... 

    if (connect(mSocket, (SOCKADDR *)&target, sizeof(target)) == SOCKET_ERROR) 
    { 
     return false; //Couldn't connect 
    } 

    return true; //Success 
} 

//CLOSECONNECTION – shuts down the socket and closes any connection on it 
void CMobileSync::CloseConnection() 
{ 
    //Close the socket if it exists 
    if (mSocket) 
     closesocket(mSocket); 
    mSocket=0; 

    WSACleanup(); //Clean up Winsock 
} 

int CMobileSync::SendMsg (char* szpText, int buflen) 
{ 
    if(buflen==0) 
     buflen = strlen(szpText); 
    int ret = send(mSocket, szpText, buflen, 0); 
    TRACE1("CMobileSync::SendMsg sent %d bytes\n", ret); 
    return ret; 
} 

WSADATA w; 

//LISTENONPORT – Listens on a specified port for incoming connections 
//or data 
bool CMobileSync::ListenOnPortBlocking(char* buffer, int buflen) 
{ 
    //Now we can start listening (allowing as many connections as possible to 
    //be made at the same time using SOMAXCONN). You could specify any 
    //integer value equal to or lesser than SOMAXCONN instead for custom 
    //purposes). The function will not //return until a connection request is 
    //made 
    // listen(s, SOMAXCONN); 

    memset(buffer, 0, sizeof(buffer)); //Clear the buffer 

    int iTimeout = 1600; 
    setsockopt(mSocket, SOL_SOCKET, SO_RCVTIMEO, (const char *)&iTimeout, sizeof(iTimeout)); 

    //Put the incoming text into our buffer 
    int ret = recv (mSocket, buffer, buflen-1, 0); 

    //Don't forget to clean up with CloseConnection()! 

    if(ret != SOCKET_ERROR) 
     return true; 

    int err = WSAGetLastError(); 
    return false; 
} 

它不是广泛的测试,但它运行

这也许是有用的人

相关问题