`
magicxin
  • 浏览: 16808 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

TCP与UDP

    博客分类:
  • Java
阅读更多
1、Socket编程客户端的主要步骤
1) 客户端提供主机地址和端口号使用socket端口建立连接,得到DataOutputStream和DataInputStream。
2) 创建Socket(stocket=ip+端口),new Socket(Server ip,Server port)试图连接,如成功才有对象
3) 调用socket.getInputStream,socket.getOutputStream获得服务器端的IO流
4) 用处理流封装后与客户端交互,原则(你读我写,一读一写)
6) 关闭IO流,socket。
? Socket编程服务器端的主要步骤
1) 服务器分配一个端口号,服务器使用accept()方法等待客户端的信号,信号一到打开socket连接,从socket中取得OutputStream和InputStream。
2) new ServerSocket(ServerSocket的功能:等待客户端的连接 ),打开端口
3) 调ServerSocket.accept等待客户连接,当连接成功返回交互的Socket
4) 调用socket.getInputStream,socket.getOutputStream获得服务器端的IO流
5) 用处理流封装后与客户端交互,原则(你读我写,一读一写)
6) 关闭单一客户调socket.close(),关闭服务器调ServerSocket.close()

2、说明TCP和UDP编程的主要差异和特点。
(1)TCP(Transmission Control Protocol,传输控制协议)
UDP(User Data Protocol,用户数据报协议)
(2)最主要区别-传输可靠性,TCP可靠而UDP不可靠。真正交由网路传送的IP封包是有一定的体积限制的( IP封包的最大体积为65536 bytes )。 由于UDP不需要可靠传输,因此相较于TCP来说,一大堆必需占据封包表头的over head都可省略,从而换取更大的payroll空间。 这样的结果,将令到单一的IP封包在作UDP连线时所携载的资料要比TCP连线多更多。 这是靠牺牲可靠性而换取得来的
(3)TCP提供的是一个连线导向(Connection Oriented)的可靠传输﹐而UDP则是一个非连线型(Connectionless)的非可靠传输。
(4)应用场合,对于某些讯息量较大、时效性大于可靠性的传输来说(比方说语音/影像),UDP的确是个不错的选择。
(5)从速度上说,UDP比TCP快,UDP不需要运用确认机制来保证资料是否正确的被接收、不需要重传遗失的资料、资料的接收可不必按顺序进行、也不提供回传机制来控制资料流的速度。


3、UDP:DatagramPacket(byte[] buf, int length)
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
        DatagramPacket(byte[] buf, int length, SocketAddress address)
new InetSocketAddress("127.0.0.1",int port),表示这个包要发送到哪里,要知道destination的IP和端口,注意这个端口要与dest的端口一致,否则数据报无法知道要传送的地方。
DatagramSocket(int port)表示在本地机器上与目的机器通信的端口,与目的机器的端口无关,可以随意设置。也可以不写。
发:
byte buffer[] = out_message.getText().trim().getBytes();
   try {
    InetAddress address = InetAddress.getByName("localhost");
    // 数据包的目标端口是666(那么收方(上海)需在这个端口接收):
    DatagramPacket data_pack = new DatagramPacket(buffer,
      buffer.length, address, 666);
    DatagramSocket mail_data = new DatagramSocket();
    in_message.append("数据报目标主机地址:" + data_pack.getAddress() + "\n");
    in_message.append("数据报目标端口是:" + data_pack.getPort() + "\n");
    in_message.append("数据报长度:" + data_pack.getLength() + "\n");
    mail_data.send(data_pack);
   } catch (Exception e) {
   }

收:
DatagramSocket mail_data = null;
   try {
    mail_data = new DatagramSocket(666);
   } catch (Exception e) {
   }
   while (true) {
    if (mail_data == null)
     break;
    else
     try {
      mail_data.receive(pack);
      int length = pack.getLength();
      InetAddress addr = pack.getAddress();
      int port = pack.getPort();
      String message = new String(pack.getData(), 0, length);
      in_msg.append("收到数据长度:" + length + "\n");
      in_msg.append("收到数据来自:" + addr + "端口是:" + port + "\n");
      in_msg.append("收到数据是:" + message + "\n");
     } catch (Exception e) {
     }
   }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics