`
George_ghc
  • 浏览: 90768 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android TCP/UDP[转]

阅读更多
什么是TCP?

TCP:Transmission Control Protocol 传输把握和谈TCP是一种面向连接(连接导向)的、靠得住的、基于字节俭的运输层(Transport layer)通信和谈,由IETF的RFC 793申明(specified)。在简化的策画机收集OSI模型中,它完成第四层传输层所指定的功能。应用层向TCP层发送用于网间传输的、用8位字节默示的数据流,然后TCP把数据流分别成恰当长度的报文段(凡是受该策画机连接的收集的数据链路层的最大传送单位(MTU)的限制)。之后TCP把成果包传给IP层,由它来经由过程收集将包传送给接管端实体的TCP层。TCP为了包管不产生丢包,就给每个字节一个序号,同时序号也包管了传送到接管端实体的包的按序接管。然后接管端实体对已成功收到的字节发还一个响应的确认(ACK);若是发送端实体在公道的往返时延(RTT)内未收到确认,那么对应的数据(假设丧失了)将会被重传。TCP用一个校验和函数来查验数据是否有错误;在发送和接管时都要策画校验和。

起首,TCP建树连接之后,通信两边都同时可以进行数据的传输,其次,他是全双工的;在包管靠得住性上,采取超时重传和捎带确认机制。

在流量把握上,采取滑动窗口和谈[1],和谈中规定,对于窗口内未经确认的分组须要重传。

在拥塞把握上,采取慢启动算法。

什么是UDP?

UDP 是User Datagram Protocol的简称, 中文名是用户数据包和谈,是 OSI 参考模型中一种无连接的传输层和谈,供给面向事务的简单不成靠信息传送办事。它是IETF RFC 768是UDP的正式规范。在收集中它与TCP和谈一样用于处理惩罚数据包。在OSI模型中,在第四层——传输层,处于IP和谈的上一层。UDP有不供给数据报分组、组装和不克不及对数据包的排序的毛病,也就是说,当报文发送之后,是无法得知其是否安然完全达到的。 UDP用来支撑那些须要在策画机之间传输数据的收集应用。包含收集视频会议体系在内的浩繁的客户/办事器模式的收集应用都须要应用UDP和谈。UDP和谈从问世至今已经被应用了很多年,固然其最初的名望已经被一些类似和谈所袒护,然则即使是在今天,UDP仍然不失为一项很是实用和可行的收集传输层和谈。

与所熟知的TCP(传输把握和谈)和谈一样,UDP和谈直接位于IP(网际和谈)和谈的顶层。按照OSI(开放体系互连)参考模型,UDP和TCP都属于传输层和谈。

UDP和谈的首要感化是将收集数据流量紧缩成数据报的情势。一个典范的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,残剩字节则用来包含具体的传输数据。

TCP和UDP在android中的应用和在Java里是完全一样的。

起首我们看看TCP连接,下图为TCP连接的一个示意图

是不是很好懂得,这里就不久不多说了,直接看代码吧!实践出真知。

TCP服务器端代码:
try {     
 Boolean endFlag = false;     
 ServerSocket ss = new ServerSocket(12345);     
 while (!endFlag) {     
 // 守候客户端连接     
 Socket s = ss.accept();     
 BufferedReader input = new BufferedReader(newInputStreamReader(s.getInputStream()));     
 //重视第二个参数据为true将会主动flush,不然须要须要手动操纵output.flush()     
 PrintWriter output = newPrintWriter(s.getOutputStream(),true);     
 String message = input.readLine();     
 Log.d("Tcp Demo", "message  Client:"+message);     
 output.println("message received!");     
 //output.flush();     
 if("shutDown".equals(message)){     
                 endFlag=true;     
 }     
                 s.close();     
 }     
 ss.close();     
 
 } catch (UnknownHostException e) {     
                 e.printStackTrace();     
 } catch (IOException e) {     
                 e.printStackTrace();     
 } 

TCP客户端代码:
try {   
        Socket s = new Socket("localhost", 12345);   
        // outgoing stream redirect to socket   
        OutputStream out = s.getOutputStream();   
        // 重视第二个参数据为true将会主动flush,不然须要须要手动操纵out.flush()   
        PrintWriter output = new PrintWriter(out, true);   
        output.println("Hello IdeasAndroid!");   
        BufferedReader input = new BufferedReader(newInputStreamReader(s   
                        .getInputStream()));   
        // read line(s)   
        String message = input.readLine();   
        Log.d("Tcp Demo", "message From Server:" + message);   
        s.close();   

} catch (UnknownHostException e) {   
        e.printStackTrace();   
} catch (IOException e) {   
        e.printStackTrace();   
}

下面我们看看UDP:

UDP办事器端代码:
// UDP服务器监听的端口   
Integer port = 12345;   
// 接管的字节大小,客户端发送的数据不克不及跨越这个大小   
byte[] message = new byte[1024];   
try {   
        // 建树Socket连接   
        DatagramSocket datagramSocket = new DatagramSocket(port);   
        DatagramPacket datagramPacket = new DatagramPacket(message,   
                        message.length);   
        try {   
                while (true) {   
                        // 筹办接管数据   
                        datagramSocket.receive(datagramPacket);   
                        Log.d("UDP Demo", datagramPacket.getAddress()   
                                        .getHostAddress().toString()   
                                        + ":" + new String(datagramPacket.getData()));   
                }   
        } catch (IOException e) {   
                e.printStackTrace();   
        }   
} catch (SocketException e) {   
        e.printStackTrace();   
} 

UDP客户端代码:
public static void send(String message) {   
        message = (message == null ? "Hello IdeasAndroid!" : message);   
        int server_port = 12345;   
        DatagramSocket s = null;   
        try {   
                s = new DatagramSocket();   
        } catch (SocketException e) {   
                e.printStackTrace();   
        }   
        InetAddress local = null;   
        try {   
                // 换成办事器端IP   
                local = InetAddress.getByName("localhost");   
        } catch (UnknownHostException e) {   
                e.printStackTrace();   
        }   
        int msg_length = message.length();   
        byte[] messagemessageByte = message.getBytes();   
        DatagramPacket p = new DatagramPacket(messageByte, msg_length, local,   
                        server_port);   
        try {   
                s.send(p);   
        } catch (IOException e) {   
                e.printStackTrace();   
        }   
}
  • 大小: 19.6 KB
  • 大小: 26.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics