關於android 4.0以上Socket通訊解決方案

1  通訊IP地址java

   注意:IP不能爲虛擬的IPandroid

選取無線網適配器下的IP服務器

數據接收socket

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,"未創建鏈接");
            }
        }
    }
}
相關文章
相關標籤/搜索