一、摘要
通过笔记本WIFI热点虚拟网络供android手机端使用,笔记本作为通信的服务器端,android手机作为客户端,通过socket进行通信。
二、准备工作
1. 在eclipse下写好服务器端处理代码,包括侦听的端口号,客户端IP地址获取,发送的数据处理
2. 搭建好android开发环境,直接以手机为终端,apk直接会安装到手机上,方便测试。
3. 下载一个WIFI共享软件,这里使用"猎豹2.0",它可以在无网络连接的情况下,构建一个以PC为路由器的局域网
三、原理图
四、详细代码
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端布局如下
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);
- }
- }
- }
五、运行
1. 开启服务器端,服务端开始监听9400端口
2将android工程运行到手机上,通过豌豆荚可以将手机画面截取下来
3.当触发“连接”按钮时,可以看到服务器端
同时,手机端可以填写你要发送的内容了,改程序对乱码问题也进行了很好的处理,首先要知道你的工程的编码,发送数据时就指定该该种编码规则,就不会出现乱码了。
单击发送按钮,服务器端接收情况如下:
这里,就基本完成了Android手机与PC端的socket通信,当然还可以增加,手机端接收是否发送成功之类的反馈信息,那样就更加完整了。