andriod Socket编程

为什么要讲Socket呢?因为看过我蓝牙协议(一)和蓝牙协议(二)的文章的人知道,我要做的这个应用是把蓝牙笔里面的数据读取到手机里,就要用到基于Bluetooth协议的Socket,所以就也是为什么在这里我要讲一下Socket编程了。
  一:什么是Socket    
    它实际上是网络通信的一种接口,基于不同的协议,有各种不同的Socket,比如有基于TCP协议的Socket和基于UDP协议的Socket以及基于蓝牙协议的Socket,Android中使用的是Java的Socket模型。
    Socket在计算机行业通常称为”套接字“,用于描述IP地址和端口,是一个通信链的句柄。这是一个比较抽象的概念。计算机是拥有端口的,每一个端口都可以有一个应用程序来进行通讯的使用,比如:80端口是HTTP协议所使用的端口,21端口是FTP协议所使用的端口,端口是计算机和外界通讯的接口,这些接口都是逻辑的接口,端口号取值的范围是零到256乘以256减1,1024以下的端口都是操作系统使用的保留端口,以上的端口我们可以自由的来使用,不要和其他应用程序的端口冲突。
    应用程序可以通过“套接字”向网络发送请求或者应答网络的请求,这时候就把Socket分成了两部分,一部分是服务器端的Socket,这个Socket主要用来接收来自网络的请求,它一直监听在某一个端口上。一部分是客户端的Socket,这个Socket主要用来向网络发送数据。
  二:Socket通讯模型
   22.JPG
    -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:工作流程     11.JPG     首先有两部分客户端和服务器端,客户端需要Socket这个类的对象,而服务器端需要ServerSocket这个类的对象,由客户端Socket发送一个请求,服务器端的ServerSocket在计算机的某一个端口号上进行监听,监听客户端发送的请求之后,那么客户端和服务器端的一个通讯通道就建立起来了,这时候呢既可以从客户端向服务器端发送数据,服务器端也可以给客户端相应的响应。在客户端发送数据的时候我们需要用到IO流里面的OutputStream,通过这个OutputStream把数据发送给服务器端,服务器端用InputStream来读取客户端当中用OutputStream所写入的数据。生活举例:就像双方男女朋友打电话一样,男孩(客户端)说话(数据)通过听筒发送到电话网络中去,当男孩说话的时候就相当于咱们这里的通过OutputStream向互联网中写入数据,而作为接听的这个女孩(服务器端)那么男孩(客户端)说的内容就是女孩(服务器端)听到的内容,那么就是说服务器端可以通过InputStream把客户端当中通过OutputStream所写入的数据给它读取出来,反之亦然,如果服务器端想向客户端发送数据,那么就使用OutputStream写出数据,在客户端通过InputStream把服务器端当中通过OutputStream所写入的数据给它读取出来。就像打电话一样,你说的就是我听的,你听的就是我说的。  二:通过基于TCP协议发送和读取数据    1:布局文件main.xml
  1. <?xml version="1.0" encoding="utf-8"?>
     
  2.     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     
  3.         android:orientation="vertical"
     
  4.         android:layout_width="fill_parent"
     
  5.         android:layout_height="fill_parent"
     
  6.        >
     
  7.      <Button
     
  8.         android:layout_width="fill_parent"
     
  9.         android:layout_height="wrap_content"
     
  10.         android:text="启动监听线程"
     
  11.         android:id="@+id/btn1"
     
  12.       />
     
  13.     </LinearLayout>
