安卓Android Sock通讯示例

淘宝:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4023-22669139448.34.60cc6baa7ht7O2&id=22173428704icon-default.png?t=M276https://item.taobao.com/item.htm?spm=a1z10.1-c.w4023-22669139448.34.60cc6baa7ht7O2&id=22173428704

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="409dp"
        android:layout_height="729dp"
        tools:layout_editor_absoluteX="1dp"
        tools:layout_editor_absoluteY="1dp">

        <Button
            android:id="@+id/button"
            android:layout_width="160dp"
            android:layout_height="40dp"
            android:layout_marginStart="1dp"
            android:layout_marginLeft="1dp"
            android:onClick="SearchDiv"
            android:text="搜索设备并监听端口"
            android:textSize="12sp"
            app:layout_constraintEnd_toStartOf="@+id/textView"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/textView"
            android:layout_width="262dp"
            android:layout_height="22dp"
            android:layout_marginStart="10dp"
            android:layout_marginLeft="10dp"
            android:layout_marginEnd="1dp"
            android:layout_marginRight="1dp"
            android:text="本设备IP:"
            android:textSize="12sp"
            app:layout_constraintBottom_toBottomOf="@+id/button"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/button" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="0dp"
            android:layout_height="400dp"
            android:layout_marginStart="1dp"
            android:layout_marginLeft="1dp"
            android:layout_marginTop="10dp"
            android:layout_marginEnd="1dp"
            android:layout_marginRight="1dp"
            android:textSize="12sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/button" />

        <Button
            android:id="@+id/button2"
            android:layout_width="100dp"
            android:layout_height="40dp"
            android:layout_marginStart="1dp"
            android:layout_marginLeft="1dp"
            android:layout_marginTop="10dp"
            android:layout_marginEnd="245dp"
            android:layout_marginRight="245dp"
            android:onClick="onclickclea"
            android:text="清空报文"
            android:textSize="12sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.031"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView2" />

        <Button
            android:id="@+id/button3"
            android:layout_width="120dp"
            android:layout_height="40dp"
            android:onClick="SendOrder"
            android:text="向指定IP发送"
            android:textSize="12sp"
            app:layout_constraintBottom_toBottomOf="@+id/button2"
            app:layout_constraintStart_toEndOf="@+id/button2" />

        <TextView
            android:id="@+id/textView3"
            android:layout_width="20dp"
            android:layout_height="25dp"
            android:layout_marginStart="2dp"
            android:layout_marginLeft="2dp"
            android:text="IP:"
            app:layout_constraintBottom_toBottomOf="@+id/button3"
            app:layout_constraintStart_toEndOf="@+id/button3" />

        <EditText
            android:id="@+id/editT"
            android:layout_width="160dp"
            android:layout_height="40dp"
            android:ems="10"
            android:inputType="textPersonName"
            android:text="255.255.255.255"
            android:textSize="14sp"
            app:layout_constraintBottom_toBottomOf="@+id/textView3"
            app:layout_constraintStart_toEndOf="@+id/textView3" />

        <EditText
            android:id="@+id/editT2"
            android:layout_width="402dp"
            android:layout_height="91dp"
            android:layout_marginStart="1dp"
            android:layout_marginLeft="1dp"
            android:layout_marginTop="16dp"
            android:layout_marginEnd="1dp"
            android:layout_marginRight="1dp"
            android:ems="10"
            android:gravity="start|top"
            android:inputType="textMultiLine"
            android:maxLines="6"
            android:minLines="3"
            android:text="5A 00 00 01 05 BB B6 D3 AD C4 FA CA B9 D3 C3 CE D2 C3 C7 B5 C4 CD F8 C2 E7 B6 C1 BF A8 C6 F7 A3 A1 D0 BB D0 BB 20 20"
            android:textSize="12sp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/button2" />

        <RadioGroup
            android:id="@+id/groupradiobut"
            android:layout_width="402dp"
            android:layout_height="103dp"
            app:layout_constraintTop_toBottomOf="@+id/editT2"
            tools:layout_editor_absoluteX="4dp">

            <RadioButton
                android:id="@+id/radioButton1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="接收到刷卡信息后回复显示+蜂鸣响声"
                android:textSize="12sp" />

            <RadioButton
                android:id="@+id/radioButton2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="接收到刷卡信息后回复显示+蜂鸣响声+固定组合语音"
                android:textSize="12sp" />

            <RadioButton
                android:id="@+id/radioButton3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="接收到刷卡信息后回复显示+蜂鸣响声+TTS语音"
                android:textSize="12sp" />
        </RadioGroup>

    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>



package com.example.udpcardreaderandroid;

import androidx.appcompat.app.AppCompatActivity;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import java.net.*;
import java.util.*;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


public class MainActivity extends AppCompatActivity {
    private String Myip;
    private TextView tv;
    public TextView Recv;
    private EditText RemotIpV;
    private EditText InputstrV;
    private RadioGroup MyradioGroup;
    private RadioButton MyradioB1;
    private RadioButton MyradioB2;
    private RadioButton MyradioB3;

    private static int BROADCAST_PORT = 39169;
    public DatagramSocket Recsock ;
    public boolean RecsockIsRuning;
    public  Handler MyHandler;
    public  Handler MyHandler2;

    public byte LastBuf[]=new byte [1024];
    public byte readcardbuf[];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  //禁止屏幕旋转,强制竖屏运行

        tv = findViewById(R.id.textView);
        Recv= findViewById(R.id.textView2);
        Recv.setTextIsSelectable(true);
        RemotIpV=findViewById(R.id.editT) ;
        InputstrV=findViewById(R.id.editT2) ;
        MyradioGroup=findViewById(R.id.groupradiobut) ;
        MyradioB1=findViewById(R.id.radioButton1) ;
        MyradioB2=findViewById(R.id.radioButton2) ;
        MyradioB3=findViewById(R.id.radioButton3) ;

