Android Studio的笔记--socket通信

这篇具有很好参考价值的文章主要介绍了Android Studio的笔记--socket通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Socket

Socket 作为一种通用的技术规范,首次是由 Berkeley 大学在 1983 为 4.2BSD Unix 提供的,后来逐渐演化为 POSIX 标准。Socket API 是由操作系统提供的一个编程接口,让应用程序可以控制使用 socket 技术。
Socket API 不属于 TCP/IP协议簇,只是操作系统提供的一个是一个对 TCP / IP协议进行封装 的编程调用接口,工作在应用层与传输层之间:
一个 Socket 包含两个必要组成部分:
1地址:IP 和端口号组成一队套接字
2协议:Socket 所用的是传输层协议,目前有 TCP、UDP、raw IP

协议

根据传输方式不同(即使用的协议不同)可分为三种:
1.Stream Sockets(流套接字)
基于 TCP协议,采用 流的方式 提供可靠的字节流服务。TCP 协议有以下特点:
·面向连接:指的是要使用TCP传输数据,必须先建立TCP连接,传输完成后释放连接,就像打电话一样必须先拨号建立一条连接,打完后挂机释放连接。
·全双工通信:即一旦建立了TCP连接,通信双方可以在任何时候都能发送数据。
·可靠的:指的是通过TCP连接传送的数据,无差错,不丢失,不重复,并且按序到达。
·面向字节流:流,指的是流入到进程或从进程流出的字符序列。简单来说,虽然有时候要传输的数据流太大,TCP报文长度有限制,不能一次传输完,要把它分为好几个数据块,但是由于可靠性保证,接收方可以按顺序接收数据块然后重新组成分块之前的数据流,所以TCP看起来就像直接互相传输字节流一样,面向字节流。
2.Datagram Sockets(数据报套接字)
基于 UDP协议,采用 数据报文 提供数据打包发送的服务。UDP 协议有以下特点:
·无连接的:和TCP要建立连接不同,UDP传输数据不需要建立连接,就像写信,在信封写上收信人名称、地址就可以交给邮局发送了,至于能不能送到,就要看邮局的送信能力和送信过程的困难程度了。
·不可靠的:因为UDP发出去的数据包发出去就不管了,不管它会不会到达,所以很可能会出现丢包现象,使传输的数据出错。
·面向报文:数据报文,就相当于一个数据包,应用层交给UDP多大的数据包,UDP就照样发送,不会像TCP那样拆分。
·没有拥塞控制:拥塞,是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象,就像交通堵塞一样。TCP建立连接后如果发送的数据因为信道质量的原因不能到达目的地,它会不断重发,有可能导致越来越塞,所以需要一个复杂的原理来控制拥塞。而UDP就没有这个烦恼,发出去就不管了。
3.Row Sockets
通常用在路由器或其他网络设备中,这种 socket 不经过TCP/IP协议簇中的传输层(transport layer),直接由网络层(Internet layer)通向应用层(Application layer),所以这时的数据包就不会包含 tcp 或 udp 头信息。

android socket 代码

清单文件

得添加权限 < uses-permission android:name=“android.permission.INTERNET” />

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lxh.biji"
    android:installLocation="internalOnly">
    <uses-permission android:name="android.permission.INTERNET" />
    <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/Theme.Shuiji">
        <activity
            android:name=".MainActivity"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service
            android:name=".TCPServerService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.newland.management.TCPServerService.and" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>
        <service
            android:name=".TCPClientService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.newland.management.TCPClientService.and" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>
    </application>
</manifest>

开启服务

Intent intentx = new Intent("com.newland.management.TCPServerService.and");
intentx.setPackage("com.lxh.biji");
context.startService(intentx);
Intent intentx_ = new Intent("com.newland.management.TCPClientService.and");
intentx_.setPackage("com.lxh.biji");
context.startService(intentx_);

服务端:TCPServerService

package com.lxh.biji;
import android.app.IntentService;
import android.content.Intent;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
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.ServerSocket;
import java.net.Socket;
/**
 * create by lxh on 2023/2/20 Time:16:33
 * tip:socket服务端 端口号55019,用来发送值
 */
public class TCPServerService extends IntentService {
    private static final String TAG = "TCPServerService";
    public TCPServerService() {
        super("TCP");
    }
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "lxh "+TAG+"  onCreate: ");
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        isover = true;
        Log.d(TAG, "lxh "+TAG+"  onDestroy: ");
    }
    private boolean isover = false;
    private String sendMag="";
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        try {
            Log.i(TAG,"lxh onHandleIntent");
            ServerSocket serverSocket = new ServerSocket(55019);//监听本地端口号
            Socket socket = serverSocket.accept();
            InputStream inputStream = socket.getInputStream();//获取输入流,接受用户发来的消息
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            OutputStream outputStream = socket.getOutputStream();//获取输出流,向客户端回复消息
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(outputStream));
            while (!isover) {//通过循环不断读取客户端发来的消息,并回复
                //Log.i(TAG,"lxh on while");
                String readLine = reader.readLine();
                if (!TextUtils.isEmpty(readLine)) {
                    String readMag =readLine.toString();Log.i(TAG,"lxh 客户端发送的消息:"+readMag);
                    if(readMag.equals("Client_send")){
                        String need_String="Server_back";
                        sendMag =need_String;
                    }else if (readMag.equals("get")){ }
                    //SystemClock.sleep(500);//延迟发送
                    writer.println(sendMag+"\r");
                    writer.flush();//刷新流
                }else { }
            }
            inputStream.close();//关闭流
            reader.close();
            outputStream.close();
            writer.close();
            socket.close();
            //需关闭,否则再次连接时,会报端口号已被使用
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端:TCPClientService

