Android在wifi下手机与电脑的socket通信


在wifi局域网下,手机可以和电脑通过socket通信。手机做服务端,电脑做客户端;也可以反过来,电脑做服务端,手机做客户端。

下面介绍的是手机作为服务端,电脑使用MFC编程作为客户端,原理是,手机建立一个ServerSocket,并获取自己的ip地址和端口port;然后电脑通过socket连接手机的ip:port。

核心代码如下:

免费下载地址在 http://linux.bkjia.com/

用户名与密码都是www.bkjia.com

具体下载目录在 /2012年资料/2月/8日/Android在wifi下手机与电脑的socket通信/

 

手机建立socketServer代码

[html]
  1. private ServerSocket serverSocket = null;  
  2. private Runnable    mcreateRunnable = new Runnable()   
  3. {  
  4.     public void run()  
  5.     {                 
  6.         try {  
  7.             serverSocket = new ServerSocket(0);//系统分配端口                   
  8.             getLocalIpAddress();//获得手机的ip地址  
  9.                         //方法用于等待客服连接   
  10.                         mSocketServer = serverSocket.accept();                          
  11.                         //接受客服端数据BufferedReader对象  
  12.                         mBufferedReaderServer = new BufferedReader(new InputStreamReader(mSocketServer.getInputStream()));  
  13.                         //给客服端发送数据  
  14.                         mPrintWriterServer = new PrintWriter(mSocketServer.getOutputStream(),true);  
  15.                       
  16.         } catch (IOException e) {  
  17.             // TODO Auto-generated catch block  
  18.             e.printStackTrace();  
  19.         }  
  20.     }  
  21. };  

手机上获取的ip地址代码

[html]
  1. public String getLocalIpAddress()   
  2. {  
  3.     try {  
  4.         for (Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();)   
  5.         {  
  6.             NetworkInterface intf = en.nextElement();  
  7.             for (Enumeration<InetAddress> enumIpAddr=intf.getInetAddresses();enumIpAddr.hasMoreElements();)   
  8.             {  
  9.                 InetAddress inetAddress = enumIpAddr.nextElement();  
  10.                 //if (!inetAddress.isLoopbackAddress())   
  11.                 {  
  12.                     //if(inetAddress.isSiteLocalAddress())  
  13.                     {  
  14.                         String ip = "请连接IP:"+inetAddress.getHostAddress()+":"  
  15.                                 + serverSocket.getLocalPort()+ "\n";      
  16.                     }  
  17.                 }  
  18.             }  
  19.         }  
  20.     }   
  21.     catch (SocketException ex) {  
  22.         ex.printStackTrace();   }  
  23. }  

电脑上使用的是MFC编程,socket代码如下

[html]
  1. DWORD clientThreadID;  
  2. SOCKET    clientSock;  
  3. char      server_address[50] = {0};  
  4. char      recv_message_client[256] = {0};  
  5. struct    sockaddr_in server_ip;  
  6. BOOL clientThreadRun = false;  
  7. //client  
  8. BOOL InItClientSock()  
  9. {  
  10.     //Define Variable  
  11.     WORD wVersionrequested;  
  12.     WSADATA wsaData;  
  13.   
  14.     wVersionrequested = MAKEWORD(2,0);  
  15.       
  16.     //Start Sock  
  17.     int err = WSAStartup(wVersionrequested,&wsaData);  
  18.     if (err == -1)  
  19.     {  
  20.         MessageBox(0,"WSAStartup err", "error",MB_OK);  
  21.         return FALSE;  
  22.     }  
  23.     return TRUE;  
  24. }  
  25. BOOL ConnectSock()  
  26. {  
  27.     SOCKET clientSockConnect;  
  28.     u_short port;  
  29.   
  30.     //Ini Sock  
  31.     clientSock = socket(AF_INET,SOCK_STREAM,0);  
  32.     if (ServerSock < 0)  
  33.     {  
  34.             MessageBox(0,"scoker err",  
  35.                  "err",MB_OK);  
  36.             return FALSE;  
  37.     }  
  38.   
  39.     char *strPort = strstr(server_address, ":");  
  40.   
  41.     if( (strPort!=NULL) && (strlen(strPort)>2) )  
  42.     {  
  43.         port = atoi(strPort+1);  
  44.         if(port==0)  
  45.         {  
  46.             MessageBox(0, "IP端口不对, 参考例子:192.168.12.134:8981", "提示", MB_OK);  
  47.             return FALSE;  
  48.         }  
  49.         memset(strPort, 0, sizeof(strPort));  
  50.     }  
  51.     else  
  52.     {  
  53.         MessageBox(0, "IP地址不对, 参考例子:192.168.12.134:8981", "提示", MB_OK);  
  54.         return FALSE;  
  55.     }  
  56.   
  57.     //Connect  
  58.     server_ip.sin_family = AF_INET;  
  59.     server_ip.sin_port = ((port&0xff00)>>8)|((port&0x00ff)<<8);  
  60.     server_ip.sin_addr.S_un.S_addr = inet_addr(server_address);  
  61.   
  62.     clientSockConnect = connect(clientSock,(struct sockaddr*)&server_ip,sizeof(server_ip));  
  63.     if (clientSockConnect!=0)  
  64.     {  
  65.         CString temp;  
  66.         temp.Format("系统拒绝连接,可能是输入IP地址或端口不对:\n%s:%d", server_address, server_ip.sin_port);  
  67.         SetDlgItemText( FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, temp);  
  68.         MessageBox(0, "系统拒绝连接,可能是输入IP地址或端口不对 ", "提示", MB_OK);  
  69.         return FALSE;  
  70.     }  
  71.     return TRUE;  
  72. }  
  73.   
  74. DWORD WINAPI clientThreadFunc(LPVOID threadNum)  
  75. {  
  76.     int length;   
  77.     CString temp;  
  78.   
  79.     if(!InItClientSock())  
  80.         return 0;  
  81.     if(!ConnectSock())  
  82.         return 0;  
  83.       
  84.     //等待连接的时候,连接可能被取消。  
  85.     if(clientThreadRun)  
  86.         SetDlgItemText(FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, "已经连接上!");  
  87.     else  
  88.     {  
  89.         SetDlgItemText(FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, "请启动服务!");  
  90.         return 0;  
  91.     }  
  92.   
  93.     //send(NewSock,(char*)&FALG,sizeof(FALG)+1,MSG_OOB);          
  94.     while(clientThreadRun)  
  95.     {  
  96.         if( (length = recv(clientSock,(char*)recv_message_client,sizeof(recv_message_client),0))>0)  
  97.         {  
  98.             //MessageBox(0, recv_message, "接收到的信息", MB_OK);       
  99.             temp.Format("接收到的信息:\n%s",recv_message_client);  
  100.             SetDlgItemText(FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, temp);  
  101.   
  102.             analyseCommand(recv_message_client);  
  103.             memset(recv_message_client, 0, sizeof(recv_message_client));  
  104.         }  
  105.         temp.Format("接收到的信息:\n%s",recv_message_client);  
  106.     }  
  107.   
  108.     return 0;  
  109. }  

相关内容