黑马程序员_关于网络编程的学习

---------------------- android培训java培训、期待与您交流! ----------------------

看完创智博客老师关于网络编程的视频,有如下的一些总结:

关于UDP与TCP的几点心得

被大家都知道UDP是Connectionless oriented. TCP是Conenction Oriented

UDP的包头只有源端口,目标端口,包长度,校验位。也就是说,UDP只需要把包发出去即可,不需要建立连接,关闭连接。不关心对方是否收到。

而TCP的包头则比较复杂,有许多控制位,TCP需要建立连接,按顺序发送数据包,接收方需要向发送方确认数据包收到,当然确认消息可以跟数据发送合并(打开SYN,ACK控制位即可)。TCP具有超时重传等机制。

另外TCP的包头没有长度字段,TCP封装在IP包里,应该就是IP包的数据部分的长度-TCP包头的长度=TCP数据长度

UDP的数据长度用16bit表示,那么最大就是64K。IP包的长度用32bit表示,TCP的包头最多几十个字节。因此TCP包的最大长度基本为UDP包的2倍了。

UDP的优点:速度快  缺点:网络较差的时候容易丢消息。

TCP的优点:数据传输可靠  缺点:建立连接,确认包,速度比较慢。

适合应用UDP的场合:比如局域网内的消息传送,DNS协议,RTP类协议(用于实时传送的,比如看网络电视,如果网络较差的话,总不能因为一个包丢失了一直在那儿等,得继续往下收发,中间缺少的包可以通过插值的方式近似计算出来)等

适合TCP的场合:UDP不适合的场合应该都是TCP的天下啦。比如HTTP,FTP等,你总不能看个网页中间缺了内容,FTP下载的数据不完整,对吧。

用UDP的方式发送一段文字的思路如下

   1  建立udpsocket服务。

    2  提供数据,并将数据封装到数据包中。

   3   通过socket服务的发送功能将数据发送出去。

  4      关闭资源。

 

需求:定义一个应用程序,用于接受udp协议传输的数据并处理。

    思路

      1 定义 udpsocket服务,通常会监听一个端口,其实就是给这个接受网络应用程序定义数字标识方便于明确那些数据过来该用程序可以处理。

      2 定义一个数据包,因为要存储接受到的字节数据,因为数据包对象中有更多的功能可以提取字节数据不同的数据信息。

     3 通过socket服务的receive方法将收到的数据存入已经定义好的数据中。

    4 通过数据包对象特有的功能,将这些不同的数据取出来,打印在控制台上。

    5 关闭资源。

 

tcp传输

  1  tcp分为客户端和服务端

  2  客户端对应的对象是socket,服务端对应的对象是serversocket

 

客户端

  通过查阅socket对象,发现在该对象建立时就可以去连接指定主机,因为tcp是面向连接的,所以在建立socket服务时,就要有服务端存在,并连接成功,形成通路后,在该通道进行数据的传输。

 

服务端

1 建立服务端的socket服务,通过serversocket(),并监听一个端口。

 2 获取连接过来的客户端对象通过serversocket的accept方法,因为这个方法是阻塞的,没有连接成功就会等待。

3 客户端如果发送来数据,那么服务端要使用客户端对象,并获取到该对象的读取流来读取发送过来的数据。

 

tcp的传输,客户端和服务端的互访。

   需求:客户端给服务端发送数据,服务端收到后给客户端反馈信息。

        客户端

      1  建立socket服务,指定要连接的主机端口。

    2  获取socket流中输出流,将数据写到该流中通过网络发送数据端。

   3  获取socket流中的的输入流,将服务端反馈的数据获取并打印。

  4  关闭客户端资源。

用java写一个ie代码的实例

 

import javax.swing.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;

public class iexplorer extends JFrame {
 JEditorPane editorPane;
 JLabel label;
 JTextField url;
 File file;
 String str;
 JButton btn;
  
 private class urlKeyListener implements KeyListener
 {
  public void keyPressed(KeyEvent e)
  {
   if(e.getKeyChar()=='\n')
   {
    if(url.getText().startsWith("http://"))
    {
     try{
      editorPane.setPage(url.getText());
      editorPane.setEditable(false);
      
     }
     catch(Exception em)
     {
      em.printStackTrace();
     }
    }
    else
     url.setText("你输入的网址不确");
   }
  }
  public void keyReleased(KeyEvent e)
  {
   
  }
 
 public void keyTyped(KeyEvent e)
 {
  
 }
 }
 public class btnActionListener implements ActionListener
 {
  public void actionPerformed(ActionEvent e)
  {
   try
   {
    editorPane.setPage(url.getText());
    editorPane.setEditable(false);
    
   }
   catch(Exception em)
   {
    em.printStackTrace();
   }
  }
 }
 
 
 public iexplorer()
 {
  this.setTitle("java 浏览器");
  editorPane=new JEditorPane();
  label=new JLabel("URL");
  editorPane.setContentType("text/html");
  url=new JTextField(30);
  url.addKeyListener(new urlKeyListener());
  btn=new JButton("Go");
  btn.addActionListener(new btnActionListener());
  JPanel pnl=new JPanel();
  pnl.add(label,BorderLayout.WEST);
  pnl.add(url,BorderLayout.CENTER);
  pnl.add(btn,BorderLayout.EAST);
  this.getContentPane().add(pnl,BorderLayout.NORTH);
  editorPane.addHyperlinkListener(new HyperlinkListener(){
   public void hyperlinkUpdate(HyperlinkEvent e)
   {
    try{
     if(e.getEventType()==HyperlinkEvent.EventType.ACTIVATED)
      editorPane.setPage(e.getURL());
    }catch(Exception em)
    {
     em.printStackTrace(System.err);
    }
   }
   
  });
  this.setSize(1000,1000);
  JScrollPane scrollPane=new JScrollPane();
  editorPane.setBackground(Color.WHITE);
  scrollPane.setViewportView(editorPane);
  this.getContentPane().add(scrollPane,BorderLayout.CENTER);
  this.setVisible(true);
 }
 public static void main(String[]args)
 {
  new iexplorer();
 }
}

 

 

 

 

 

 

 

---------------------- android培训java培训、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值