Android与PC端WIFI通信 .

来源:互联网 发布:八岐大蛇 蓝牙 mac 编辑:程序博客网 时间:2024/06/06 02:41

一、摘要

通过笔记本WIFI热点虚拟网络供android手机端使用,笔记本作为通信的服务器端,android手机作为客户端,通过socket进行通信。

二、准备工作

1. 在eclipse下写好服务器端处理代码,包括侦听的端口号,客户端IP地址获取,发送的数据处理

2. 搭建好android开发环境,直接以手机为终端,apk直接会安装到手机上,方便测试。

3. 下载一个WIFI共享软件,这里使用"猎豹2.0",它可以在无网络连接的情况下,构建一个以PC为路由器的局域网

三、原理图

四、详细代码

1. 服务器端处理代码

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. import java.net.*;  
  2. import java.io.*;  
  3.   
  4. public class SocketService {  
  5.     private ServerSocket server;  
  6.     private Socket client;   
  7.     private BufferedReader in;  
  8.     private PrintWriter out;  
  9.   
  10.     public SocketService() {  
  11.         try {  
  12.             server = new ServerSocket(9400);  
  13.             while(true){  
  14.                 System.out.println("start!");  
  15.             //获得客户端连接   
  16.              client = server.accept();  
  17.              //获得客户端的IP和端口   
  18.              String remoteIP = client.getInetAddress().getHostAddress();  
  19.              int remotePort = client.getLocalPort();  
  20.               
  21.              System.out.println("A client connected. IP:" + remoteIP + ", Port: " + remotePort);  
  22.              System.out.println();  
  23.               
  24.              //获得 client 端的输入输出流,为进行交互做准备   
  25.              in = new BufferedReader(new InputStreamReader(client.getInputStream()));  
  26.              out = new PrintWriter(client.getOutputStream(),false);  
  27.               
  28.              //获得 client 端发送的数据   
  29.              String tmp = in.readLine();  
  30. //           String content = new String(tmp.getBytes("utf-8"));  
  31.              System.out.println("Client message is: " + tmp);  
  32.               
  33.             // 向 client 端发送响应数据   
  34.              out.println("Your message has been received successfully!.");  
  35.               
  36.              //关闭各个流   
  37.             out.close();  
  38.             in.close();  
  39.              //server.close();      
  40.             }   
  41.            }catch(Exception e){  
  42.            // 发送响应,接收失败   
  43.                System.out.println(e.toString());  
  44.             out.println("Receive Error!");  
  45.            }  
  46.     }  
  47.   
  48.     public static void main(String[] args) {  
  49.         new SocketService();  
  50.     }  
  51. }  

2. android端布局如下

3. ClientActivity.java内容

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. import java.io.IOException;  
  2. import java.io.PrintStream;  
  3. import java.net.Socket;  
  4. import java.net.UnknownHostException;  
  5. import com.google.zxing.client.android.R;  
  6.   
  7. import android.os.Bundle;  
  8. import android.app.Activity;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12. import android.widget.EditText;  
  13. import android.widget.Toast;  
  14.   
  15. public class ClientActivity extends Activity{  
  16.       
  17.     private Button btnConnect;  
  18.       
  19.     private Button btnSend;  
  20.       
  21.     private EditText editSend;  
  22.       
  23.     private Socket socket;  
  24.       
  25.     private PrintStream output;  
  26.       
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.activity_client);  
  31.       
  32. //      Toast.makeText(ClientActivity.this, this.getIntent().getStringExtra("message"), Toast.LENGTH_LONG).show();  
  33.           
  34.         initView();  
  35.           
  36.         btnConnect.setOnClickListener(new OnClickListener() {  
  37.               
  38.             @Override  
  39.             public void onClick(View arg0) {  
  40.                 initClientSocket();  
  41.             }  
  42.   
  43.         });  
  44.           
  45.         btnSend.setOnClickListener(new OnClickListener() {  
  46.               
  47.             @Override  
  48.             public void onClick(View arg0) {  
  49.                 sendMessage(editSend.getText().toString());  
  50.             }  
  51.         });  
  52.     }  
  53.   
  54.     private void initView() {  
  55.         btnConnect = (Button) findViewById(R.id.btnConnect);  
  56.         btnSend = (Button) findViewById(R.id.btnSend);  
  57.         editSend = (EditText) findViewById(R.id.editSend);  
  58.           
  59.         btnSend.setEnabled(false);  
  60.         editSend.setEnabled(false);  
  61.     }  
  62.   
  63.     private void sendMessage(String str) {  
  64.         output.println(str);  
  65.     }  
  66.       
  67.     public void closeSocket() {  
  68.         try {  
  69.             output.close();  
  70.             socket.close();  
  71.         } catch (IOException e) {  
  72.             handleException(e, "close Exception: ");  
  73.         }  
  74.     }  
  75.       
  76.     private void initClientSocket() {  
  77.         try {  
  78.             //new    
  79.             EditText edit_ip = (EditText) ClientActivity.this.findViewById(R.id.edit_hostIp);  
  80.             EditText edit_port = (EditText) ClientActivity.this.findViewById(R.id.edit_hostPort);  
  81.             String ip = edit_ip.getText().toString().trim();  
  82.             String port = edit_port.getText().toString().trim();  
  83.                       
  84.             socket = new Socket(ip,Integer.parseInt(port));  
  85.               
  86.             //get output Stream   
  87.             output = new PrintStream(socket.getOutputStream(),true,"gbk");  
  88. //          output = new PrintStream(socket.getOutputStream(),true);  
  89.               
  90.             btnConnect.setEnabled(false);  
  91.             editSend.setEnabled(true);  
  92.             btnSend.setEnabled(true);  
  93.               
  94.         } catch (UnknownHostException e) {  
  95.             Toast.makeText(ClientActivity.this"请检查端口号是否为服务器IP", Toast.LENGTH_LONG).show();  
  96. //          handleException(e, "UnknownHostException: " + e);  
  97.         } catch (IOException e) {  
  98.             Toast.makeText(ClientActivity.this"服务器未开启", Toast.LENGTH_LONG).show();  
  99. //          handleException(e, "IOException" + e);  
  100.         }  
  101.           
  102.     }  
  103.       
  104. }  
上面有些代码是没有用的,我是从自己的工程里面截取了一部分,部分没有删除。代码的整体逻辑:在未创建socket连接前,除连接按钮是可用的外,发送和文本框均是不可用的,只有与服务器端连接成功,控件才可用

五、运行

1. 开启服务器端,服务端开始监听9400端口

2将android工程运行到手机上,通过豌豆荚可以将手机画面截取下来

3.当触发“连接”按钮时,可以看到服务器端

同时,手机端可以填写你要发送的内容了,改程序对乱码问题也进行了很好的处理,首先要知道你的工程的编码,发送数据时就指定该该种编码规则,就不会出现乱码了。

单击发送按钮,服务器端接收情况如下:

这里,就基本完成了Android手机与PC端的socket通信,当然还可以增加,手机端接收是否发送成功之类的反馈信息,那样就更加完整了。

0 0
原创粉丝点击