zoukankan      html  css  js  c++  java
  • Android 学习 笔记_10. Socket 编程

    1、Socket是一种网络通信的接口。称“套接字”,用于描述IP地址和端口,是一个通信链的句柄。

         应用程序通常通过“套接字”向网络发出请求或者应答网络请求,分为服务器端请求和客户端请求。

    2、Socket的通信模型

           

    UDP:发送后就不管结果,一个数据包发送是有限的;速度快

    TCP:发送数据要求接收方接受到数据后给回应,且无限制的;速度慢

                         

     main.xml

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     tools:context=".SocketActivity" >
     6 
     7     <Button
     8         android:layout_width="fill_parent"
     9         android:layout_height="wrap_content"
    10         android:layout_centerHorizontal="true"
    11         android:layout_centerVertical="true"
    12         android:id="@+id/start"
    13         android:text="@string/start" />
    14 
    15 </RelativeLayout>

    SocketActivity.java

     1 package zzl.socket_main;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.net.DatagramPacket;
     6 import java.net.DatagramSocket;
     7 import java.net.ServerSocket;
     8 import java.net.Socket;
     9 
    10 import android.app.Activity;
    11 import android.os.Bundle;
    12 import android.view.Menu;
    13 import android.view.View;
    14 import android.view.View.OnClickListener;
    15 import android.widget.Button;
    16 
    17 public class SocketActivity extends Activity {
    18 
    19     private Button start=null;
    20     @Override
    21     protected void onCreate(Bundle savedInstanceState) {
    22         super.onCreate(savedInstanceState);
    23         setContentView(R.layout.main);
    24         
    25         start=(Button)findViewById(R.id.start);
    26         start.setOnClickListener(new StartSocketListener());
    27     }
    28 
    29     class StartSocketListener implements OnClickListener{
    30 
    31         @Override
    32         public void onClick(View v) {
    33             // TODO Auto-generated method stub
    34             //启动一个线程
    35             new ServerThread().start();
    36         }
    37     }
    38     class ServerThread extends Thread{
    39         /*public void run(){
    40             //声明一个ServerSocket对象
    41             ServerSocket serverSocket=null;
    42             try{
    43                 //创建一个ServerSocket对象,
    44                 //并让这个Socket在4567端口监听
    45                  serverSocket =new ServerSocket(4567);
    46                  //调用ServerSocket的accept方法,接收客户端所发送的请求
    47                 //阻塞方法:如果客户端没有发送请求,则阻塞,否则返回Socket对象
    48                  Socket socket =serverSocket.accept();
    49                  
    50                  //从Socket当中得到InputStream对象
    51                  //通过InputStream来传递数据
    52                  InputStream inputStream=socket.getInputStream();
    53                  byte buffer[]=new byte[1024*4];
    54                  int temp=0;
    55                  while ((temp=inputStream.read(buffer))!=-1){
    56                      System.out.println(new String(buffer,0,temp));
    57                  }
    58             }catch(IOException e){
    59                 e.printStackTrace();
    60             }//最后记得把serverSocket给关掉
    61             finally{
    62                 try{
    63                     serverSocket.close();
    64                 }catch(IOException e){
    65                     e.printStackTrace();
    66                 }
    67             }
    68         }*/
    69     
    70     public void run(){
    71       try{
    72         //创建一个DatagramSocket对象,并指定监听的端口号
    73         DatagramSocket socket =new DatagramSocket(4567);
    74         byte data[]=new byte[1024];
    75         //创建一个空的DatagramPacket对象
    76         DatagramPacket packer=new DatagramPacket(data, data.length);
    77         //使用receive方法接收客户端所发送的数据
    78         socket.receive(packer);
    79         String result=new String(packer.getData());
    80         System.out.println("result--->"+result);
    81         }catch(IOException e){
    82             e.printStackTrace();
    83         }
    84     }
    85     
    86     }
    87     @Override
    88     public boolean onCreateOptionsMenu(Menu menu) {
    89         // Inflate the menu; this adds items to the action bar if it is present.
    90         getMenuInflater().inflate(R.menu.main, menu);
    91         return true;
    92     }
    93 
    94 }

    TCPCLient.java

     1 package zzl.socket_client;
     2 
     3 import java.io.FileInputStream;
     4 import java.io.IOException;
     5 import java.io.InputStream;
     6 import java.io.OutputStream;
     7 import java.net.Socket;
     8 
     9 import android.app.Activity;
    10 
    11 public class TCPClient extends Activity {
    12     public static void main(String[] arge){
    13         try{
    14             //创建一个SOCket对象,指定服务器端的IP地址和端口号
    15             Socket socket =new Socket("192",4567);
    16             //使用inputStream读取硬盘上的文件
    17             InputStream inputStream=new FileInputStream("f://file"); 
    18             //从Socket当当中得到OutputStream
    19             OutputStream outputStream=socket.getOutputStream();
    20             byte buffer []=new byte[4*1024];
    21             int temp=0;
    22             //从inputStream发送出来,传送到outputStream
    23             while((temp=inputStream.read())!=-1){
    24                 outputStream.write(buffer,0,temp);
    25             }
    26             outputStream.flush();
    27         }catch(IOException e){
    28             e.printStackTrace();
    29         }
    30     }
    31     
    32 }

    UDPClient.java

     1 package zzl.socket_client;
     2 
     3 import java.io.IOException;
     4 import java.net.DatagramPacket;
     5 import java.net.DatagramSocket;
     6 import java.net.InetAddress;
     7 
     8 public class UDPClient {
     9     public static void main(String[] arge){
    10         try{
    11             //创建一个DatagramSocket对象
    12             DatagramSocket socket =new DatagramSocket(4567);
    13             //创建一个InetAddress:要发送的地址
    14             InetAddress serverAddress=InetAddress.getByName("192"); 
    15             String str="hello";
    16             byte data []=str.getBytes();
    17             //创建一个DatagramPacket对象,并自定要将这个数据包发送到网络当中的哪个地址以及端口号:发送数据对象
    18             DatagramPacket packer=new DatagramPacket(data,data.length,serverAddress,4567);
    19             //调用Socket对象的send方法发送数据
    20             socket.send(packer);
    21         }catch(IOException e){
    22             e.printStackTrace();
    23         }
    24     }
    25     
    26 }

    总结:

       (1、客户端和服务端是两个不同的项目,而且这个程序需要在手机上实时测试的。

       (2、还是存在着一些问题,需要好好再了解一下

  • 相关阅读:
    如何使用VS2013进行单元测试和查看代码覆盖率
    荔枝架构演进历程读后感
    关于海尔电商峰值系统架构读后感
    苏宁易购:商品详情系统架构设计读后感
    第二阶段冲刺第四天
    第二阶段冲刺第五天
    第二阶段冲刺第三天
    第二阶段冲刺第二天
    第二阶段冲刺第一天
    第一阶段末尾
  • 原文地址:https://www.cnblogs.com/daomul/p/2936717.html
Copyright © 2011-2022 走看看