-UDP协议和TCP协议
UDP协议和TCP协议是互联网使用最广的两种协议都是基于IP的协议。第一个区别是UDP协议是一个不太靠谱的协议,UDP协议把数据都打成数据包,数据包上自带通讯地址,也就是说我要把这个数据包发送到网络上的哪一个地址,通过网络把这个数据包发送出去,至于这个数据包是否发送到目的地,是否服务器端接收到了这个数据包,这个协议并不保证,就像中国的邮政,你是把信寄出去了,但是邮政系统不保证对方能收到你寄送的信。TCP发送数据的时候要求接收方接收到数据之后给一个回应,也就是你是否收到了,TCP可靠一些,当我们发送一些比较重要的数据的时候一般都使用TCP协议。另外一个区别是UDP协议发送的一个数据包它的容量是有限的,而TCP协议则没有这样一个限制。并不是说UDP协议一定就不如TCP协议,在不同的领域有不同是使用,UDP协议好处是速度相对快些。TCP协议相对慢些。
-Socket通讯流程
应用程序通过“套接字”也就是Socket可以选择这两种协议当中的一种,你可以选择用UDP发送数据,也可以选择用TCP发送数据,数据发送出去通过“通信信道”也就是IP的基础网络,来到服务器端(接收端),就可以接收到数据了。发送数据的时候用UDP协议,接收的时候也要用UDP协议,发送数据的时候用TCP协议,接收的时候也要用TCP协议,在发送的时候指定接收端的IP地址和端口号就可以了,究竟数据包或数据是如何发送的,框架已经帮我们封装好了,我们不去关心它了。
一:TCP协议通讯模型
1:工作流程
首先有两部分客户端和服务器端,客户端需要Socket这个类的对象,而服务器端需要ServerSocket这个类的对象,由客户端Socket发送一个请求,服务器端的ServerSocket在计算机的某一个端口号上进行监听,监听客户端发送的请求之后,那么客户端和服务器端的一个通讯通道就建立起来了,这时候呢既可以从客户端向服务器端发送数据,服务器端也可以给客户端相应的响应。在客户端发送数据的时候我们需要用到IO流里面的OutputStream,通过这个OutputStream把数据发送给服务器端,服务器端用InputStream来读取客户端当中用OutputStream所写入的数据。生活举例:就像双方男女朋友打电话一样,男孩(客户端)说话(数据)通过听筒发送到电话网络中去,当男孩说话的时候就相当于咱们这里的通过OutputStream向互联网中写入数据,而作为接听的这个女孩(服务器端)那么男孩(客户端)说的内容就是女孩(服务器端)听到的内容,那么就是说服务器端可以通过InputStream把客户端当中通过OutputStream所写入的数据给它读取出来,反之亦然,如果服务器端想向客户端发送数据,那么就使用OutputStream写出数据,在客户端通过InputStream把服务器端当中通过OutputStream所写入的数据给它读取出来。就像打电话一样,你说的就是我听的,你听的就是我说的。
二:通过基于TCP协议发送和读取数据
1:布局文件main.xml
2.1:服务器端Socket代码文件MainActivity.java
package com.szy.socket; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class MainActivity extends Activity { private Button btn1 = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn1 = (Button) findViewById(R.id.btn1); //给按钮绑定监听器 btn1.setOnClickListener(new Btn1Listener()); } //按钮监听器 private class Btn1Listener implements OnClickListener { @Override public void onClick(View v) { //启动一个线程 new ServerThread().start(); } } //线程类 private class ServerThread extends Thread { public void run() { //声明一个ServerSocket对象 ServerSocket serverSocket = null; try { //创建一个ServerSocket对象,并让ServerSocket在4567端口上监听 serverSocket = new ServerSocket(4567); //调用 ServerSocket对象的accept()方法接收客户端所发送的请求 //accept()这个方法是一个阻塞的方法,如果客户端没有发送请求,那么代码运行到这里被阻塞,停在这里不再向下运行了,一直等待accept()函数的返回,这时候突然客户端发送一个请求,那个这个方法就会返回Socket对象, //Socket对象代表服务器端和客户端之间的一个连接 Socket socket = serverSocket.accept(); //从Socket对象中得到InputStream对象 //一旦通讯管道建立起来后,就是服务器端有一个Socket,客户端也有一个Socket,我们就可以通过服务器端的Socket里面的InputStream来读取客户端所发送的数据 InputStream inputStream = socket.getInputStream(); byte data[] = new byte[1024*4]; int i = 0; //从InputStream对象中读取客户端所发送的数据 while((i = inputStream.read(data)) !=1 ) Log.d("mytag",new String(data,0,i)); } catch (IOException e) { e.printStackTrace(); } finally { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
2.2:客户端Socket代码文件TcpSocketClient.java
package com.szy.socketclient; import android.app.Activity; import java.net.Socket; import java.io.FileInputStream; import java.io.InputStream; import java.io.OutputStream; public class TcpSocketClient extends Activity { public static void main(String[] args) { try { //创建一个Socket对象,指定服务器端的IP地址和端口号 Socket socket = new Socket("192.168.1.105",4567); //使用InputStream对象读取硬盘上的文件 InputStream inputStream = new FileInputStream("C://www.txt"); //从Socket对象中得到OutputStream对象,准备往OutputStream对象里写入数据 OutputStream outputStream = socket.getOutputStream(); byte data[] = new byte[1024*4]; int i = 0; while((i = inputStream.read(data)) !=1 ) //从InputStream对象中读取数据并写入到 OutputStream对象当中 outputStream.write(data, 0, i); outputStream.flush(); } catch (Exception e) { e.printStackTrace(); } } }
(安卓巴士出)
欢迎热爱安卓开发的朋友加入群学习共同进步!深圳群260134856,成都群 252743807,北京群111059554,西安群252746034,武汉群121592153,杭州群253603803
原文链接:https://www.cnblogs.com/feifei1010/archive/2012/09/17/2688736.html
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/32430