Android应用开发之Socket连接同一WiFi进行通信的实际操作讲解
白羽 2018-09-14 来源 :网络 阅读 1377 评论 0

摘要:本文将带你了解Android应用开发之Socket连接同一WiFi进行通信的实际操作讲解,希望本文对大家学Android有所帮助

        本文将带你了解Android应用开发之Socket连接同一WiFi进行通信的实际操作讲解,希望本文对大家学Android有所帮助


在同一局域网的情况下,两台设备想要进行通信,就需要用到Socket,原理就是一台设备作为服务端(主要为ServerSocket类),另一台作为客户端(Socket)。
这次目的是一台手机作为客户端,具有自动扫描二维码请将扫描结果传递给服务器,另一台手机作为服务器,接收数据经进行解析的功能。
一、服务器端代码
package comvoice.example.zhangbin.flysocketservice; import android.content.Context;import android.net.wifi.WifiInfo;import android.net.wifi.WifiManager;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.TextView; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket; public class MainActivity extends AppCompatActivity {  public static ServerSocket serverSocket = null; public static TextView tv_IP, tv_show; private String IP = ""; String buffer = ""; public static Handler mHandler = new Handler() {  @Override  public void handleMessage(android.os.Message msg) {if (msg.what==0x11) { Bundle bundle = msg.getData();// tv_show.setText("client:  "+bundle.getString("msg")+"\n"); initJX(bundle.getString("msg"));}  }; };  @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  initView();  receive();  }  private void initView() {  tv_show = (TextView) findViewById(R.id.tv_show);  tv_IP = (TextView) findViewById(R.id.tv_IP);  IP = getlocalip();  tv_IP.setText("IP addresss:"+IP); } private void receive(){  new Thread() {public void run() { Bundle bundle = new Bundle(); bundle.clear(); OutputStream output; String str = "hello hehe"; try {  serverSocket = new ServerSocket(30000);  while (true) {Message msg = new Message();msg.what = 0x11;try { Socket socket = serverSocket.accept(); output = socket.getOutputStream(); output.write(str.getBytes("utf-8")); output.flush(); socket.shutdownOutput(); BufferedReader bff = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = null; buffer = ""; while ((line = bff.readLine())!=null) {  buffer = line + buffer; } bundle.putString("msg", buffer.toString()); msg.setData(bundle); mHandler.sendMessage(msg); bff.close(); output.close(); socket.close();} catch (IOException e) { e.printStackTrace();}  } } catch (IOException e1) {  // TODO Auto-generated catch block  e1.printStackTrace(); }};  }.start(); }  //解析二维码信息 private static void initJX(String data){  String []an=data.split("\\+");  tv_show.setText(an[0]+"::"+an[1]+"::"+an[2]+"::"+an[3]); }  /**  * 或取本机的ip地址  */ private String getlocalip(){  WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);  WifiInfo wifiInfo = wifiManager.getConnectionInfo();  int ipAddress = wifiInfo.getIpAddress();  //  Log.d(Tag, "int ip "+ipAddress);  if(ipAddress==0)return null;  return ((ipAddress & 0xff)+"."+(ipAddress>>8 & 0xff)+"." +(ipAddress>>16 & 0xff)+"."+(ipAddress>>24 & 0xff)); } }
二、客户端代码
package comvoice.example.zhangbin.flysocketclient; import android.content.Intent;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView; import com.tbruyelle.rxpermissions.RxPermissions; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.InetSocketAddress;import java.net.Socket;import java.net.SocketTimeoutException; public class MainActivity extends AppCompatActivity implements View.OnClickListener{  Socket socket = null; String buffer = ""; TextView tv_show; Button bt_send,bt_scan; EditText et_input; String geted1; RxPermissions rxPermissions; public Handler myHandler = new Handler() {  @Override  public void handleMessage(Message msg) {if (msg.what == 0x11) { Bundle bundle = msg.getData(); tv_show.append("server:"+bundle.getString("msg")+"\n");
//每次客户端传输完数据后,再次调用扫描功能,实现连续扫描的功能(应该有更好的方法,暂时不知道) startActivityForResult(new Intent(MainActivity.this, ScanningActivity.class), 1);}  } };  @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  initView();  initClick(); }  private void initClick() {  bt_scan.setOnClickListener(this);  bt_send.setOnClickListener(this); }  @Override public void onClick(View view) {  switch (view.getId()){case R.id.bt_scan: startActivityForResult(new Intent(MainActivity.this, ScanningActivity.class), 1); break;case R.id.bt_send: geted1 = et_input.getText().toString(); tv_show.append("client:"+geted1+"\n"); //启动线程 向服务器发送和接收信息 new MyThread(geted1).start(); break; default:  break;  } } private void initView() {  tv_show = (TextView) findViewById(R.id.tv_show);  bt_send = (Button) findViewById(R.id.bt_send);  et_input = (EditText) findViewById(R.id.et_input);  bt_scan=findViewById(R.id.bt_scan); }  @Override public void onActivityResult(int requestCode, int resultCode, Intent data) {  super.onActivityResult(requestCode, resultCode, data);  if(resultCode==RESULT_OK){  if(requestCode==1){ new MyThread(data.getStringExtra("text")).start();}  } } class MyThread extends Thread {   public String txt1;   public MyThread(String str) {txt1 = str;  }   @Override  public void run() {//定义消息Message msg = new Message();msg.what = 0x11;Bundle bundle = new Bundle();bundle.clear();try { //连接服务器 并设置连接超时为1秒 socket = new Socket(); socket.connect(new InetSocketAddress("192.168.0.130", 30000), 1000); //端口号和IP更换为自己的,也可以手动输入 //获取输入输出流 OutputStream ou = socket.getOutputStream(); BufferedReader bff = new BufferedReader(new InputStreamReader(socket.getInputStream())); //读取发来服务器信息 String line = null; buffer=""; while ((line = bff.readLine()) != null) {  buffer = line + buffer; }  //向服务器发送信息 ou.write(txt1.getBytes("utf-8")); ou.flush(); bundle.putString("msg", buffer.toString()); msg.setData(bundle); //发送消息 修改UI线程中的组件 myHandler.sendMessage(msg); //关闭各种输入输出流 bff.close(); ou.close(); socket.close(); } catch (SocketTimeoutException aa) { //连接超时 在UI界面显示消息 bundle.putString("msg", "服务器连接失败!请检查网络是否打开"); msg.setData(bundle); //发送消息 修改UI线程中的组件 myHandler.sendMessage(msg);} catch (IOException e) { e.printStackTrace();}  } } }
package comvoice.example.zhangbin.flysocketclient; import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity; import com.google.zxing.Result; import me.dm7.barcodescanner.zxing.ZXingScannerView; public class ScanningActivity extends AppCompatActivity implements ZXingScannerView.ResultHandler{ private ZXingScannerView mZXingScannerView;  @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_scanning);  mZXingScannerView = new ZXingScannerView(this); // 将ZXingScannerView作为布局  setContentView(mZXingScannerView); } @Override protected void onResume() {  super.onResume();  mZXingScannerView.setResultHandler(this); // 设置处理结果回调   mZXingScannerView.startCamera(); // 打开摄像头  }  @Override protected void onPause() {  super.onPause();  mZXingScannerView.stopCamera(); // 活动失去焦点的时候关闭摄像头 }  @Override public void handleResult(Result result) { // 实现回调接口,将数据回传并结束活动  Intent data = new Intent();  data.putExtra("text", result.getText());  setResult(RESULT_OK, data);  finish(); }}    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 1
看完这篇文章有何感觉?已经有1人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved