Client生命周期
-
创建socket
-
绑定地址
-
发起连接
-
关闭连接
Server生命周期
-
创建socket
-
绑定(bind)地址端口
-
监听网络连接
-
接受连接
-
关闭连接
二、Android实现Socket的通信
我们在基本了解Socket通信的大致过程和基本概览后下面开始介绍如何在Android上实现它:
1.使用ServerSocket创建TCP服务器端
因为在两个通信实体没有建立虚拟链路之前,必须要有一个通信实体先做出主动姿态,主动接收来自其他通信实体的连接请求,所以我们要先创建一个TCP服务器端来接收连接请求。
Java中能接收其他通信实体连接请求的是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状态。ServerSocket包含一个监听来自客户端请求的方法。
- Socket accept():如果接收到一个客户端Socket的连接请求,该方法将返回一个与连接客户端Socket对应的Socket;否则该方法将一直处于等待状态,线程也被阻塞。
为了创建ServerSocket对象,ServerSocket类提供了一下几个构造方法:
-
ServerSocket(int port):用指定的端口port来创建一个ServerSocket。该端口应该有一个有效的端口整数值0~65535。
-
ServerSocket(int port,int backlog):增加一个用来改变连接队列长度的参数backlog。
-
ServerSocket(int port,int backlog,InetAddress localAddr):在机器存在多个IP地址的情况下,通过localAddr这个参数来指定将ServerSocket绑定到指定的IP地址。
在ServerSocket使用完毕后,应使用ServerSocket的close()方法来关闭该ServerSocket。在通常情况下,服务器不应该只接受一个客户端请求,而应该不断地接收来自客户端的所有请求,所以Java程序通常会通过循环不断地调用ServerSocket的accept()方法,如以下代码片段所示:
//创建一个ServerSocket,用于监听客户端的Socket请求
ServerSocket ss=new ServerSocket(30000 );
//采用循环不断接受来自客户端的请求
while (true){
//每当接收到客户端Socket的请求时,服务器端也对应产生一个Socket
Socket s=ss.accept();
//下面就可以使用Socket进行通信了…
2.使用Socket进行通信
客户端通常可以使用Socket的构造器来连接到指定服务器,Socket通常可提供如下两个构造器。
-
Socket(inetAddress/String remoteAddress,int port):创建连接到指定远程主机、远程端口的Socket,该构造器没有指定本地地址、本地端口,默认使用本地主机的默认IP地址,默认使用系统动态分配的端口。
-
Socket(inetAddress/String remoteAddress,int port,InetAddress localAddr,int localPort):创建连接到指定远程主机、远程端口的Socket,并指定本地IP地址和本地端口,适用于本地主机有多个IP地址的情形。
当本地主机只有一个IP地址时,使用第一个方法更为简单,如以下代码所示:
//创建连接到10.34.87.82、30000端口的Socket
Socket s=new Socket(“10.34.87.82”,30000);//这个ip地址是我本人的本机地址
//下面就可以使用Socket进行通信了…
当程序执行上面的代码时,该代码将会连接到指定的服务器,让服务器端ServerSocket的accept()方法向下执行,于是服务器端和客户端就产生一对互相连接的Socket了。
当客户端、服务器端产生了对应的Socket后,此时两端就可以通过Socket进行通信了。Socket提供了如下两个方法来获取输入流和输出流。
-
InputStream getInputStream():返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据。
-
OutputStream getOutputStream():返回该Socket对象对应的输出流,让程序通过该输出流向Socket中输出数据。
好了,到这里基本的方法已经是介绍完了,让我们用一个简单的例子来更直观的了解Socket是如何运行的吧。
1.服务器端
下面的服务器端程序需要在PC上运行,该程序很简便,因此不需要建立Android项目,直接定义一个Java类,并运行它就可以了。它只是建立ServerSocket监听,并使用Socket获取输出流输出。如以下代码:
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SimpleServer {
public static void main(String[] args) throws IOException{
//创建一个ServerSocket,用于监听客户端Socket的连接请求
ServerSocket ss = new ServerSocket(30000);
//采用循环不断接受来自客户端的请求
while (true) {
//每当接受到客户端Socket的请求时,服务器端也对应产生一个Socket
Socket s = ss.accept();
OutputStream os = s.getOutputStream();
os.write(“您好,你收到了服务器的信息!\n”.getBytes(“utf-8”));
//因为Android是Linux内核的所以客户端读取网络数据时默认UTF-8编码
//关闭输出流,关闭Socket
os.close();
s.close();
}
}
}
2.客户端
接下来的客户端程序也十分简单,它仅仅使用Socket建立与指定IP地址、指定端口的连接,并使用Socket获取输入流读取数据。该客户端是一个Android应用,除了以下代码还应该包括一个文本框用来显示从服务器端读取的字符串数据。
package com.example.socketcode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.EditText;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
EditText show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout);
show = (EditText) findViewById(R.id.show);
new Thread(){
@Override
public void run(){
try{
//建立连接到远程服务器的Socket
Socket socket=new Socket(“10.34.87.82”,30000);
//将Socket对应的输入流包装成BufferedReader
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream())
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
尾声
面试成功其实都是必然发生的事情,因为在此之前我做足了充分的准备工作,不单单是纯粹的刷题,更多的还会去刷一些Android核心架构进阶知识点,比如:JVM、高并发、多线程、缓存、热修复设计、插件化框架解读、组件化框架设计、图片加载框架、网络、设计模式、设计思想与代码质量优化、程序性能优化、开发效率优化、设计模式、负载均衡、算法、数据结构、高级UI晋升、Framework内核解析、Android组件内核等。
不仅有学习文档,视频+笔记提高学习效率,还能稳固你的知识,形成良好的系统的知识体系。这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
Android进阶学习资料库
一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
大厂面试真题
PS:之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
《2017-2021字节跳动Android面试历年真题解析》
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-zrrrP4tD-1712358727860)]
《2017-2021字节跳动Android面试历年真题解析》
[外链图片转存中…(img-X6fUt0DJ-1712358727861)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!