Android与PC端WIFI通信

一、摘要

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

二、准备工作

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

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

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

三、原理图

Android与PC端WIFI通信_第1张图片

四、详细代码

1. 服务器端处理代码

import java.net.*;
import java.io.*;

public class SocketService {
	private ServerSocket server;
	private Socket client; 
	private BufferedReader in;
	private PrintWriter out;

	public SocketService() {
		try {
			server = new ServerSocket(9400);
		    while(true){
		    	System.out.println("start!");
		    //获得客户端连接
		     client = server.accept();
		     //获得客户端的IP和端口
		     String remoteIP = client.getInetAddress().getHostAddress();
		     int remotePort = client.getLocalPort();
		    
		     System.out.println("A client connected. IP:" + remoteIP + ", Port: " + remotePort);
		     System.out.println();
		    
		     //获得 client 端的输入输出流,为进行交互做准备
		     in = new BufferedReader(new InputStreamReader(client.getInputStream()));
		     out = new PrintWriter(client.getOutputStream(),false);
		    
		     //获得 client 端发送的数据
		     String tmp = in.readLine();
//		     String content = new String(tmp.getBytes("utf-8"));
		     System.out.println("Client message is: " + tmp);
		    
		    // 向 client 端发送响应数据 
		     out.println("Your message has been received successfully!.");
		    
		     //关闭各个流
		    out.close();
		    in.close();
		     //server.close();    
		    } 
		   }catch(Exception e){
		   // 发送响应,接收失败
			   System.out.println(e.toString());
		    out.println("Receive Error!");
		   }
	}

	public static void main(String[] args) {
		new SocketService();
	}
}

2. android端布局如下

Android与PC端WIFI通信_第2张图片

3. ClientActivity.java内容

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import com.google.zxing.client.android.R;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class ClientActivity extends Activity{
	
	private Button btnConnect;
	
	private Button btnSend;
	
	private EditText editSend;
	
	private Socket socket;
	
	private PrintStream output;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_client);
	
//		Toast.makeText(ClientActivity.this, this.getIntent().getStringExtra("message"), Toast.LENGTH_LONG).show();
		
		initView();
		
		btnConnect.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				initClientSocket();
			}

		});
		
		btnSend.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				sendMessage(editSend.getText().toString());
			}
		});
	}

	private void initView() {
		btnConnect = (Button) findViewById(R.id.btnConnect);
		btnSend = (Button) findViewById(R.id.btnSend);
		editSend = (EditText) findViewById(R.id.editSend);
		
		btnSend.setEnabled(false);
		editSend.setEnabled(false);
	}

	private void sendMessage(String str) {
		output.println(str);
	}
	
	public void closeSocket() {
		try {
			output.close();
			socket.close();
		} catch (IOException e) {
			handleException(e, "close Exception: ");
		}
	}
	
	private void initClientSocket() {
		try {
			//new 
			EditText edit_ip = (EditText) ClientActivity.this.findViewById(R.id.edit_hostIp);
			EditText edit_port = (EditText) ClientActivity.this.findViewById(R.id.edit_hostPort);
			String ip = edit_ip.getText().toString().trim();
			String port = edit_port.getText().toString().trim();
					
			socket = new Socket(ip,Integer.parseInt(port));
			
			//get output Stream
			output = new PrintStream(socket.getOutputStream(),true,"gbk");
//			output = new PrintStream(socket.getOutputStream(),true);
			
			btnConnect.setEnabled(false);
			editSend.setEnabled(true);
			btnSend.setEnabled(true);
			
		} catch (UnknownHostException e) {
			Toast.makeText(ClientActivity.this, "请检查端口号是否为服务器IP", Toast.LENGTH_LONG).show();
//			handleException(e, "UnknownHostException: " + e);
		} catch (IOException e) {
			Toast.makeText(ClientActivity.this, "服务器未开启", Toast.LENGTH_LONG).show();
//			handleException(e, "IOException" + e);
		}
		
	}
	
}
上面有些代码是没有用的,我是从自己的工程里面截取了一部分,部分没有删除。代码的整体逻辑:在未创建socket连接前,除连接按钮是可用的外,发送和文本框均是不可用的,只有与服务器端连接成功,控件才可用

五、运行

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

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

Android与PC端WIFI通信_第3张图片

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

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

Android与PC端WIFI通信_第4张图片

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

Android与PC端WIFI通信_第5张图片

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


你可能感兴趣的:(Android,socket)