黑马程序员技术交流社区

标题: JAVA 总结之 UDP和TCP (黑马考试) [打印本页]

作者: 狂飙的yellow.co    时间: 2013-6-1 13:48
标题: JAVA 总结之 UDP和TCP (黑马考试)
我总结了TCP和UDP的要点,希望能个大家学习提供方便
---------------------------------------------------------------潇洒的分割线----------------------------------------------------------------
UDP传输特点

UDP 是无连接的,即发送数据之前不需要建立连接

UDP 使用尽最大努力交付,即不保证可靠交付,同时也不使用拥塞控制

UDP 是面向报文的.UDP 没有拥塞控制,很适合多媒体通信的要求

UDP 支持一对一、一对多、多对一和多对多的交互通信

UDP 的首部开销小,只有 8 个字节

---------------------------------------------------------------潇洒的分割线----------------------------------------------------------------

发送端(客户端):

  1. package UDPStudy;

  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. import java.net.SocketException;

  6. public class UDPSendDemo {

  7.         /**
  8.          * @param args
  9.          * @throws Exception
  10.          */
  11.         public static void main(String[] args) throws Exception {
  12.                 /*
  13.                  * 创建UDP传输的发送端
  14.                  * 1.建立Socket服务
  15.                  * 2.将要发送的数据分装到数据包中
  16.                  * 3.通过UDP的Socket服务,将数据发送出去
  17.                  * 4.关闭Socket服务
  18.                  */
  19.                 System.out.println("客户端启动");
  20.                 //1.建立UDP服务,使用DatagramSocket
  21.                 DatagramSocket ds = new DatagramSocket();
  22.                
  23.                 //2.将要发送的数据封装到数据包中
  24.                 String str = "我是黑马";
  25.                 //使用DatagramPack 将数据打包到文件中
  26.                 byte [] buf = str.getBytes();
  27.                 //其中new DatagramPacket(数组, 长度,地址,端口号);
  28.                 DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("127.168.1.1"),10000);
  29.                
  30.                 //3.发送数据,通过UDP中国的send方法,将数据发送出去
  31.                 ds.send(dp);
  32.                
  33.                 //4.关闭资源
  34.                 ds.close();
  35.                 System.out.println("客户端关闭");
  36.         }

  37. }
复制代码
---------------------------------------------------------------潇洒的分割线----------------------------------------------------------------
服务端
  1. package UDPStudy;

  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;

  4. public class UDPResiveDemo {

  5.         /**
  6.          * @param args
  7.          */
  8.         public static void main(String[] args) throws Exception {
  9.                 /*
  10.                  * 建立UDP接收端的思路
  11.                  * 1.建立UDPSocket 其中一定要明确数据的端口
  12.                  * 2.创建数据包来接受数据,同时方便解析数据
  13.                  * 3.通过SOcket方法中的 receive方法接收,写入到数据包中
  14.                  * 4.通过对数据的分析
  15.                  * 5.关闭资源
  16.                  */
  17.                
  18.                 System.out.println("接收端启动");
  19.                
  20.                 //1.建立UDP SOcker 系统服务,其中一定要传入端口号
  21.                 DatagramSocket ds = new DatagramSocket(10000);
  22.                
  23.                 //2.建立数据包
  24.                 byte [] buf = new byte [1024] ;
  25.                 DatagramPacket dp = new DatagramPacket(buf, buf.length);

  26.                 //3.通过Socket中的receive方法将数据写入
  27.                 ds.receive(dp);//这个方法是闭塞式的,所以一定要注意
  28.                
  29.                 //获取客户端的Ip
  30.                 String ip = dp.getAddress().getHostAddress();//获取IP
  31.                 int port = dp.getPort();//获取端口
  32.                
  33.                
  34.                
  35.                 //4.解析数据,其中一定要重点的注意数据的解析的是datagrampacket
  36.                 String str = new String(dp.getData(),0,dp.getLength());
  37.                 //将端口数据打印
  38.                 System.out.println(ip+port);
  39.                 //打印数据
  40.                 System.out.println(str);
  41.                
  42.                 //5.关闭资源
  43.                 ds.close();
  44.                
  45.         }

  46. }
