Android 中的Socket通讯机制

Android中的网络通讯无非Http和Socket,Socket有两种形式——TCP和UDP。

TCP与UDP区别

TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

下面通过一个简单的例子介绍一下两种形式的客户端**。**

1Socket socket = new Socket("192.168.3.119",7628);//创建Socket实例,并绑定连接远端IP地址和端口 2 3OutputStream ops = socket.getOutputStream();//定义一个输出流,来自于Socket输出流 4   5byte[] bytes = b.getBytes(); 6        7ops.write(bytes);//向输出流中写入数据 8 9ops.flush();//刷行输出流 10 11//至此,在连接成功的情况下,服务端应该就能收到发送过去的流了。 12 13 14//接下来是接收服务器发送过来的数据 15InputStream ips = socket.getInputStream();//定义输入流,来自于socket的输入流 16 17byte[] bytes2 = new byte[20]; 18 19ips.read(bytes2);//读取输入流数据 20   21String str = new String(bytes2);//转换成字符串 22 23btn.setText(str);//显示出来(我是现实在button上,当然,这个方法不正规,不过可以让我少放点空间,看上去界面干净点,只要能看到效果就行) 24 25socket.close();

接下来是UDP的

1 DatagramSocket dgs = new DatagramSocket();//建立一个Socket,这个Socket将作为一个发送器,将Socket包发送出去 2     3InetAddress inet = InetAddress.getByName("192.168.3.119");//创建一个InetAddress,ip地址为要发动到的远端的服务器IP 4     5DatagramPacket dgp = new DatagramPacket("test2".getBytes(), "test2".getBytes().length,inet,7628);//创建一个UDP数据包,数据包包含远端的IP地址及端口 6     7dgs.send(dgp);//发送     8    9dgs.close(); 10     11     12DatagramSocket dgs2 = new DatagramSocket(9997);//创建另一个UDPSocket, 13     14DatagramPacket dgp2 = new DatagramPacket(new byte[20],20); //创建一个空报文包 15dgs2.receive(dgp2);//接收数据并填充到报文包中 16     17String str = new String(dgp2.getData());//获取报文包里的数据并转换成字符串 18     19btn.setText(str);//显示获得的数据 20     21dgs2.close();//关闭Socket

需要特别注意的地方,在不做端口映射的情况下,UDP可能无法接受到服务器端发送过来的数据,原因是使用eclipse开发的时候,调试程序是用的模拟环境,模拟环境下,接收数据是要做端口映射的,因为模拟环境下,没有自己真实的IP地址和端口,模拟器是使用5554来运行的,发送数据到PC没问题,但是 PC发送到模拟器的时候,需要把本机的端口映射到模拟器上,真机环境不需要,具体操作方式如下

1、运行模拟器
2、打开DOS命令行窗口
    执行:telnet localhost 5554
   5554是模拟器的端口,执行之后会进入android console
3、 在console下执行:
   redir add udp :8000:9000
   其中,第一个端口号是PC的端口,第二个端口号是模拟器端口。
   执行此命令之后,会把PC 8000端口接收到的数据转到模拟器的9000端口,模拟器就能从9000端口接收UDP数据包了

另外,要实现Socket,必须在 AndroidManifest.xml 中加入权限如下

1

<``uses-permission android:name``=``"android.permission.INTERNET" />

服务器端:

1import java.net.DatagramPacket; 2import java.net.DatagramSocket; 3import android.app.Activity; 4import android.os.Bundle; 5import android.view.View; 6import android.view.View.OnClickListener; 7import android.widget.Button; 8public class SocketActivity extends Activity { 9    /** Called when the activity is first created. */ 10 private Button startButton = null; 11    @Override 12    public void onCreate(Bundle savedInstanceState) { 13        super.onCreate(savedInstanceState); 14        setContentView(R.layout.main); 15        startButton = (Button)findViewById(R.id.startListener); 16        startButton.setOnClickListener(new StartSocketListener()); 17    } 18     19    class StartSocketListener implements OnClickListener{ 20  @Override 21  public void onClick(View v) { 22   new ServerThread().start(); 23  } 24      25    } 26     27    class ServerThread extends Thread{ 28     /*public void run(){ 29      //声明一个ServerSocket对象 30      ServerSocket serverSocket = null; 31      try { 32       //创建一个ServerSocket对象,并让这个Socket在7628端口监听 33    serverSocket = new ServerSocket(7628); 34    //调用ServerSocket的accept()方法,接受客户端所发送的请求 35    Socket socket = serverSocket.accept(); 36    //从Socket当中得到InputStream对象 37    InputStream inputStream = socket.getInputStream(); 38    byte buffer [] = new byte[1024*4]; 39    int temp = 0; 40    //从InputStream当中读取客户端所发送的数据 41    while((temp = inputStream.read(buffer)) != -1){ 42     System.out.println(new String(buffer,0,temp)); 43    } 44   } catch (IOException e) { 45    // TODO Auto-generated catch block 46    e.printStackTrace(); 47   } 48   finally{ 49    try { 50     serverSocket.close(); 51    } catch (IOException e) { 52     // TODO Auto-generated catch block 53     e.printStackTrace(); 54    } 55   } 56   57     }*/ 58     public void run(){ 59      try { 60       //创建一个DatagramSocket对象,并指定监听的端口号 61    DatagramSocket socket = new DatagramSocket(7628); 62    byte data [] = new byte[1024]; 63    //创建一个空的DatagramPacket对象 64    DatagramPacket packet = new DatagramPacket(data,data.length); 65    //使用receive方法接收客户端所发送的数据 66    socket.receive(packet); 67    String result = new String(packet.getData(),packet.getOffset(),packet.getLength()); 68    System.out.println("result--->" + result); 69   } catch (Exception e) { 70    // TODO Auto-generated catch block 71    e.printStackTrace(); 72   } 73     } 74    } 75}
点赞
收藏

评论区

加载中...

相关推荐

java学习 网络编程 tcp

有客户端和服务端,使用tcp传输day26 27//客户端发数据到服务端/\\Tcp传输,客户端建立的过程。\1,创建tcp客户端socket服务。使用的是Socket对象。\建议该对象一创建就明确目的地。要连接的主机。\2,如果连接建立成功,说明数据传输通道已建立。\该通道就是socket流

TCP面试题之滑动窗口原理

TCP滑动窗口作用:1.提供TCP可靠性:对发送的数据进行确认2.流量控制:窗口大小随链路变化一、TCP窗口机制TCP中窗口大小是指tcp协议一次传输多少个数据。因为TCP是一个面向连接的可靠的传输协议,既然是可靠的就需要传输的数据进行确认。TCP窗口机制有两种,一种是

TCP&UDP&Socket讲解(上)

这两天我将整理TCP&UDP&Socket,大约花大家1015分钟之间,希望本篇文章让大家对TCP使用的理解提高一个层次。 建议大家拿出纸和笔,画一下!!!一、TCP1\.TCP位于传输层,英语全称为TransmissionControlProtocol,又名传输控制协议;UDP英语全称为UserDatagramProtoc

TCP UDP有什么区别

前言计算机分层中的传输层,主要是负责计算机之间的数据传输,TCP和UDP都属于传输层协议。在实际开发过程中,需要根据实际需求的来选择适当的传输协议。在这里我们简单总结下TCP、UDP的特点和区别以及实际开发中如何选择。TCP和UDP的定义TCP是面向有连接,可靠的流协议。保证两端通讯主机之间

MQTT,CoAP,,LWM2M,UDP,TCP各自特点,NB

UDP用户数据报协议(UDP,UserDatagramProtocol)传输层协议1.是无连接的,即发送数据之前不需要建立连接。2.尽最大努力交付,即不保证可靠交付3.传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。4.支持一对一,一对多,多对一和多对多的交互通信。TCP传输控制协议(TCP,Transmis

TCP协议的Socket应用

核心知识点:1、TCP协议是一种面向连接的保证可靠传输的协议,通过TCP协议,得到的是一个顺序的无差错的数据流。2、java.net.Socket使用最多的3个方法:accept、getInputStream、getOutputStream;3、对于一个功能齐全的Socket,都要包含以下基本结构,工程过程包含4个步骤:1.创建Soc