歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android在wifi下手機與電腦的socket通信

Android在wifi下手機與電腦的socket通信

日期:2017/3/1 10:33:42   编辑:Linux編程

在wifi局域網下,手機可以和電腦通過socket通信。手機做服務端,電腦做客戶端;也可以反過來,電腦做服務端,手機做客戶端。

下面介紹的是手機作為服務端,電腦使用MFC編程作為客戶端,原理是,手機建立一個ServerSocket,並獲取自己的ip地址和端口port;然後電腦通過socket連接手機的ip:port。

核心代碼如下:

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.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. } catch (IOException e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. }
  19. }
  20. };

手機上獲取的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. wVersionrequested = MAKEWORD(2,0);
  14. //Start Sock
  15. int err = WSAStartup(wVersionrequested,&wsaData);
  16. if (err == -1)
  17. {
  18. MessageBox(0,"WSAStartup err", "error",MB_OK);
  19. return FALSE;
  20. }
  21. return TRUE;
  22. }
  23. BOOL ConnectSock()
  24. {
  25. SOCKET clientSockConnect;
  26. u_short port;
  27. //Ini Sock
  28. clientSock = socket(AF_INET,SOCK_STREAM,0);
  29. if (ServerSock < 0)
  30. {
  31. MessageBox(0,"scoker err",
  32. "err",MB_OK);
  33. return FALSE;
  34. }
  35. char *strPort = strstr(server_address, ":");
  36. if( (strPort!=NULL) && (strlen(strPort)>2) )
  37. {
  38. port = atoi(strPort+1);
  39. if(port==0)
  40. {
  41. MessageBox(0, "IP端口不對, 參考例子:192.168.12.134:8981", "提示", MB_OK);
  42. return FALSE;
  43. }
  44. memset(strPort, 0, sizeof(strPort));
  45. }
  46. else
  47. {
  48. MessageBox(0, "IP地址不對, 參考例子:192.168.12.134:8981", "提示", MB_OK);
  49. return FALSE;
  50. }
  51. //Connect
  52. server_ip.sin_family = AF_INET;
  53. server_ip.sin_port = ((port&0xff00)>>8)|((port&0x00ff)<<8);
  54. server_ip.sin_addr.S_un.S_addr = inet_addr(server_address);
  55. clientSockConnect = connect(clientSock,(struct sockaddr*)&server_ip,sizeof(server_ip));
  56. if (clientSockConnect!=0)
  57. {
  58. CString temp;
  59. temp.Format("系統拒絕連接,可能是輸入IP地址或端口不對:\n%s:%d", server_address, server_ip.sin_port);
  60. SetDlgItemText( FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, temp);
  61. MessageBox(0, "系統拒絕連接,可能是輸入IP地址或端口不對 ", "提示", MB_OK);
  62. return FALSE;
  63. }
  64. return TRUE;
  65. }
  66. DWORD WINAPI clientThreadFunc(LPVOID threadNum)
  67. {
  68. int length;
  69. CString temp;
  70. if(!InItClientSock())
  71. return 0;
  72. if(!ConnectSock())
  73. return 0;
  74. //等待連接的時候,連接可能被取消。
  75. if(clientThreadRun)
  76. SetDlgItemText(FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, "已經連接上!");
  77. else
  78. {
  79. SetDlgItemText(FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, "請啟動服務!");
  80. return 0;
  81. }
  82. //send(NewSock,(char*)&FALG,sizeof(FALG)+1,MSG_OOB);
  83. while(clientThreadRun)
  84. {
  85. if( (length = recv(clientSock,(char*)recv_message_client,sizeof(recv_message_client),0))>0)
  86. {
  87. //MessageBox(0, recv_message, "接收到的信息", MB_OK);
  88. temp.Format("接收到的信息:\n%s",recv_message_client);
  89. SetDlgItemText(FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, temp);
  90. analyseCommand(recv_message_client);
  91. memset(recv_message_client, 0, sizeof(recv_message_client));
  92. }
  93. temp.Format("接收到的信息:\n%s",recv_message_client);
  94. }
  95. return 0;
  96. }
Copyright © Linux教程網 All Rights Reserved