关于android 4.0以上Socket通信解决方案

1  通信IP地址

   注意:IP不能为虚拟的IP

110927_nvDR_3768017.png

选取无线网适配器下的IP

数据接收

package com.example.administrator.self_soket.soket;

import android.os.Handler;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

/**
 * Created by Administrator on 2018/3/28 0028.
 */

public class Socketchat extends Thread {
    private static  final  String TAG=Socketchat.class.getSimpleName();
   //与UI交互
    private Handler hClient;
    //中文字节
    public String    ZH_CN="UTF-8";
    //链接对象
    private Socket  socket;
    //是否运行
    private boolean IsRun;
    //输入流操作
    private InputStream input;
    //输出流操作用于发送消息
    public OutputStream ouput;
    //获取IP 和端口
    private String IpAddress;
    //端口和IP
    private int Port;
    //状态常量
    public static int STATE_READ=7;
    public static int STATE_WRITE=8;
    public static int STATE_ERROR=9;
    public static int STATE_IOFO=10;
    public Socketchat(Handler hClientui)
    {
        this.hClient=hClientui;
    }
    public void  setIneAddress(String inetAddress)
    {
        this.IpAddress=inetAddress;
        this.IsRun=true;

    }
   //设置端口
    public void  setPort(int port)
    {
        this.Port=port;
    }
    @Override
    public void run() {
        if(socket==null&&IpAddress!=null&& Port>0)
        {
            try {
                Log.i(TAG,"运行线程-----开始链接");
                socket=new Socket(IpAddress,Port);
                if(socket!=null)
                    Log.d("Socket","已连接到服务器");
                //启动接收线程
                input=socket.getInputStream();
                ouput=socket.getOutputStream();
                new Receive_Thead(socket).start();
                //获取本地IP Port
                getAdress();
            }
            catch (IOException io)
            {

            }
        }
    }
    //获取IP 和 Port
    public  void  getAdress()
    {
      String []strings=new String[2];
      strings[0]=socket.getInetAddress().getHostAddress();
      strings[1]=socket.getInetAddress().getHostName();
    }
    //接收消息线程
    public class Receive_Thead extends  Thread{
        //监听对象
        private Socket tsocket;
        public  Receive_Thead(Socket msoket)
        {
            this.tsocket=msoket;
        }
        //在run方法中监听消息
        @Override
        public void run() {
           try
           {
               while (IsRun)
               {
                    input=tsocket.getInputStream();
                     //输出流是否可用
                     while (input.available()==0);
                     //等待两秒
                     Thread.sleep(2000);
                   final byte [] data=new byte[2048];
                    final int len=input.read(data);
                     Log.i("ReadData","数据读取完毕");
                   hClient.sendMessage(hClient.obtainMessage(STATE_READ,len,-1,data));
               }

           }
           catch (Exception e)
           {
               //输出错误信息
               Log.i(TAG,e.getMessage());
               SenderError();
           }
           finally {
               //将soket IO流关闭
               try {

                   if (tsocket != null) {
                       tsocket.close();
                   }
                   if(ouput!=null)
                   {
                       ouput.close();
                   }
                   if(input!=null)
                   {
                       input.close();
                   }
                   Log.i(TAG,"关闭链接释放资源");
               }
               catch (Exception e)
               {
                   e.printStackTrace();
               }
           }
        }
    }
    //发送错误消息
    public  void  SenderError()
    {
        hClient.sendMessage(hClient.obtainMessage(STATE_ERROR));
    }
    //发送消息
    public void SenderMessage(byte[] msg)
    {
        try {
               if(ouput!=null) {
                   ouput.write(msg);
                   ouput.flush();
                   hClient.sendMessage(hClient.obtainMessage(STATE_WRITE, -1, -1, msg));
                   Log.i(TAG + "SenderMessage", "发送数据成功" + msg.toString());
               }
             }
        catch (Exception e)
        {
            SenderError();
            Log.i("SenderMessage","发送数据错误"+e.getMessage());
        }
    }
    public  void  Close()
    {
        if(socket!=null)
        {
            try {
                socket.close();
                socket=null;
                IsRun=false;
                this.stop();
            }
            catch (Exception e)
            {
                Log.i(TAG,"未建立连接");
            }
        }
    }
}

 

转载于:https://my.oschina.net/u/3768017/blog/1786684

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值