        Myip = getIP();
        tv.append(Myip+":"+Integer.toString(BROADCAST_PORT));

        if(!RecsockIsRuning){ InitRecSock(); } //初始化Sock,开启接收线程

        MyHandler = new Handler()
        {
            @Override
            public void handleMessage(Message msg) {    //线程内更新显示
                String text = (String) msg.obj;
                Recv.append(text);
            }
        };

        MyHandler2 = new Handler()
        {
            @Override
            public void handleMessage(Message msg)
            {    //线程内更新显示
                String text = (String) msg.obj;
                InputstrV.setText(text);
            }
        };
    }

    public void InitRecSock(){
        try{
            if (RecsockIsRuning){Recsock.close(); }
            Recsock = new DatagramSocket(BROADCAST_PORT);
            new udpReceiveAndSend().start();
            RecsockIsRuning=true;
        } catch  (Exception e){
            Recv.append("Port err!\n\n");
            RecsockIsRuning=false;
        }
    }

    public void updatetrack(String s)  //线程内更新显示
    {
           if (Recv.getLineCount() > 20) {
               Recv.setText("");
           }
           Message msg = new Message();
           String textTochange = s;
           msg.obj = textTochange;
           MyHandler.sendMessage(msg);
    }

    public void updatetrack2(String s)  //线程内更新显示
    {
        Message msg = new Message();
        String textTochange = s;
        msg.obj = textTochange;
        MyHandler2.sendMessage(msg);
    }

    public void SearchDiv(View vies){
        new SearchDivThread().start();
    }

    private class SearchDivThread extends  Thread {   //搜索在线设备线程
        @Override
        public void run() {
            String SendInfStr="a6";
            byte[] SendBuf = new byte[1];                              /** 提供发送数据,封装打包 a6 为搜索在线设备的指令 */
            SendBuf[0]=(byte)0xa6;
            try{
                if (!RecsockIsRuning){InitRecSock();}
                DatagramPacket dp1=new DatagramPacket(SendBuf,SendBuf.length,InetAddress.getByName("255.255.255.255"),BROADCAST_PORT);
                Recsock.send(dp1);
                updatetrack("SendTo:255.255.255.255 Data:a6\n\n");
            }catch  (Exception e){
                updatetrack("搜索设备出错:\n");
                updatetrack(e.getMessage()+"\n\n");
                RecsockIsRuning=false;
                Recsock.close();
                InitRecSock();
            }
        }
    }

    private class udpReceiveAndSend extends  Thread {  //Udp端口接收线程
        @Override
        public void run() {
            while (RecsockIsRuning) {
                try {
                    int p = 0;
                    int j = 0;
                    int m = 0;
                    String ReceiveDataStr = "";
                    String bytestr = "";
                    String CardNo16 = "";
                    String SerialNum = "";
                    String CardInfStr = "";
                    String CardNoStr= "";
                    long cardno10=0;
                    long cardnum=0;
                    int length=0;
                    String RemoteHostIP;
                    int RemotePort;
                    byte[] data = new byte[1024];

                    DatagramPacket rdp = new DatagramPacket(data, data.length);   /**预先创建接收数据存放的位置,封装*/
                    Recsock.receive(rdp);                                         /**使用receive阻塞式接收*/
                    RemoteHostIP = rdp.getAddress().getHostAddress();             /*数据来源IP */
                    RemotePort = rdp.getPort();                                   /*数据来源端口*/
                    length = rdp.getLength();
                    data = rdp.getData();

                    for (p = 0; p < length; p++) {
                            bytestr = "00" + Integer.toHexString(data[p] & 0xff);
                            ReceiveDataStr = ReceiveDataStr + bytestr.substring(bytestr.length() - 2, bytestr.length()) + " ";
                    }
                    updatetrack("FromIP:" + rdp.getAddress().getHostAddress() + " Data:" + ReceiveDataStr + "\n");

                    if (length >= 8 && length<200) {                                             //判断是否是重复上传的数据包
                        if (data[0] == LastBuf[0] && data[1] == LastBuf[1] && data[2] == LastBuf[2] && data[3] == LastBuf[3] && data[4] == LastBuf[4] && data[5] == LastBuf[5] && data[6] == LastBuf[6] && data[7] == LastBuf[7] && data[8] == LastBuf[8]) {
                            DisableSendAge(data,RemoteHostIP,RemotePort);                        //向读卡器发确认信息,否则读卡器会连续发三次
                            updatetrack("\n\n");                                              // 重复的上传的数据不分析处理,直接丢弃
                        } else {
                            for (p = 0; p < 9; p++) {
                                LastBuf[p] = data[p];                                            /*将当前接收到的数据保存,用于再次接收到数据时比对*/
                            }

                            switch (data[0]) {
                                case (byte) 0xf2:
                                    updatetrack("在线读卡器响应搜索指令\n");
                                    updatetrack("指令码      :"+Integer.toHexString(data[0] & 0xff)+ "\n");
                                    updatetrack("设备IP      :"+Integer.toString(data[1] & 0xff)+"."+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+ "\n");
                                    updatetrack("掩  码      :"+Integer.toString(data[5] & 0xff)+"."+Integer.toString(data[6] & 0xff)+"."+Integer.toString(data[7] & 0xff)+"."+Integer.toString(data[8] & 0xff)+ "\n");
                                    updatetrack("端口号      :"+Integer.toString((data[9] & 0xff)+((data[10] & 0xff) *256))+ "\n");
                                    updatetrack("机  号      :"+Integer.toString((data[11] & 0xff)+((data[12] & 0xff) *256))+ "\n");
                                    updatetrack("网  关      :"+Integer.toString(data[13] & 0xff)+"."+Integer.toString(data[14] & 0xff)+"."+Integer.toString(data[15] & 0xff)+"."+Integer.toString(data[16] & 0xff)+ "\n");
                                    for(p=17;p<23;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        SerialNum=SerialNum+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                        if(p<22){SerialNum=SerialNum+"-";}
                                    }
                                    updatetrack("网关MAC     :"+SerialNum+ "\n");
                                    String ServerIp=Integer.toString(data[23] & 0xff)+"."+Integer.toString(data[24] & 0xff)+"."+Integer.toString(data[25] & 0xff)+"."+Integer.toString(data[26] & 0xff);
                                    updatetrack("远程服务器IP:"+ServerIp+ "\n");
                                    SerialNum="";
                                    for(p=27;p<33;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        SerialNum=SerialNum+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                        if(p<32){SerialNum=SerialNum+"-";}
                                    }
                                    updatetrack("服务器MAC   :"+SerialNum+ "\n");
                                    updatetrack("网络标识    :"+Integer.toHexString(data[33] & 0xff)+ "\n");
                                    updatetrack("响声标识    :"+Integer.toHexString(data[34] & 0xff)+ "\n");
                                    SerialNum="";
                                    String DeviceMAC="16-88-";
                                    for(p=35;p<39;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        DeviceMAC=DeviceMAC+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                        SerialNum=SerialNum +Integer.toString(data[p] & 0xff);
                                        if(p<38){
                                            SerialNum=SerialNum+"-";
                                            DeviceMAC=DeviceMAC+"-";
                                        }
                                    }
                                    updatetrack("通讯模块序号:"+SerialNum+ "\n");
                                    updatetrack("设备MAC地址 :"+DeviceMAC+ "\n");

                                    if(length>39){
                                        SerialNum="";
                                        for(p=39;p<length;p++){
                                            bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                            SerialNum=SerialNum+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                        }
                                        updatetrack("设备唯一序号:"+SerialNum+ "\n");
                                    }
                                    if(ServerIp.compareTo("255.255.255.255")!=0 && ServerIp.compareTo(Myip)!=0 ){
                                        updatetrack("读卡器的远程服务器IP未指向本设备,需将读卡器的远程服务器IP设为:"+Myip+"\n");
                                        //SetNetworkPara(data,length,RemoteHostIP,RemotePort);                                      //如果需要修改读卡器的IP 掩码 网关 远程服务器IP 通讯端口,取消注释,按网络环境设定正确的值
                                    }
                                    SetNetworkPara(data); //解析并生成修改本设备网络参数的指令码,可拷贝生成的指令码并广播发送修改
                                    updatetrack("\n");
                                    break;
                                case (byte)0xf3:
                                    updatetrack("接收到的信息为心跳数据包\n");
                                    updatetrack("指令码:"+Integer.toHexString(data[0] & 0xff)+ "\n");
                                    updatetrack("设备IP:"+Integer.toString(data[1] & 0xff)+"."+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+ "\n");
                                    updatetrack("机器号:"+Integer.toString((data[5] & 0xff)+((data[6] & 0xff) *256))+ "\n");
                                    updatetrack("包序号:"+Integer.toString((data[7] & 0xff)+((data[8] & 0xff) *256))+ "\n");
                                    updatetrack("心跳码:"+Integer.toHexString(data[9] & 0xff)+ "\n");
                                    updatetrack("长  度:"+Integer.toHexString(data[10] & 0xff)+ "\n");
                                    updatetrack("继电器:"+Integer.toHexString(data[11] & 0xff)+ "\n");
                                    updatetrack("按键值:"+Integer.toHexString(data[12] & 0xff)+ "\n");
                                    for(p=13;p<17;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        SerialNum=SerialNum+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("随机码:"+SerialNum+ "\n");
                                    SerialNum="";
                                    for(p=17;p<length;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        SerialNum=SerialNum+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("设备序列号:"+SerialNum+"\n\n");
                                    break;
                                case (byte)0xf8:
                                    break;
                                case (byte)0xc1:         /*接收到的信息为IC只读上传的IC卡号*/
                                    updatetrack("接收到的信息为IC只读上传的IC卡号\n");
                                    updatetrack("指令码:"+Integer.toHexString(data[0] & 0xff)+ "\n");
                                    updatetrack("设备IP:"+Integer.toString(data[1] & 0xff)+"."+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+ "\n");
                                    updatetrack("机器号:"+Integer.toString((data[5] & 0xff)+((data[6] & 0xff) *256))+ "\n");
                                    updatetrack("包序号:"+Integer.toString((data[7] & 0xff)+((data[8] & 0xff) *256))+ "\n");
                                    for(p=10;p<14;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        CardNo16=CardNo16+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("16进制卡号:"+CardNo16+ "\n");

                                    cardnum=data[10] & 0xff;
                                    cardnum=cardnum+(data[11] & 0xff) *256;
                                    cardnum=cardnum+(data[12] & 0xff) *65536;
                                    cardnum=cardnum+(data[13] & 0xff) *16777216;
                                    cardno10 = 0;
                                    for (j=28; j>=0; j-=4) {
                                        cardno10 = cardno10<<4 | (cardnum>>>j & 0xF);
                                    }
                                    CardNoStr = String.format("%010d", cardno10);
                                    updatetrack("10进制卡号:"+CardNoStr+ "\n");

                                    for(p=14;p<length;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        SerialNum=SerialNum+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("设备序列号:"+SerialNum+"\n\n");

                                    DisableSendAge(data,RemoteHostIP,RemotePort);                        //向读卡器发确认信息,否则读卡器会连续发三次
                                    if(MyradioB1.isChecked()) {
                                        SendDispBeep(CardNoStr, RemoteHostIP, RemotePort);               //发送显示 + 蜂鸣声
                                    }else {
                                        if(MyradioB2.isChecked()){
                                            SendDispSpk(CardNoStr, RemoteHostIP, RemotePort);            //发送显示 + 固定组合语音
                                        }else{
                                            SendDispTTS(CardNoStr, RemoteHostIP, RemotePort);            //发送显示 + TTS语音
                                        }
                                    }

                                    //Thread.sleep(10);
                                    //ReadCardInf(data,length,RemoteHostIP,RemotePort);                  //如果是网络读写器,可用此方法读取指定扇区内数据
                                    break;
                                case (byte)0xc3:         /*全扇区读写器收到读卡扇区内的数据*/
                                    j=data[10] *48;
                                    m=data[11] *48;

                                    for(p=0;p<m;p++){
                                        readcardbuf[j+p]=data[16+p];
                                    }
                                    if(data[11]+data[10]>=data[9]){        /*已完全收到所有包数据,一个数据包最多传4个扇区的数据,如果读写器设备读写扇区数大于4,数据要分2个包上传,扇区数大于8要分3个包,大与12要分4个包上传*/
                                        updatetrack("接收到的信息为IC卡扇区内数据\n");
                                        updatetrack("指令码:"+Integer.toHexString(data[0] & 0xff)+ "\n");
                                        updatetrack("设备IP:"+Integer.toString(data[1] & 0xff)+"."+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+ "\n");
                                        updatetrack("机器号:"+Integer.toString((data[5] & 0xff)+((data[6] & 0xff) *256))+ "\n");
                                        updatetrack("包序号:"+Integer.toString((data[7] & 0xff)+((data[8] & 0xff) *256))+ "\n");
                                        for(p=12;p<16;p++){
                                            bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                            CardNo16=CardNo16+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                        }
                                        updatetrack("16进制卡号:"+CardNo16+ "\n");

                                        m=data[9] *48;
                                        CardInfStr="";
                                        for(p=0;p<m;p++){
                                            bytestr="00"+Integer.toHexString(readcardbuf[p] & 0xff);
                                            CardInfStr=CardInfStr+ bytestr.substring(bytestr.length() -2,bytestr.length())+" ";
                                        }
                                        updatetrack("卡片内数据:"+CardInfStr+ "\n");
                                    }
                                    updatetrack("\n");
                                    break;
                                case (byte)0xc5:          /*指定区号、密码读卡返回信息*/
                                    updatetrack("接收到的信息为IC卡扇区内数据\n");
                                    updatetrack("指令码:"+Integer.toHexString(data[0] & 0xff)+ "\n");
                                    updatetrack("设备IP:"+Integer.toString(data[1] & 0xff)+"."+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+ "\n");
                                    updatetrack("机器号:"+Integer.toString((data[5] & 0xff)+((data[6] & 0xff) *256))+ "\n");
                                    for(p=8;p<12;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        CardNo16=CardNo16+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("16进制卡号:"+CardNo16+ "\n");
                                    updatetrack("扇区数:"+Integer.toHexString(data[7] & 0xff)+ "\n");
                                    updatetrack("扇区号:"+Integer.toHexString(data[12] & 0xff)+ "\n");
                                    if(data[13]==0){
                                        CardInfStr="";
                                        for(p=0;p<48;p++){
                                            bytestr="00"+Integer.toHexString(data[14+p] & 0xff);
                                            CardInfStr=CardInfStr+ bytestr.substring(bytestr.length() -2,bytestr.length())+" ";
                                        }
                                        updatetrack("扇区内数据:"+CardInfStr+ "\n\n");
                                        //WriteCard(data,length,RemoteHostIP,RemotePort);   //写卡操作
                                    } else{
                                        if(data[13]==12){
                                            updatetrack("卡密码认证失败!\n\n");
                                        }else {
                                            updatetrack("读卡失败,错误代码:"+Integer.toString(data[13])+"\n\n");
                                        }
                                    }
                                    break;

                                case (byte)0xcD :         /*响应写卡、更改卡密码*/
                                    updatetrack("设备IP:"+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+"."+Integer.toString(data[5] & 0xff)+ "\n");
                                    updatetrack("机器号:"+Integer.toString((data[6] & 0xff)+((data[7] & 0xff) *256))+ "\n");
                                    for(p=9;p<13;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        CardNo16=CardNo16+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("16进制卡号:"+CardNo16+ "\n");
                                    updatetrack("扇区号:"+Integer.toHexString(data[13] & 0xff)+ "\n");
                                    if(data[1]==0x3A){
                                        if(data[14]==0x00){
                                            updatetrack("更改卡密码成功\n");
                                        }else{
                                            updatetrack("更改卡密码失败,错误代码:"+Integer.toString(data[14])+ "\n");
                                        }
                                    }else{
                                        if(data[1]==0x3D){
                                            if(data[14]==0x00){
                                                updatetrack("写卡成功\n");
                                            }else{
                                                updatetrack("写卡失败,错误代码:"+Integer.toString(data[14])+ "\n");
                                            }
                                        }
                                    }
                                    updatetrack("\n");
                                    break;
                                case (byte)0xcf :         /*接收到IC卡离开读卡器的信息*/
                                case (byte)0xdf :         /*接收到ID卡离开读卡器的信息*/
                                    updatetrack("接收到卡离开读卡器的信息\n");
                                    updatetrack("指令码:"+Integer.toHexString(data[0] & 0xff)+ "\n");
                                    updatetrack("设备IP:"+Integer.toString(data[1] & 0xff)+"."+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+ "\n");
                                    updatetrack("机器号:"+Integer.toString((data[5] & 0xff)+((data[6] & 0xff) *256))+ "\n");
                                    updatetrack("包序号:"+Integer.toString((data[7] & 0xff)+((data[8] & 0xff) *256))+ "\n");
                                    if(data[0]==(byte)0xcf){
                                        for(p=11;p<15;p++){
                                            bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                            CardNo16=CardNo16+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                        }
                                    }else{
                                        for(p=10;p<15;p++){
                                            bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                            CardNo16=CardNo16+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                        }
                                    }
                                    updatetrack("16进制卡号:"+CardNo16+"\n\n");

                                    DisableSendAge(data,RemoteHostIP,RemotePort);         //向读卡器发确认信息,否则读卡器会连续发三次
                                    break;
                                case (byte)0xd1:         /*接收到的信息为ID读卡器上传的卡号*/
                                    updatetrack("接收到的信息为ID读卡器上传的卡号\n");
                                    updatetrack("指令码:"+Integer.toHexString(data[0] & 0xff)+ "\n");
                                    updatetrack("设备IP:"+Integer.toString(data[1] & 0xff)+"."+Integer.toString(data[2] & 0xff)+"."+Integer.toString(data[3] & 0xff)+"."+Integer.toString(data[4] & 0xff)+ "\n");
                                    updatetrack("机器号:"+Integer.toString((data[5] & 0xff)+((data[6] & 0xff) *256))+ "\n");
                                    updatetrack("包序号:"+Integer.toString((data[7] & 0xff)+((data[8] & 0xff) *256))+ "\n");
                                    for(p=9;p<13;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        CardNo16=CardNo16+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("16进制卡号:"+CardNo16+ "\n");

                                    cardnum=data[9] & 0xff;
                                    cardnum=cardnum+(data[10] & 0xff) *256;
                                    cardnum=cardnum+(data[11] & 0xff) *65536;
                                    cardnum=cardnum+(data[12] & 0xff) *16777216;
                                    cardno10 = 0;
                                    for (j=28; j>=0; j-=4) {
                                        cardno10 = cardno10<<4 | (cardnum>>>j & 0xF);
                                    }
                                    CardNoStr = String.format("%010d", cardno10);
                                    updatetrack("10进制卡号:"+CardNoStr+ "\n");

                                    for(p=14;p<length;p++){
                                        bytestr="00"+Integer.toHexString(data[p] & 0xff);
                                        SerialNum=SerialNum+ bytestr.substring(bytestr.length() -2,bytestr.length());
                                    }
                                    updatetrack("设备序列号:"+SerialNum+ "\n");

                                    updatetrack("\n\n");
                                    DisableSendAge(data,RemoteHostIP,RemotePort);             //向读卡器发确认信息,否则读卡器会连续发三次
                                    if(MyradioB1.isChecked()) {
                                        SendDispBeep(CardNoStr, RemoteHostIP, RemotePort);               //发送显示 + 蜂鸣声
                                    }else {
                                        if(MyradioB2.isChecked()){
                                            SendDispSpk(CardNoStr, RemoteHostIP, RemotePort);            //发送显示 + 固定组合语音
                                        }else{
                                            SendDispTTS(CardNoStr, RemoteHostIP, RemotePort);            //发送显示 + TTS语音
                                        }
                                    }
                                    break;
                                default:
                            }
                        }
                    }else{ updatetrack("\n");}

                }catch  (Exception e){
                    RecsockIsRuning=false;
                    updatetrack("监听线程出错:\n");
                    updatetrack(e.getMessage()+"\n\n");
                    Recsock.close();
                    InitRecSock();
                }
            }
        }
    }

    /**
    private class DisableSendAgeThread extends  Thread {   //确定接收到刷卡信息线程
        @Override
        public void run() {
            byte[] SendBuf1 = new byte [9];
            SendBuf1[0]=(byte)0x69;
            String SendInfStr="69 ";
            for(int p=1;p<9;p++){
                SendBuf1[p]=GetBuf[p];
                String bytestr="00"+Integer.toHexString(GetBuf[p] & 0xff);
                SendInfStr=SendInfStr+ bytestr.substring(bytestr.length() -2,bytestr.length())+" ";
            }
            try {
                DatagramSocket s1 = new DatagramSocket();
                DatagramPacket dp1 = new DatagramPacket(SendBuf1, SendBuf1.length, InetAddress.getByName(RemoteHostIP), RemotePort);
                s1.send(dp1);
                s1.close();
                updatetrack("SendTo:"+RemoteHostIP+" Data:"+SendInfStr+"\n\n");
            }catch  (Exception e){
                updatetrack(e.getMessage()+"\n\n");
            }
        }
    }

    private class SendDispBeepThread extends  Thread { //回复文字显示+蜂鸣响声线程
        @Override
        public void run() {
            try {
                String DispStr="卡号:"+CardNoStr+"  "+GetSysDT().substring(2,19)+"        "; //将显示的文字生成字节数组
                byte[] DispBuf= DispStr.getBytes("gb2312");
                byte[] SendBuf1 = new byte [39];                 // 将要发送的数据打包
                SendBuf1[0]=(byte)0x5a;                          //指令码
                SendBuf1[1]=(byte)0x00;                          //机号低
                SendBuf1[2]=(byte)0x00;                          //机号高
                SendBuf1[3]=(byte)0x02;                          //蜂鸣声代码
                SendBuf1[4]=(byte)0x14;                          //显示时长
                for(int i=0;i<34;i++){                           //显示文字
                    SendBuf1[i+5]=DispBuf[i];
                }
                String SendInfStr="";
                for(int p=0;p<39;p++){
                    String bytestr="00"+Integer.toHexString(SendBuf1[p] & 0xff);
                    SendInfStr=SendInfStr+ bytestr.substring(bytestr.length() -2,bytestr.length())+" ";
                }
                DatagramSocket s1 = new DatagramSocket();
                DatagramPacket dp1 = new DatagramPacket(SendBuf1, SendBuf1.length, InetAddress.getByName(RemoteHostIP), RemotePort);
                s1.send(dp1);
                s1.close();
                updatetrack("SendTo:"+RemoteHostIP+" Data:"+SendInfStr+"\n\n");
            }catch  (Exception e){
                updatetrack(e.getMessage()+"\n\n");
            }
        }
    }**/

    public void SetNetworkPara(byte[] indata){ //根据设备上传的信息生成修改网络参数指令
        try {
            byte[] SendBuf1 = new byte [42];
            SendBuf1[0]=(byte)0xF9;
            SendBuf1[1]=indata[1];    //读卡器ip,如需修改设正确值
            SendBuf1[2]=indata[2];
            SendBuf1[3]=indata[3];
            SendBuf1[4]=indata[4];

            SendBuf1[5]=indata[5];     //读卡器子网掩码,如需修改设正确值
            SendBuf1[6]=indata[6];
            SendBuf1[7]=indata[7];
            SendBuf1[8]=indata[8];

            SendBuf1[9]=(byte)0xff;   //indata[23];     //读卡器远程服务器IP,,255.255.255.255表示广播方式,如需修改设正确值
            SendBuf1[10]=(byte)0xff;  //indata[24];
            SendBuf1[11]=(byte)0xff;  //indata[25];
            SendBuf1[12]=(byte)0xff;  //indata[26];

            SendBuf1[13]=indata[27];  //读卡器远程服务器IP MAC,取值FF-FF-FF-FF-FF-FF 表示自动搜索MAC
            SendBuf1[14]=indata[28];
            SendBuf1[15]=indata[29];
            SendBuf1[16]=indata[30];
            SendBuf1[17]=indata[31];
            SendBuf1[18]=indata[32];

            SendBuf1[19]=indata[13];  //读卡器网关IP,如需修改设正确值
            SendBuf1[20]=indata[14];
            SendBuf1[21]=indata[15];
            SendBuf1[22]=indata[16];

            SendBuf1[23]=indata[17];   //读卡器网关MAC,取值FF-FF-FF-FF-FF-FF 表示自动搜索MAC
            SendBuf1[24]=indata[18];
            SendBuf1[25]=indata[19];
            SendBuf1[26]=indata[20];
            SendBuf1[27]=indata[21];
            SendBuf1[28]=indata[22];

            SendBuf1[29]=indata[11];  //机号,如需修改设正确值
            SendBuf1[30]=indata[12];

            SendBuf1[31]=indata[9];   //通讯端口,如需修改设正确值
            SendBuf1[32]=indata[10];

            SendBuf1[33]=indata[35];  //机器序列号,每台机唯一,不可更改
            SendBuf1[34]=indata[36];
            SendBuf1[35]=indata[37];
            SendBuf1[36]=indata[38];

            byte Funcode;
            Funcode=1;                    //0    刷卡时不发声        1   刷卡时发声
            Funcode=(byte)(Funcode+2);    //+2  远程电脑MAC自动搜索  +4   网关MAC自动搜索
            Funcode=(byte)(Funcode+8);    //+8  DHCP自动获得IP地址  +0   指定IP
            Funcode=(byte)(Funcode+0);    //+16 卡离开感应区发信息   +0   卡离开感应区不发信息
            Funcode=(byte)(Funcode+32*0); //卡在感应区是否重发信息    *0不重发  *1隔1秒重发  *2隔2秒重发  *3隔5秒重发  *4隔10秒重发

            SendBuf1[37]=Funcode;

            SendBuf1[38]=(byte)0x55;  //4字节固定后缀
            SendBuf1[39]=(byte)0xaa;
            SendBuf1[40]=(byte)0x66;
            SendBuf1[41]=(byte)0x99;

            String SendInfStr="";
            for(int p=0;p<42;p++){
                String bytestr="00"+Integer.toHexString(SendBuf1[p] & 0xff);
                SendInfStr=SendInfStr+ bytestr.substring(bytestr.length() -2,bytestr.length())+" ";
            }
            updatetrack("修改本设备网络参数指令:"+SendInfStr+"\n");
        }catch  (Exception e){
            updatetrack(e.getMessage()+"\n\n");
        }
    }

    public void DisableSendAge(byte[] indata,String RemIP,int RemPor){ //确定接收到信息
        byte[] SendBuf1 = new byte [9];
        SendBuf1[0]=(byte)0x69;
        String SendInfStr="69 ";
        for(int p=1;p<9;p++){
            SendBuf1[p]=indata[p];
            String bytestr="00"+Integer.toHexString(indata[p] & 0xff);
            SendInfStr=SendInfStr+ bytestr.substring(bytestr.length() -2,bytestr.length())+" ";
        }
        try {
            DatagramSocket s1 = new DatagramSocket();
            DatagramPacket dp1 = new DatagramPacket(SendBuf1, SendBuf1.length, InetAddress.getByName(RemIP), RemPor);
            s1.send(dp1);
            s1.close();
            updatetrack("SendTo:"+RemIP+" Data:"+SendInfStr+"\n\n");
        }catch  (Exception e){
            updatetrack(e.getMessage()+"\n\n");
        }
    }

    public void SendDispBeep(String CardNum,String RemIP,int RemPor){
        try {
            String DispStr="卡号:"+CardNum+"  "+GetSysDT().substring(2,19)+"        "; //将显示的文字生成字节数组
            byte[] DispBuf= DispStr.getBytes("gb2312");
            byte[] SendBuf1 = new byte [39];                 /** 2、将要发送的数据打包 */
            SendBuf1[0]=(byte)0x5a;                          //指令码
            SendBuf1[1]=(byte)0x00;                          //机号低
            SendBuf1[2]=(byte)0x00;                          //机号高
            SendBuf1[3]=(byte)0x02;                          //蜂鸣声代码
            SendBuf1[4]=(byte)0x14;                          //显示时长
            for(int i=0;i<34;i++){                           //显示文字
                SendBuf1[i+5]=DispBuf[i];
            }
            String SendInfStr="";
            for(int p=0;p<39;p++){
                String bytestr="00"+Integer.toHexString(SendBuf1[p] & 0xff);
                SendInfStr=SendInfStr+ bytestr.substring(bytestr.length() -2,bytestr.length())+" ";
            }
            DatagramSocket s1 = new DatagramSocket();
            DatagramPacket dp1 = new DatagramPacket(SendBuf1, SendBuf1.length, InetAddress.getByName(RemIP), RemPor);
            Recsock.send(dp1);
            s1.close();
            updatetrack("SendTo:"+RemIP+" Data:"+SendInfStr+"\n\n");
        }catch  (Exception e){
            updatetrack(e.getMessage()+"\n\n");
        }
    }

    public void SendDispSpk(String CardNum,String RemIP,int RemPor) {
        try {
            String DispStr="卡号:"+CardNum+"  "+GetSysDT().substring(2,19)+"        "; //将显示的文字生成字节数组
            byte[] DispBuf= DispStr.getBytes("gb2312");

            byte SpkLen=3;                                  //固定组合语音长度,一次最大取值21条
            byte[] SpkBuf=new byte[SpkLen];                 //固定组合语音代码缓冲,
            SpkBuf[0]=55;                                   //要播报的语音代码0
            SpkBuf[1]=41;                                   //要播报的语音代码1
            SpkBuf[2]=53;                                   //要播报的语音代码2......

            byte[] SendBuf1 = new byte [70];                 /** 2、将要发送的数据打包 */
            SendBuf1[0]=(byte)0x5B;                          //指令码
            SendBuf1[1]=(byte)0x00;                          //机号低
            SendBuf1[2]=(byte)0x00;                          //机号高,如果高低位都为0表示任意机号
            SendBuf1[3]=(byte)0x02;                          //蜂鸣声代码,取值范围参看通讯协议
            SendBuf1[4]=(byte)0xF0;                          //继电器代码 F0表示全部继电器 F1表示1号继电器 F2表示2号继电器

            SendBuf1[5]=(byte)0x20;                          //继电器开启时长 低位
            SendBuf1[6]=(byte)0x00;                          //继电器开启时长 高位

            SendBuf1[7]=(byte)0x14;                          //显示保留时间,单位为秒,为0xFF时表示永久显示
            SendBuf1[8]=(byte)0x00;                          //在显示屏中的哪个位置开始,一般取0表示首位
            SendBuf1[9]=36;                                  //显示字符串长度 为全屏显示为 36 个字符
            SendBuf1[10]=SpkLen;                             //语音长度

            for(int i=0;i<34;i++){                           //要显示的文字
                SendBuf1[11+i]=DispBuf[i];
            }

            for(int i=0;i<SpkLen;i++){                       //要播报的固定语音代码
                SendBuf1[47+i]=SpkBuf[i];
            }

            SendBuf1[47+SpkLen+0]=(byte)0x55;                //固定的抗干扰后缀
            SendBuf1[47+SpkLen+1]=(byte)0xaa;
            SendBuf1[47+SpkLen+2]=(byte)0x66;
            SendBuf1[47+SpkLen+3]=(byte)0x99;

            String SendInfStr="";
            for(int p=0;p<=47+SpkLen+3;p++){
                String bytestr="00"+Integer.toHexString(SendBuf1[p] & 0xff);
                SendInfStr=SendInfStr+ bytestr.substring(bytestr.length() -2,bytestr.length())+" ";
            }

            DatagramSocket s1 = new DatagramSocket();       /** 1、建立udp socket端点 */
            DatagramPacket dp1 = new DatagramPacket(SendBuf1, SendBuf1.length, InetAddress.getByName(RemIP), RemPor);
            s1.send(dp1);
            s1.close();
            updatetrack("SendTo:"+RemIP+" Data:"+SendInfStr+"\n\n");
        }catch  (Exception e){
            updatetrack(e.getMessage()+"\n\n");
        }
    }

    public void SendDispTTS(String CardNum,String RemIP,int RemPor) {
        try {
            String DispStr="卡号:"+CardNum+"  "+GetSysDT().substring(2,19)+"        "; //将显示的文字生成字节数组
            byte[] DispBuf= DispStr.getBytes("gb2312");

            String SpeakStr="";                              //将要播报的TTS语音生成字节数组,最大不能超过126个字节
            SpeakStr="[v10]";                                //定义语音大小,最大语语音为16,可加在任何地方
            SpeakStr=SpeakStr+"欢迎您使用我们的网络读卡器";      //要播报的中文语音
            byte[] SpeakBuf= SpeakStr.getBytes("gb2312");
            int    SpeakLen=SpeakBuf.length;                //语音长度

            int SendLen=11+34+SpeakLen+4;                   //总计发送数据长度

            byte[] SendBuf1 = new byte [180];                /** 2、将要发送的数据打包 */
            SendBuf1[0]=(byte)0x5C;                          //指令码
            SendBuf1[1]=(byte)0x00;                          //机号低
            SendBuf1[2]=(byte)0x00;                          //机号高
            SendBuf1[3]=(byte)0x01;                          //蜂鸣声代码
            SendBuf1[4]=(byte)0xF0;                          //继电器代码 F0表示全部继电器 F1表示1号继电器 F2表示2号继电器

            SendBuf1[5]=(byte)0x20;                          //继电器开启时长 低位
            SendBuf1[6]=(byte)0x00;                          //继电器开启时长 高位

            SendBuf1[7]=(byte)0x14;                          //显示保留时间,单位为秒,为0xFF时表示永久显示
            SendBuf1[8]=(byte)0x00;                          //在显示屏中的哪个位置开始
            SendBuf1[9]=(byte)0x22;                          //显示字符串长度 为全屏显示为 34 个字符
            SendBuf1[10]=(byte)SpeakLen;                     //语音长度

            for(int i=0;i<34;i++){                           //显示的文字信息
                SendBuf1[i+11]=DispBuf[i];
            }

            for(int i=0;i<SpeakLen;i++){                     //TTS语音播报信息
                SendBuf1[i+45]=SpeakBuf[i];
            }

            SendBuf1[10+34+SpeakLen+1]=(byte)0x55;           //固定的抗干扰后缀
            SendBuf1[10+34+SpeakLen+2]=(byte)0xaa;
            SendBuf1[10+34+SpeakLen+3]=(byte)0x66;
            SendBuf1[10+34+SpeakLen+4]=(byte)0x99;

            String SendInfStr="";                           //这段代码显示发送的16进制报文,正式项目可以删除
            for(int p=0;p<SendLen;p++){
                String bytestr="00"+Integer.toHexString(SendBuf1[p] & 0xff);
                SendInfStr=SendInfStr+ bytestr.substring(bytestr.length() -2,bytestr.length())+" ";
            }
            DatagramSocket s1 = new DatagramSocket();       /** 1、建立udp socket端点 */
            DatagramPacket dp1 = new DatagramPacket(SendBuf1, SendBuf1.length, InetAddress.getByName(RemIP), RemPor);
            s1.send(dp1);
            s1.close();
            updatetrack("SendTo:"+RemIP+" Data:"+SendInfStr+"\n\n");
        }catch  (Exception e){
            updatetrack(e.getMessage()+"\n\n");
        }
    }

    public void SendOrder(View view){
        String RemotIpStr=RemotIpV.getText().toString()  ;
        String SendInfStr=InputstrV.getText().toString().trim() ;
        if (SendInfStr.length()<1){
            Recv.append("请输入发送信息!\n\n");
            return;
        }else{
            if(ipCheck(RemotIpStr)) {
                new SendInfThread().start();
            }else{
                Recv.append("IP地址错误!\n\n");
            }
        }
    }

    private class SendInfThread extends  Thread {  //向指定IP发送信息线程
        @Override
        public void run() {
            String RemotIpStr=RemotIpV.getText().toString().trim() ;
            String SendInfStr=InputstrV.getText().toString().trim() ;
            try{
                if (!RecsockIsRuning){InitRecSock();}
                String[] strArr = SendInfStr.split("\\ ");    /*分割接收到的数据后再分析、处理、返回指令 */
                byte[] SendBuf = new byte[strArr.length];
                for(int p=0;p<strArr.length;p++) {
                    SendBuf[p]=(byte)(Integer.parseInt(strArr[p],16));
                }
                DatagramPacket dp1=new DatagramPacket(SendBuf,SendBuf.length,InetAddress.getByName(RemotIpStr),BROADCAST_PORT);
                Recsock.send(dp1);
                updatetrack("SendTo:"+RemotIpStr+" Data:"+SendInfStr+"\n\n");
            }catch  (Exception e){
                updatetrack(e.getMessage()+"\n\n");
                //Recsock.close();
                //RecsockIsRuning=false;
                //InitRecSock();
            }
        }
    }

    /*----------------------------------------------------------------------------------------------------------------------------取设备IP*/
    public static String getIP(){
        Enumeration<NetworkInterface> netInterfaces;
        ArrayList<String> IpAddList = new ArrayList<String>();
        try {
            netInterfaces = NetworkInterface.getNetworkInterfaces();    // 拿到所有网卡
            InetAddress ip;
            while (netInterfaces.hasMoreElements()) {
                NetworkInterface ni = netInterfaces.nextElement();
                Enumeration<InetAddress> addresses = ni.getInetAddresses();
                while (addresses.hasMoreElements()) {
                    ip = addresses.nextElement();
                    if (!ip.isLoopbackAddress() && ip.getHostAddress().indexOf(':') == -1) {
                        IpAddList.add(ip.getHostAddress());
                        System.out.println((IpAddList.size()-1)+""+ " " +ni.getName() + " "+ ip.getHostAddress());
                    }
                }
            }
        } catch (Exception e) {

        }
        if(IpAddList.isEmpty()){
            return "127.0.0.1";
        }else{
            return IpAddList.get(0);    //如有多张网卡,请选择与设备相连的网卡,否则无法与设备正常通讯
        }
    }

    /*---------------------------------------------------------------------------------------------------------判断字符串是不是一个日期时间格式*/
    public static boolean IsDateTime(String inputstr) {
        Date date=null;
        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try{
            date=formatter.parse(inputstr);
            return true;
        }catch (Exception e) {
            return false;
        }
    }
    /*--------------------------------------------------------------------------------------------------------------------取电脑系统日期时间*/
    public static String GetSysDT() {
        Date date=new Date();
        SimpleDateFormat formatter=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String TimeStr=formatter.format(date);
        return TimeStr;
    }

    public static boolean ipCheck(String text) {   //判断是否正确的IP地址
        if (text != null && !text.isEmpty()) {
            // 定义正则表达式
            String regex = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
                    + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." +"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
                    + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$";
            // 判断ip地址是否与正则表达式匹配
            if (text.matches(regex)) {
                // 返回判断信息
                return true;
            } else {
                // 返回判断信息
                return false;
            }
        }
        return false;
    }

    public void onBackPressed(){   //按退出返回键
        RecsockIsRuning=false;
        Recsock.close() ;
        finish() ;
        System.exit(0);
    }

    public void onclickclea(View vies){
        Recv.setText("");
        InputstrV.setText("");
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vx_13822155058

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值