package com.lxh.biji;
import android.annotation.SuppressLint;
import android.app.IntentService;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
/**
 * create by lxh on 2023/2/20 Time:20:02
 * tip:socket客户端 端口号55019
 */
public class TCPClientService extends IntentService {
    private static final String TAG = "TCPClientService";
    public TCPClientService() {
        super("TCP");
    }
    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "lxh "+TAG+" onCreate: ");
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
//        isover_client = true;
//        //关闭输入流和连接
//        if (mSocket != null) {
//            try {
//                mSocket.shutdownInput();
//                mSocket.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
        Log.d(TAG, "lxh "+TAG+" onDestroy: ");
    }
    private boolean isover_client = false;
    private String sendMag_client="";
    private static final int CONNECT_SERVER_SUCCESS = 0;
    private static final int MESSAGE_RECEIVE_SUCCESS = 1;
    private static final int MESSAGE_SEND_SUCCESS = 2;
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                connectTCPServer();//连接服务端,实现通信交互//IO操作必须放在子线程执行
            }
        }).start();

    }
    Handler handler=new Handler();
    int handler_id=0;
    //handler.postDelayed(runnable, 2000);
    //handler.removeCallbacks(runnable);
    Runnable runnable=new Runnable() {
        @Override
        public void run() {
            run_send();
            handler_id++;
            handler.postDelayed(this, 2000);
            if (handler_id>3){
                handler.removeCallbacks(runnable);
                //关闭输入流和连接
                if (mSocket != null) {
                    try {
                        mSocket.shutdownInput();
                        mSocket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    };
    private void run_send(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                String msg = "Client_send";
                if (mPrintWriter != null && !TextUtils.isEmpty(msg)) {
                    mPrintWriter.println(msg + "\n");
                    //mPrintWriter.flush();//此处可以不用刷新流的方法,因为在创建mPrintWriter对象时,在其构造方法中设置了自动刷新缓存
                    mHandler.obtainMessage(MESSAGE_SEND_SUCCESS, msg).sendToTarget();
                }
            }
        }).start();
    }
    private Socket mSocket = null;
    private void connectTCPServer() {
        while (mSocket == null) {//通过循环来判断Socket是否有被创建,若没有则会每隔1s尝试创建,目的是保证客户端与服务端能够连接
            try {
                mSocket = new Socket("localhost", 55019);//创建Socket对象,指定IP地址和端口号
                mPrintWriter = new PrintWriter(new OutputStreamWriter(mSocket.getOutputStream()), true);
                if (mSocket.isConnected()) //判断是否连接成功
                    mHandler.sendEmptyMessage(CONNECT_SERVER_SUCCESS);
            } catch (IOException e) {
                e.printStackTrace();
                SystemClock.sleep(1000);//设计休眠机制,每次重试的间隔时间为1s
            }
        }
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
            while (!isover_client) {//通过循环来,不断的接受服务端发来的消息
                String msg = reader.readLine();
                if (!TextUtils.isEmpty(msg)) {
                    mHandler.obtainMessage(MESSAGE_RECEIVE_SUCCESS, msg).sendToTarget();
                }
            }
            mPrintWriter.close();//关闭流
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @SuppressLint("all")
    private Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            switch (msg.what) {
                case CONNECT_SERVER_SUCCESS:
                    Log.i(TAG,"lxh 与服务端连接成功");
                    //run_send();
                    handler.postDelayed(runnable, 2000);
                    break;
                case MESSAGE_RECEIVE_SUCCESS:
                    Log.i(TAG,"lxh 服务端发来的消息:"+msg.obj.toString());
                    break;
                case MESSAGE_SEND_SUCCESS:
                    //Log.i(TAG,"lxh 客户端发送的消息:"+msg.obj.toString());
                    break;
            }
            return false;
        }
    });
    private PrintWriter mPrintWriter;
}

log

