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、还是存在着一些问题,需要好好再了解一下

posted @ 2013-03-05 00:45  daomul  阅读(1450)  评论(1编辑  收藏  举报