zoukankan      html  css  js  c++  java
  • Android深入浅出系列之Socket—Socket编程(二)

      这篇博文介绍基于TCP协议来进行数据的发送,通常用于发送文件采用这种方式。

      一:TCP协议通讯模型

        1:工作流程

        

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

      二:通过基于TCP协议发送和读取数据

        1:布局文件main.xml

        <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
           >
         <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="启动监听线程"
            android:id="@+id/btn1"
          />
        </LinearLayout>

        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();
              }
           }
        }

       这样就等于把http://www.txt/这个文件通过网络发送给服务器端了,服务器端就可以接收到数据了

  • 相关阅读:
    Java 使用Calendar类输出指定年份和月份的日历
    ioc aop
    多线程下单例模式:懒加载(延迟加载)和即时加载
    Java生产环境下性能监控与调优详解
    springboot + zipkin + mysql
    springboot + zipkin(brave-okhttp实现)
    springboot启动方式
    OpenResty实现限流的几种方式
    RocketMQ核心技术精讲与高并发抗压实战
    codis 使用
  • 原文地址:https://www.cnblogs.com/menglin2010/p/2241045.html
Copyright © 2011-2022 走看看