/com.lxh.biji D/TCPServerService: lxh TCPServerService  onCreate: 
/com.lxh.biji I/TCPServerService: lxh onHandleIntent
/com.lxh.biji D/TCPClientService: lxh TCPClientService onCreate: 
/com.lxh.biji D/TCPClientService: lxh TCPClientService onDestroy: 
/com.lxh.biji I/TCPClientService: lxh 与服务端连接成功
/com.lxh.biji I/TCPServerService: lxh 客户端发送的消息:Client_send
/com.lxh.biji I/TCPClientService: lxh 服务端发来的消息:Server_back
/com.lxh.biji I/TCPServerService: lxh 客户端发送的消息:Client_send
/com.lxh.biji I/TCPClientService: lxh 服务端发来的消息:Server_back
/com.lxh.biji I/TCPServerService: lxh 客户端发送的消息:Client_send
/com.lxh.biji I/TCPClientService: lxh 服务端发来的消息:Server_back

感谢互联网
引用内容来自Android Socket 通信
服务端部分代码参考Android进程间通信 - Socket使用(TCP、UDP)
适合阅读文章分享
Android 基于TCP的 Socket 编程实现(结合 okio)
Android实现socket网络通信
基于android的Socket通信

与君共勉!待续
欢迎指错,一起学习文章来源地址https://www.toymoban.com/news/detail-438512.html

到了这里,关于Android Studio的笔记--socket通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android车载系列】第9章 车载通信-Socket实现IPC通信机制(实现仿FDBus效果)

      FDBus 基于 Socket (TCP 和 Unix domain) 之上的IPC机制, 采用 Google protobuf 做序列化和反序列化。 FDBus还支持字符串形式的名字作为server地址。通过 name server 自动为 server 分配Unix domain 地址和 TCP 端口号, 实现 client 和server 之间用服务名字寻址。 一句话描述:FDBus (Fast Distributed Bus

    2024年02月10日
    浏览(66)
  • Unity的Socket通讯,Unity作为服务端

     最近在研究Socket通讯,发现对Unity来说,作为客户端的情况比较多,于是突发奇想搞一个服务器端,废话不多说直接上代码 using System; using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using UnityEngine; public class Tes

    2024年02月05日
    浏览(33)
  • socket实现tcp通信

    tcp的详细细节后面讲解,先来用它的一些接口实现1个简单的通信。下面来看它的一套接口 功能:socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符;应用程序可以像读写文件一样用read/write在网络上收发数据; 函数原型: 参数说明: domain:协议域又称

    2024年02月01日
    浏览(52)
  • Node实现 Socket 通信

            Socket通信,首先要知道 Socket 是什么,就是网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端被称为 socket ,举一个简单的例子就是两个人在线上进行聊天,即线上通信,那么socket通信的流程具体是怎样的?下面通过一张图来了解 socket 的通

    2023年04月17日
    浏览(38)
  • QT使用Socket通信

    QTcpServer用于TCP/IP通信, 作为服务器端套接字使用。 QTcpSocket用于TCP/IP通信,作为客户端套接字使用。 QUdpSocket用于UDP通信,服务器,客户端均使用此套接字。 创建套接字 将套接字设置为监听模式 等待并接受客户端请求 可以通过QTcpServer提供的void newConnection()信号来检测是否有

    2024年02月05日
    浏览(32)
  • Socket实现双机通信

    使用软件:Visual Studio 2022 步骤: 1,新建一个空项目,项目名称为Server,解决方案名称为Socket; 2,软件右方解决方案资源管理器中-右击\\\"解决方案\\\"Socket\\\"-添加\\\"新建项目\\\"添加空项目,项目名称为Client; 3,右击\\\"Server\\\"-添加“现有项”,\\\"Server\\\"有一个头文件,一个源文件,多选并添

    2024年02月11日
    浏览(37)
  • Linux——socket网络通信

    Socket套接字 由远景研究规划局(Advanced Research Projects Agency, ARPA)资助加里福尼亚大学伯克利分校的一个研究组研发。其目的是将 TCP/IP 协议相关软件移植到UNIX类系统中。设计者开发了一个接口,以便应用程序能简单地调用该接口通信。这个接口不断完善,最终形成了 Socket套

    2024年02月11日
    浏览(44)
  • socket是如何进行通信的

    Socket通信的原理大致分为以下几个步骤: 服务器端建立Socket,开始侦听整个网络中的连接请求。 当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接。 当完成通信后,服务器关闭与客户端的Socket连接。 客户端的步骤如下: 建

    2024年02月04日
    浏览(42)
  • Unity学习之Socket通信

    简单的一对一通信,客户端向服务器传输字符串,具体操作如下: 在VisualStudio中创建一个新工程,在工程中编写服务器逻辑,代码如下: 在unity中创建一个脚本,即Client.cs,具体代码如下: 在Hierarchy面板中创建一个空的游戏对象,将Client脚本绑定在游戏对象上。创建的面板

    2024年02月12日
    浏览(34)
  • Python物联网开发-Python_Socket通信开发-Python与Tcp协议物联网设备通信-Socket客户端

            Python在物联网开发中的重要愈来愈重,因此,掌握Python语言与物联网设备之间的通信就显得尤为重要,可以通过编写Python程序实现获取物联网设备的传感器数值并可以更改物联网设备上的执行器状态。         首先,当使用Python进行Socket通信时,需要导入Python的so

    2024年02月17日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包