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