复制代码
2.1:服务器端Socket代码文件MainActivity.java   
  1.  package com.szy.socket;
     
  2.       import android.app.Activity;
     
  3.       import android.os.Bundle;
     
  4.       import android.util.Log;
     
  5.       import android.view.View;
     
  6.       import android.view.View.OnClickListener;
     
  7.       import android.widget.Button;
     
  8.       import java.io.IOException;
     
  9.       import java.io.InputStream;
     
  10.       import java.net.ServerSocket;
     
  11.       import java.net.Socket;
     
  12.       public class MainActivity extends Activity
     
  13.       {
     
  14.          private Button btn1 = null;
     
  15.            @Override
     
  16.         public void onCreate(Bundle savedInstanceState)
     
  17.         {
     
  18.             super.onCreate(savedInstanceState);
     
  19.             setContentView(R.layout.main);
     
  20.             btn1 = (Button) findViewById(R.id.btn1);
     
  21.            //给按钮绑定监听器
     
  22.             btn1.setOnClickListener(new Btn1Listener());
     
  23.         }
     
  24.    
     
  25.            //按钮监听器
     
  26.            private class Btn1Listener implements OnClickListener
     
  27.             {
     
  28.             @Override
     
  29.            public void onClick(View v)
     
  30.             {
     
  31.                //启动一个线程
     
  32.                new ServerThread().start();
     
  33.             }           
     
  34.            }
     
  35.   
     
  36.           //线程类
     
  37.           private class ServerThread extends Thread
     
  38.           {
     
  39.              public void run()
     
  40.              {      
     
  41.                //声明一个ServerSocket对象
     
  42.                  ServerSocket serverSocket = null;
     
  43.                  try
     
  44.                {
     
  45.                    //创建一个ServerSocket对象,并让ServerSocket在4567端口上监听
     
  46.                    serverSocket = new ServerSocket(4567);
     
  47.                    //调用 ServerSocket对象的accept()方法接收客户端所发送的请求
     
  48.                    //accept()这个方法是一个阻塞的方法,如果客户端没有发送请求,那么代码运行到这里被阻塞,停在这里不再向下运行了,一直等待accept()函数的返回,这时候突然客户端发送一个请求,那个这个方法就会返回Socket对象,
     
  49.                    //Socket对象代表服务器端和客户端之间的一个连接
     
  50.                    Socket socket = serverSocket.accept();
     
  51.                    //从Socket对象中得到InputStream对象
     
  52.                    //一旦通讯管道建立起来后,就是服务器端有一个Socket,客户端也有一个Socket,我们就可以通过服务器端的Socket里面的InputStream来读取客户端所发送的数据
     
  53.                    InputStream inputStream = socket.getInputStream();
     
  54.                    byte data[] = new byte[1024*4];
     
  55.                    int i = 0;
     
  56.                    //从InputStream对象中读取客户端所发送的数据
     
  57.                    while((i = inputStream.read(data)) !=1 )  
     
  58.                       Log.d("mytag",new String(data,0,i));      
     
  59.               }
     
  60.                 catch (IOException e)
     
  61.               {
     
  62.                 e.printStackTrace();
     
  63.               }
     
  64.               finally
     
  65.                {
     
  66.                 try
     
  67.                 {
     
  68.                    serverSocket.close();
     
  69.                 }
     
  70.                 catch (IOException e)
     
  71.                 {
     
  72.                    e.printStackTrace();
     
  73.                 }  
     
  74.              }
     
  75.            }
     
  76.         }
     
  77.     }
复制代码
2.2:客户端Socket代码文件TcpSocketClient.java 
  1.  package com.szy.socketclient;
     
  2.       import android.app.Activity;
     
  3.       import java.net.Socket;
     
  4.       import java.io.FileInputStream;
     
  5.       import java.io.InputStream;
     
  6.       import java.io.OutputStream;
     
  7.       public class TcpSocketClient extends Activity
     
  8.       {
     
  9.         public static void main(String[] args)
     
  10.         {
     
  11.              try
     
  12.             {
     
  13.                //创建一个Socket对象,指定服务器端的IP地址和端口号
     
  14.                Socket socket = new Socket("192.168.1.105",4567);
     
  15.                //使用InputStream对象读取硬盘上的文件
     
  16.                InputStream inputStream = new FileInputStream("C://www.txt");
     
  17.                //从Socket对象中得到OutputStream对象,准备往OutputStream对象里写入数据
     
  18.                OutputStream outputStream = socket.getOutputStream();
     
  19.                byte data[] = new byte[1024*4];
     
  20.                int i = 0;   
     
  21.                while((i = inputStream.read(data)) !=1 )
     
  22.                   //从InputStream对象中读取数据并写入到 OutputStream对象当中
     
  23.                   outputStream.write(data, 0, i);
     
  24.                outputStream.flush();
     
  25.           }
     
  26.          catch (Exception e)
     
  27.           {
     
  28.              e.printStackTrace();
     
  29.           }
     
  30.       }
     
  31.     }
复制代码


 

 
 
为什么要讲Socket呢?因为看过我蓝牙协议(一)和蓝牙协议(二)的文章的人知道,我要做的这个应用是把蓝牙笔里面的数据读取到手机里,就要用到基于Bluetooth协议的Socket,所以就也是为什么在这里我要讲一下Socket编程了。
  一:什么是Socket    
    它实际上是网络通信的一种接口,基于不同的协议,有各种不同的Socket,比如有基于TCP协议的Socket和基于UDP协议的Socket以及基于蓝牙协议的Socket,Android中使用的是Java的Socket模型。
    Socket在计算机行业通常称为”套接字“,用于描述IP地址和端口,是一个通信链的句柄。这是一个比较抽象的概念。计算机是拥有端口的,每一个端口都可以有一个应用程序来进行通讯的使用,比如:80端口是HTTP协议所使用的端口,21端口是FTP协议所使用的端口,端口是计算机和外界通讯的接口,这些接口都是逻辑的接口,端口号取值的范围是零到256乘以256减1,1024以下的端口都是操作系统使用的保留端口,以上的端口我们可以自由的来使用,不要和其他应用程序的端口冲突。
    应用程序可以通过“套接字”向网络发送请求或者应答网络的请求,这时候就把Socket分成了两部分,一部分是服务器端的Socket,这个Socket主要用来接收来自网络的请求,它一直监听在某一个端口上。一部分是客户端的Socket,这个Socket主要用来向网络发送数据。
  二:Socket通讯模型
   22.JPG
    -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:工作流程     11.JPG

    首先有两部分客户端和服务器端,客户端需要Socket这个类的对象,而服务器端需要ServerSocket这个类的对象,由客户端Socket发送一个请求,服务器端的ServerSocket在计算机的某一个端口号上进行监听,监听客户端发送的请求之后,那么客户端和服务器端的一个通讯通道就建立起来了,这时候呢既可以从客户端向服务器端发送数据,服务器端也可以给客户端相应的响应。在客户端发送数据的时候我们需要用到IO流里面的OutputStream,通过这个OutputStream把数据发送给服务器端,服务器端用InputStream来读取客户端当中用OutputStream所写入的数据。生活举例:就像双方男女朋友打电话一样,男孩(客户端)说话(数据)通过听筒发送到电话网络中去,当男孩说话的时候就相当于咱们这里的通过OutputStream向互联网中写入数据,而作为接听的这个女孩(服务器端)那么男孩(客户端)说的内容就是女孩(服务器端)听到的内容,那么就是说服务器端可以通过InputStream把客户端当中通过OutputStream所写入的数据给它读取出来,反之亦然,如果服务器端想向客户端发送数据,那么就使用OutputStream写出数据,在客户端通过InputStream把服务器端当中通过OutputStream所写入的数据给它读取出来。就像打电话一样,你说的就是我听的,你听的就是我说的。  二:通过基于TCP协议发送和读取数据    

1:布局文件main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
     
  2.     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     
  3.         android:orientation="vertical"
     
  4.         android:layout_width="fill_parent"
     
  5.         android:layout_height="fill_parent"
     
  6.        >
     
  7.      <Button
     
  8.         android:layout_width="fill_parent"
     
  9.         android:layout_height="wrap_content"
     
  10.         android:text="启动监听线程"
     
  11.         android:id="@+id/btn1"
     
  12.       />
     
  13.     </LinearLayout>

复制代码

