Android端TCP通讯

MainActivity.java

package com.aaa.tcptest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {
    boolean isConnect = true;//连接还是断开
    Button ConnectButton;//定义连接按钮
    Button SendButton;//定义发送按钮
    EditText IPEditText;//定义ip输入框
    EditText PortText;//定义端口输入框
    EditText MsgEditText;//定义信息输出框
    EditText RrceiveEditText;//定义信息输入框
    Socket socket = null;//定义socket
    private OutputStream outputStream = null;//定义输出流
    private InputStream inputStream = null;//定义输入流

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

        ConnectButton = (Button) findViewById(R.id.Connect_Bt);//获得连接按钮对象
        SendButton = (Button) findViewById(R.id.Send_Bt);//获得发送按钮对象
        IPEditText = (EditText) findViewById(R.id.ip_ET);//获得ip文本框对象
        PortText = (EditText) findViewById(R.id.Port_ET);//获得端口文本框按钮对象
        MsgEditText = (EditText) findViewById(R.id.Send_ET);//获得发送消息文本框对象
        RrceiveEditText = (EditText) findViewById(R.id.Receive_ET);//获得接收消息文本框对象
    }

    public void Connect_onClick(View v) {
        if (isConnect == true) //标志位 = true表示连接
        {
            isConnect = false;//置为false
            ConnectButton.setText("断开");//按钮上显示--断开
//启动连接线程
            Connect_Thread connect_Thread = new Connect_Thread();
            connect_Thread.start();
        } else //标志位 = false表示退出连接
        {
            isConnect = true;//置为true
            ConnectButton.setText("连接");//按钮上显示连接
            try {

                socket.close();//关闭连接
                socket = null;
            } catch (IOException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }


    public void Send_onClick(View v) {
        try
        {
            Send_Thread Send_Thread = new Send_Thread();
            Send_Thread.start();
        }
        catch (Exception e)
        {
// TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //连接线程
    class Connect_Thread extends Thread//继承Thread
    {
        public void run()//重写run方法
        {
            try {
                if (socket == null) {
//用InetAddress方法获取ip地址
                    InetAddress ipAddress = InetAddress.getByName(IPEditText.getText().toString());
                    int port = Integer.valueOf(PortText.getText().toString());//获取端口号
                    socket = new Socket(ipAddress, port);//创建连接地址和端口-------------------这样就好多了
//在创建完连接后启动接收线程
                    Receive_Thread receive_Thread = new Receive_Thread();
                    receive_Thread.start();
                }

            } catch (Exception e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    //接收线程
    class Receive_Thread extends Thread {
        public void run()//重写run方法
        {
            try {
                while (true) {
                    final byte[] buffer = new byte[1024];//创建接收缓冲区
                    inputStream = socket.getInputStream();
                    final int len = inputStream.read(buffer);//数据读出来,并且返回数据的长度
                    runOnUiThread(new Runnable()//不允许其他线程直接操作组件,用提供的此方法可以
                    {
                        public void run() {
// TODO Auto-generated method stub
                            RrceiveEditText.setText(new String(buffer, 0, len));
                        }
                    });
                }
            } catch (IOException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

    class Send_Thread extends Thread {
        public void run()//重写run方法
        {
            try {
                //获取输出流
                outputStream = socket.getOutputStream();
//发送数据
                outputStream.write(MsgEditText.getText().toString().getBytes());

            } catch (IOException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }
}

 

activity_main.xml

<?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">
    <!--显示的标题:目标IP地址-->
    <RelativeLayout
        android:layout_height="match_parent"
        android:layout_width="match_parent">
        <TextView
            android:textSize="20dp"
            android:id="@+id/IP_tv"
            android:text="目标IP地址"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
        <!--显示的标题:目标端口号-->
        <TextView
            android:textSize="20dp"
            android:id="@+id/Port_tv"
            android:text="目标端口号"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/IP_tv"
            android:layout_marginTop="30dp"
            />
        <!-- 用于填写ip地址的文本框-->
        <EditText
            android:id="@+id/ip_ET"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@id/IP_tv"
            android:text="192.168.1.14" />
        <!-- 用于填写端口号的文本框-->
        <EditText
            android:id="@+id/Port_ET"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@id/Port_tv"
            android:layout_toRightOf="@id/Port_tv"
            android:text="6004" />
        <!-- 用于发送信息的文本框-->
        <EditText
            android:id="@+id/Send_ET"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/Port_tv"
            android:text="AAD140140105443418341800020A000855" />
        <!-- 用于连接的按钮-->
        <Button
            android:text="连接"
            android:id="@+id/Connect_Bt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="Connect_onClick"
            android:layout_below="@id/Send_ET"
            />
        <!-- 用于发送信息的按钮-->
        <Button
            android:text="发送"
            android:id="@+id/Send_Bt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="Send_onClick"
            android:layout_below="@id/Send_ET"
            android:layout_alignParentRight="true"
            />
        <!-- 用于接收信息的文本框-->
        <EditText
            android:background="@android:color/darker_gray"
            android:id="@+id/Receive_ET"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/Connect_Bt"
            android:layout_alignParentBottom="true"
            />

    </RelativeLayout>



</androidx.constraintlayout.widget.ConstraintLayout>

 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.canmax.tcptest">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值