个人可以建网站,wap网页是什么意思,做二维码电子档相册 找什么网站,网站产品说明书模板前言Socket的使用在 Android网络编程中非常重要今天我将带大家全面了解 Socket 及 其使用方法目录示意图1.网络基础阅读本文前#xff0c;请先了解 关于计算机网络基础#xff0c;如计算机体系结构、TCP、UDP等知识2. Socket定义即套接字#xff0c;是应用层 与 TCP/IP 协议…前言Socket的使用在 Android网络编程中非常重要今天我将带大家全面了解 Socket 及 其使用方法目录示意图1.网络基础阅读本文前请先了解 关于计算机网络基础如计算机体系结构、TCP、UDP等知识2. Socket定义即套接字是应用层 与 TCP/IP 协议族通信的中间软件抽象层表现为一个封装了 TCP / IP协议族 的编程接口(API)示意图Socket不是一种协议而是一个编程调用接口(API)属于传输层(主要解决数据如何在网络中传输)即通过Socket我们才能在Andorid平台上通过 TCP/IP协议进行开发对用户来说只需调用Socket去组织数据以符合指定的协议即可通信成对出现一对套接字Socket {(IP地址1:PORT端口号)(IP地址2:PORT端口号)}一个 Socket 实例 唯一代表一个主机上的一个应用程序的通信链路3. 建立Socket连接过程示意图4. 原理Socket的使用类型主要有两种流套接字(streamsocket) 基于 TCP协议采用 流的方式 提供可靠的字节流服务数据报套接字(datagramsocket)基于 UDP协议采用 数据报文 提供数据打包发送的服务具体原理图如下原理图5. Socket 与 Http 对比Socket属于传输层因为 TCP / IP协议属于传输层解决的是数据如何在网络中传输的问题HTTP协议 属于 应用层解决的是如何包装数据由于二者不属于同一层面所以本来是没有可比性的。但随着发展默认的Http里封装了下面几层的使用所以才会出现Socket HTTP协议的对比(主要是工作方式的不同)Http采用 请求—响应 方式。即建立网络连接后当 客户端 向 服务器 发送请求后服务器端才能向客户端返回数据。可理解为是客户端有需要才进行通信Socket采用 服务器主动发送数据 的方式即建立网络连接后服务器可主动发送消息给客户端而不需要由客户端向服务器发送请求可理解为是服务器端有需要才进行通信6. 使用步骤Socket可基于TCP或者UDP协议但TCP更加常用所以下面的使用步骤 实例的Socket将基于TCP协议// 步骤1创建客户端 服务器的连接// 创建Socket对象 指定服务端的IP及端口号Socket socket new Socket(192.168.1.32, 1989);// 判断客户端和服务器是否连接成功socket.isConnected());// 步骤2客户端 服务器 通信// 通信包括客户端 接收服务器的数据 发送数据 到 服务器// 步骤1创建输入流对象InputStreamInputStream is socket.getInputStream()// 步骤2创建输入流读取器对象 并传入输入流对象// 该对象作用获取服务器返回的数据InputStreamReader isr new InputStreamReader(is);BufferedReader br new BufferedReader(isr);// 步骤3通过输入流读取器对象 接收服务器发送过来的数据br.readLine()// 步骤1从Socket 获得输出流对象OutputStream// 该对象作用发送数据OutputStream outputStream socket.getOutputStream();// 步骤2写入需要发送的数据到输出流对象中outputStream.write((Carson_Ho\n).getBytes(utf-8))// 特别注意数据的结尾加上换行符才可让服务器端的readline()停止阻塞// 步骤3发送数据到服务端outputStream.flush();// 步骤3断开客户端 服务器 连接os.close();// 断开 客户端发送到服务器 的连接即关闭输出流对象OutputStreambr.close();// 断开 服务器发送到客户端 的连接即关闭输入流读取器对象BufferedReadersocket.close();// 最终关闭整个Socket连接7. 具体实例实例 Demo 代码包括客户端 服务器本文着重讲解客户端服务器仅采用最简单的写法进行展示7.1 客户端 实现步骤1加入网络权限步骤2主布局界面设置包括创建Socket连接、客户端 服务器通信的按钮android:idid/connectandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:textconnect /android:idid/disconnectandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:textdisconnect /android:idid/receive_messageandroid:layout_widthmatch_parentandroid:layout_heightwrap_content /android:idid/Receiveandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:textReceive from message /android:idid/editandroid:layout_widthmatch_parentandroid:layout_heightwrap_content /android:idid/sendandroid:layout_widthmatch_parentandroid:layout_heightwrap_contentandroid:textsend/步骤3创建Socket连接、客户端 服务器通信具体请看注释MainActivity.javapackage scut.carson_ho.socket_carson;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.Socket;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class MainActivity extends AppCompatActivity {/*** 主 变量*/// 主线程Handler// 用于将从服务器获取的消息显示出来private Handler mMainHandler;// Socket变量private Socket socket;// 线程池// 为了方便展示,此处直接采用线程池进行线程管理,而没有一个个开线程private ExecutorService mThreadPool;/*** 接收服务器消息 变量*/// 输入流对象InputStream is;// 输入流读取器对象InputStreamReader isr ;BufferedReader br ;// 接收服务器发送过来的消息String response;/*** 发送消息到服务器 变量*/// 输出流对象OutputStream outputStream;/*** 按钮 变量*/// 连接 断开连接 发送数据到服务器 的按钮变量private Button btnConnect, btnDisconnect, btnSend;// 显示接收服务器消息 按钮private TextView Receive,receive_message;// 输入需要发送的消息 输入框private EditText mEdit;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/*** 初始化操作*/// 初始化所有按钮btnConnect (Button) findViewById(R.id.connect);btnDisconnect (Button) findViewById(R.id.disconnect);btnSend (Button) findViewById(R.id.send);mEdit (EditText) findViewById(R.id.edit);receive_message (TextView) findViewById(R.id.receive_message);Receive (Button) findViewById(R.id.Receive);// 初始化线程池mThreadPool Executors.newCachedThreadPool();// 实例化主线程,用于更新接收过来的消息mMainHandler new Handler() {Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 0:receive_message.setText(response);break;}}};/*** 创建客户端 服务器的连接*/btnConnect.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {// 利用线程池直接开启一个线程 执行该线程mThreadPool.execute(new Runnable() {Overridepublic void run() {try {// 创建Socket对象 指定服务端的IP 及 端口号socket new Socket(192.168.1.172, 8989);// 判断客户端和服务器是否连接成功System.out.println(socket.isConnected());} catch (IOException e) {e.printStackTrace();}}});}});/*** 接收 服务器消息*/Receive.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {// 利用线程池直接开启一个线程 执行该线程mThreadPool.execute(new Runnable() {Overridepublic void run() {try {// 步骤1创建输入流对象InputStreamis socket.getInputStream();// 步骤2创建输入流读取器对象 并传入输入流对象// 该对象作用获取服务器返回的数据isr new InputStreamReader(is);br new BufferedReader(isr);// 步骤3通过输入流读取器对象 接收服务器发送过来的数据response br.readLine();// 步骤4:通知主线程,将接收的消息显示到界面Message msg Message.obtain();msg.what 0;mMainHandler.sendMessage(msg);} catch (IOException e) {e.printStackTrace();}}});}});/*** 发送消息 给 服务器*/btnSend.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {// 利用线程池直接开启一个线程 执行该线程mThreadPool.execute(new Runnable() {Overridepublic void run() {try {// 步骤1从Socket 获得输出流对象OutputStream// 该对象作用发送数据outputStream socket.getOutputStream();// 步骤2写入需要发送的数据到输出流对象中outputStream.write((mEdit.getText().toString()\n).getBytes(utf-8));// 特别注意数据的结尾加上换行符才可让服务器端的readline()停止阻塞// 步骤3发送数据到服务端outputStream.flush();} catch (IOException e) {e.printStackTrace();}}});}});/*** 断开客户端 服务器的连接*/btnDisconnect.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {try {// 断开 客户端发送到服务器 的连接即关闭输出流对象OutputStreamoutputStream.close();// 断开 服务器发送到客户端 的连接即关闭输入流读取器对象BufferedReaderbr.close();// 最终关闭整个Socket连接socket.close();// 判断客户端和服务器是否已经断开连接System.out.println(socket.isConnected());} catch (IOException e) {e.printStackTrace();}}});}}7.2 服务器 实现因本文主要讲解客户端所以服务器仅仅是为了配合客户端展示为了简化服务器使用此处采用Mina框架服务器代码请在eclipse平台运行按照我的步骤一步步实现就可以无脑运行了步骤1导入Mina包示意图步骤2创建服务器线程TestHandler.javapackage mina;// 导入包public class TestHandler extends IoHandlerAdapter {Overridepublic void exceptionCaught(IoSession session, Throwable cause) throws Exception {System.out.println(exceptionCaught: cause);}Overridepublic void messageReceived(IoSession session, Object message) throws Exception {System.out.println(recieve : (String) message);session.write(hello I am server);}Overridepublic void messageSent(IoSession session, Object message) throws Exception {}Overridepublic void sessionClosed(IoSession session) throws Exception {System.out.println(sessionClosed);}Overridepublic void sessionOpened(IoSession session) throws Exception {System.out.println(sessionOpen);}Overridepublic void sessionIdle(IoSession session, IdleStatus status) throws Exception {}}步骤3创建服务器主代码TestHandler.javapackage mina;import java.io.IOException;import java.net.InetSocketAddress;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.textline.TextLineCodecFactory;import org.apache.mina.transport.socket.nio.NioSocketAcceptor;public class TestServer {public static void main(String[] args) {NioSocketAcceptor acceptor null;try {acceptor new NioSocketAcceptor();acceptor.setHandler(new TestHandler());acceptor.getFilterChain().addLast(mFilter, new ProtocolCodecFilter(new TextLineCodecFactory()));acceptor.setReuseAddress(true);acceptor.bind(new InetSocketAddress(8989));} catch (Exception e) {e.printStackTrace();}}}至此客户端 服务器的代码均实现完毕。7.3 测试结果点击 Connect按钮 连接成功示意图输入发送的消息点击 Send 按钮发送示意图服务器接收到客户端发送的消息示意图点击 Receive From Message按钮客户端 读取 服务器返回的消息示意图点击 DisConnect按钮断开 客户端 服务器的连接客户端示意图服务器示意图7.4 源码地址8. 总结相信大家已经非常了解关于Socket的使用下面我将继续对 Android 的网络编程进行讲解感兴趣的同学可以继续关注本人运营的Wechat Public Account请点赞因为你的鼓励是我写作的最大动力不定期分享关于安卓开发的干货追求短、平、快但却不缺深度。