当前位置: 移动技术网 > IT编程>移动开发>Android > android使用Socket连接同一WiFi进行通信的实际操作讲解

android使用Socket连接同一WiFi进行通信的实际操作讲解

2018年09月12日  | 移动技术网IT编程  | 我要评论

湖南春晚 吴昕,温县感情交友网,美大集成环保灶爆炸

在同一局域网的情况下,两台设备想要进行通信,就需要用到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();
 }
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网