2.1:服务器端Socket代码文件MainActivity.java   

  1.  package com.szy.socket;
  2.       import android.app.Activity;
  3.       import android.os.Bundle;
  4.       import android.util.Log;
  5.       import android.view.View;
  6.       import android.view.View.OnClickListener;
  7.       import android.widget.Button;
  8.       import java.io.IOException;
  9.       import java.io.InputStream;
  10.       import java.net.ServerSocket;
  11.       import java.net.Socket;
  12.       public class MainActivity extends Activity
  13.       {
  14.          private Button btn1 = null;
  15.            @Override
  16.         public void onCreate(Bundle savedInstanceState)
  17.         {
  18.             super.onCreate(savedInstanceState);
  19.             setContentView(R.layout.main);
  20.             btn1 = (Button) findViewById(R.id.btn1);
  21.            //给按钮绑定监听器
  22.             btn1.setOnClickListener(new Btn1Listener());
  23.         }
  24.    
  25.            //按钮监听器
  26.            private class Btn1Listener implements OnClickListener
  27.             {
  28.             @Override
  29.            public void onClick(View v)
  30.             {
  31.                //启动一个线程
  32.                new ServerThread().start();
  33.             }           
  34.            }
  35.   
  36.           //线程类
  37.           private class ServerThread extends Thread
  38.           {
  39.              public void run()
  40.              {      
  41.                //声明一个ServerSocket对象
  42.                  ServerSocket serverSocket = null;
  43.                  try
  44.                {
  45.                    //创建一个ServerSocket对象,并让ServerSocket在4567端口上监听
  46.                    serverSocket = new ServerSocket(4567);
  47.                    //调用 ServerSocket对象的accept()方法接收客户端所发送的请求
  48.                    //accept()这个方法是一个阻塞的方法,如果客户端没有发送请求,那么代码运行到这里被阻塞,停在这里不再向下运行了,一直等待accept()函数的返回,这时候突然客户端发送一个请求,那个这个方法就会返回Socket对象,
  49.                    //Socket对象代表服务器端和客户端之间的一个连接
  50.                    Socket socket = serverSocket.accept();
  51.                    //从Socket对象中得到InputStream对象
  52.                    //一旦通讯管道建立起来后,就是服务器端有一个Socket,客户端也有一个Socket,我们就可以通过服务器端的Socket里面的InputStream来读取客户端所发送的数据
  53.                    InputStream inputStream = socket.getInputStream();
  54.                    byte data[] = new byte[1024*4];
  55.                    int i = 0;
  56.                    //从InputStream对象中读取客户端所发送的数据
  57.                    while((i = inputStream.read(data)) !=1 )  
  58.                       Log.d("mytag",new String(data,0,i));      
  59.               }
  60.                 catch (IOException e)
  61.               {
  62.                 e.printStackTrace();
  63.               }
  64.               finally
  65.                {
  66.                 try
  67.                 {
  68.                    serverSocket.close();
  69.                 }
  70.                 catch (IOException e)
  71.                 {
  72.                    e.printStackTrace();
  73.                 }  
  74.              }
  75.            }
  76.         }
  77.     }

复制代码

2.2:客户端Socket代码文件TcpSocketClient.java 

  1.  package com.szy.socketclient;
  2.       import android.app.Activity;
  3.       import java.net.Socket;
  4.       import java.io.FileInputStream;
  5.       import java.io.InputStream;
  6.       import java.io.OutputStream;
  7.       public class TcpSocketClient extends Activity
  8.       {
  9.         public static void main(String[] args)
  10.         {
  11.              try
  12.             {
  13.                //创建一个Socket对象,指定服务器端的IP地址和端口号
  14.                Socket socket = new Socket("192.168.1.105",4567);
  15.                //使用InputStream对象读取硬盘上的文件
  16.                InputStream inputStream = new FileInputStream("C://www.txt");
  17.                //从Socket对象中得到OutputStream对象,准备往OutputStream对象里写入数据
  18.                OutputStream outputStream = socket.getOutputStream();
  19.                byte data[] = new byte[1024*4];
  20.                int i = 0;   
  21.                while((i = inputStream.read(data)) !=1 )
  22.                   //从InputStream对象中读取数据并写入到 OutputStream对象当中
  23.                   outputStream.write(data, 0, i);
  24.                outputStream.flush();
  25.           }
  26.          catch (Exception e)
  27.           {
  28.              e.printStackTrace();
  29.           }
  30.       }
  31.     }
复制代码



 

公司地址:广州市番禺区亚运东路56号602室 电话:18929558018传真:020-84647115
版权所有:深圳市翡之翠文化传播有限公司 客户邮箱:h91708@163.COM

©2012 粤ICP备12043775号


技术支持:趋向互动
分享按钮