复制代码
TCP传输特点:
       (1)面向连接的传输;     (传输数据之前,使用TCP进行通信的双方,必须通过建立逻辑链接)
       (2)端到端的通信;         (端口到端口的通信,端口是用来标志应用程序的)
       (3)高可靠性,确保传输数据的正确性,不出现丢失或乱序;   
                   (TCP对数据封装称报文段, 并做了编号,IP协议会出现乱序,IP协议只是尽最大可能将数据发送出去。TCP会对乱序数据进行重新排序,在提交给应用层的协议)
       (4)全双工方式传输;   
      (5)采用字节流方式,即以字节为单位传输字节序列;   
      (6)紧急数据传送功能。

---------------------------------------------------------------潇洒的分割线----------------------------------------------------------------
发送端:
  1. package TCPStudy;

  2. import java.io.IOException;
  3. import java.io.OutputStream;
  4. import java.net.Socket;
  5. import java.net.UnknownHostException;

  6. public class TCPSend {

  7.         /**
  8.          * @param args
  9.          * @throws IOException
  10.          * @throws UnknownHostException
  11.          */
  12.         public static void main(String[] args) throws UnknownHostException, IOException {
  13.                 /*
  14.                  * 建立TCP的客户端
  15.                  * 1.创建TCP的Socket服务,和UDP不同的是使用的Socket对象,建立的时候就明确了主机
  16.                  * 2.如果建立连接成功,说明创术通道建立
  17.                  *   该通道时Socket流,是地城建立好的连接,既然是流,有流的输入和输出
  18.                  * 3.使用输出流,将数据写出
  19.                  * 4.关闭资源
  20.                  */
  21.                
  22.                 System.out.println("客户端启动");
  23.                
  24.                 //1.建立Socket服务
  25.                 Socket socket = new Socket("127.168.1.1", 10000);
  26.                
  27.                 //2.获取输出流
  28.                 OutputStream out = socket.getOutputStream();
  29.                
  30.                 //3.数据写出,其中的数据必须是字节流,可以通过getByte() 方法获取字节
  31.                 out.write("我是黑马".getBytes());
  32.                
  33.                 //4.关闭资源
  34.                 socket.close();
  35.                
  36.                 System.out.println("客户端关闭");
  37.         }

  38. }
复制代码
接收端:
  1. package TCPStudy;

  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.net.ServerSocket;
  5. import java.net.Socket;

  6. public class TCPReceive {

  7.         /**
  8.          * @param args
  9.          * @throws IOException
  10.          */
  11.         public static void main(String[] args) throws IOException {
  12.                 /*
  13.                  * 建立TCP服务端的思路
  14.                  * 1.建立TCP的Socket服务,通过ServerSocket服务
  15.                  * 2.服务端需要提供端口
  16.                  * 3.获取客户端对象
  17.                  * 4.通过客户端对象获取socket流读取数据
  18.                  * 5.关闭资源
  19.                  */

  20.                 System.out.println("服务端启动");
  21.                
  22.                 //1.通过ServerSocket,建立SOcket服务
  23.                 ServerSocket server = new ServerSocket(10000);
  24.                
  25.                 //2.获取Socket,其中通过的是ServeiceSocket中的accept方法,这个必须记住
  26.                 Socket socker = server.accept();
  27.                
  28.                 //获取Ip
  29.                 String ip = socker.getInetAddress().getHostName();
  30.                
  31.                 //3.获取输入流
  32.                 InputStream in = socker.getInputStream();
  33.                
  34.                 //4.处理数据
  35.                 byte buf [] = new byte [1024];
  36.                 int len = in.read(buf);//其中读取的是字符的长度
  37.                
  38.                 String str = new String(buf,0,len);
  39.                 System.out.println(str);
  40.                
  41.                 System.out.println("\n客户端IP:"+ip);
  42.                 //关闭资源
  43.                 server.close();
  44.                 in.close();
  45.         }

  46. }
复制代码

作者: 狂飙的yellow.co    时间: 2013-6-1 13:50
先自己给自己顶一下。。。。。。。然后谢谢老师。。。。。。。。
作者: 李征    时间: 2013-6-1 15:16
辛苦了,我转我空间去了,好东西!
作者: 狂飙的yellow.co    时间: 2013-6-1 15:27
老师。。。。。。。。。。。。。。。。大人。。。。。。。。。。。。。。。。。。。。。。您看看是不是该。。。。。。。。。。。。。。。。。。。。。。。。。给点技术分啊
作者: 北极雪871208    时间: 2014-3-29 15:24
好东西!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2