黑马程序员-网络编程

    ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


网络编程知识学习框架:

          1, 网络通讯基本知识。

          2, 基本API:InetAddress,DatagramSocket, DatagramPacket,Socket,ServerSocket.

          3., 用UDP协议和TCP协议进行编程。

          4, URL和URLConnection知识及其它。

 

具体知识点:

1 基本知识。

         通讯基本要素: IP地址,逻辑端口,传输协议

               IP包括IPV4和IPV6两种,IPV4公网IP地址已不够用。IPV6够用但是IPV6还没应用。

               127.0.0.1本地默认IP。主机名locahost
               端口范围0-65535.0-1024一般系统用,用于标识网络应用程序(逻辑端口)
               协议:通用TCP,UDP(特殊组织或机构有自己的通讯协议)

       UDP协议(类似写信) 特点: (容易掉包)
            1),将数据,源,目的封装成数据包中
            2),每个数据包,限制64K内,
            3),无连接,不可靠。
            4),不需要建立连接,速度块

       TCP(类似打电话)特点:
             1),建立连接,形成传输数据的通道
             2),大数据传输
             3),通过3次握手完成连接,可靠协议(在不在,在了,知道你在了)
             4),必须建立连接,效率稍低

       Socket
             1), 为网络服务提供的一种机制。
             2),通信两端都有Socket
             3), 网络通信其实都是socket通信
             4),数据在2个Socket间通过io传输

 

2.1 IP地址类InetAddress

               特点:此类无构造。获取对象需要用方法:static getByName(String host)返回指定的主机对象

               常用方法:static getByName(String host)

                                String getHostName(), 获取主机名

                                String getHostAddress()获取主机的IP地址字符串形式

2.2 UDP通讯的类:DatagramSocket, DatagramPacket

         DatagramSocket,常用方法:(此类总是启用 UDP 广播发送)

                   send(Dategrampacket dp)   从套接字发送数据包

                   receive(Dategrampacket dp)从套接字接收数据包(阻塞方法)

                   close()关闭

         DategramPacket (表示数据报包)常用方法:

                  InetAddress getAddress() 返回IP地址

                  byte[] getData() 返回数据缓冲区

                  int getLength() 获得数据包长度

                   int getPort()    获得端口 

                   对应的还有setXxx()方法

   2.3  TCP通讯的类:Socket 和ServerSocket 

               Socket客户端套接字类:

                           特点:创建对象需要指定IP地址和端口               

                     常用方法:InputStream getInputStream() 获取输入流

                                  OutputStream getOutputStream()获取输出流
                                  InetAddress getInetAddress(), 返回连接的IP地址对象

                                 shutdownInput(),关闭输出流

                                 shutdownOutput() 关闭客户端输出流(标记结束)

                                 int getPort()   获取连接对象的端口,int  getLocalPort()获取本地端口

                                  close() 关闭套接字

                ServerSocket类:

                               特点:表示服务器套接字的类。创建对象一般需要监听某个端口。

                                           创建对象可以指定最大队列数(即最多连接到服务器套接字的数目)

                        常用方法: Socket accept()  监听并接收套接字连接(此方法是阻塞方法)

                                           int  getLocalPort()获取本地端口

                                           close()关闭服务器套接字(一般来说服务器是长期开放,所以不需要关闭)

3    基本编程

          UDP协议编程步骤:

                    1,创建相关socket,建立端点(不要放在循环中否则bindEException)
                    2,定义要发送的数据包(接收的数据包)
                    3,发送(接收)
                    4,关闭资源(接收端非必须)

               备注:()内的表示接收端

         UDP编程示例:(有详细注释)

  class  UDPsend1  //发送端
{
 public static void sop(Object obj)
 {
  System.out.println(obj);
 }
 public static void main(String[] args) throws Exception
 {
  //创建数据包socket
  DatagramSocket ds=new DatagramSocket();
  
        //定义数组和数据包,用于发送
        byte[] buf="UDP is coming !".getBytes();
        DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),8888);
       
  //发送
        ds.send(dp);//Exception in thread "main" java.lang.NullPointerException: null address || null buffer

  ds.close();
 }
}

//接收端
class  UDPreceive1
{
 public static void sop(Object obj)
 {
  System.out.println(obj);
 }
 public static void main(String[] args) throws Exception
 {
  //创建数据包socket 建立端点
     DatagramSocket ds=new DatagramSocket(8888);

  //定义数据包用于存储数据
  byte [] buf=new byte[1024];
  DatagramPacket dp=new DatagramPacket(buf,buf.length);

  //接收数据存储于数据包中
  ds.receive(dp);

  //通过数据包的方法获取数据
  String ip=dp.getAddress().getHostName();
  int port=dp.getPort();
  String s=new String(dp.getData(),0,dp.getLength());//如果不指定长度,则多返回一堆空字符串

  sop(ip+"::"+port+"::"+s);

 }
}

 

TCP传输:

    客户端步骤:

       1),创建Socket服务,并指定要连接的主机和端口
       2),获取Socket输出流,将数据写到该流,通过网络发送给服务端
       3),获取socket输入流,将服务端反馈的数据获取到,并进行相关操作

      4),关闭客户端资源

  服务端步骤: 
      1),创建ServerSocket服务,并监听一个端口
      2),通过accept获取socket对象,没有连接会等待
      3),通过socket对象的读取流,读取发送来的数据,
      4), 获取输出流并反馈新信息给客户端
      5),关闭服务端(可选),关闭获取的客户端套接字
TCP编程示例:

//建立文本转换服务器,将客户端发送的信息以大写形式,反馈给客户端
//注意结束标记噢
import java.net.*;
import java.io.*;

class  client1
{
 public static void sop(Object obj)
 {
  System.out.println(obj);
 }
 public static void main(String[] args) throws Exception
 {
        Socket s=new Socket("192.168.1.107",10006);

  BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//如果连接不成功则不能输入
      
  PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
  //true表示自动刷新,此对象还有append方法
  //与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时
  //才可能完成此操作,

  BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream()));

  String line=null;    //阻塞式方法。读到回车符才结束,源是文件可以结束,键盘录入就需要标记
  while ((line=br.readLine())!=null)
  {
   if ("over".equals(line))
   {
    break;
   }
   //sop("开始发送到服务端");
           pw.println(line); //用缓冲区时,记得
    // sop("发送成功");
           String linein=brin.readLine();
     System.out.println("server: "+linein);
     //sop("接收反馈信息成功");
  }
  br.close();
  s.close();//关闭后给服务端返回-1,服务端接收到-1后也结束了
  
 }
}

//服务端
class  server1
{
 public static void sop(Object obj)
 {
  System.out.println(obj);
 }
 public static void main(String[] args) throws Exception
 {
  ServerSocket ss=new ServerSocket(10006);
  Socket s=ss.accept();//阻塞式

        String ip=s.getInetAddress().getHostAddress();
  System.out.println(ip+"  is connected");

  BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
  PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
  String line=null;
  
 
  while ((line=br.readLine())!=null) //读到回车符才结束
  {
            
          sop(line);
    pw.println(line.toUpperCase()); 
   //如果是缓冲区则需要 br.newLine(),flush()
  }
            
  s.close();
  ss.close();
 }
}

4.1 URL类知识

   类 URL 代表一个统一资源定位符
        构造函数抛 MalformedURLException
 boolean equals(Object obj)
          比较此 URL 是否等于另一个对象。 
 Object getContent()
          获取此 URL 的内容。
 Object getContent(Class[] classes)
          获取此 URL 的内容。
 int getDefaultPort()
          获取与此 URL 关联协议的默认端口号。
 String getFile() 
          获取此 URL 的文件名。 资源路径+参数
 String getHost()
          获取此 URL 的主机名(如果适用)返回括在方括号 ('[' 和 ']') 中的 IPv6 地址。
 String getPath()
          获取此 URL 的路径部分。资源路径,如果没有返回空字符串
 int getPort()
          获取此 URL 的端口号。 如果没指定返回-1(没指定,服务端一般默认80端口)
 String getProtocol() 
          获取此 URL 的协议名称。
 String getQuery() 
          获取此 URL 的查询部分。 资源路径的参数部分,没有返回Null
 String getUserInfo()
          获取此 URL 的 userInfo 部分。没有返回null 
 URLConnection openConnection()
          返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
 URLConnection openConnection(Proxy proxy)
          与 openConnection() 类似,所不同是连接通过指定的代理建立;
          不支持代理方式的协议处理程序将忽略该代理参数并建立正常的连接。
 InputStream openStream()
          打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。

4.2  抽象类URLConnection

             特点:此实现对象通常是通过URL对象的方法openConnection()获取的。

                       内部封装了Socket和Http协议

         常用方法:InputStream getInputStream() 获取输入流

                          OutputStream getOutputStream()获取输出流
                          String getContentType()  获取content-type头字段的值
                          long   getDate()             获取date头字段的值

4.3 其他类

              类 InetSocketAddress 此类实现 IP 套接字地址(IP 地址 + 端口号)

              类SocketChannel 表示套接字通道。通常通过下面的方法获取:

                     SocketChannel channel=SocketChannel.open(SocketAddress isa);

4.4 其他知识

              域名解析(DNS服务器)
                       127.0.0.1:8080 和localhost:8080 映射关系存在c盘,所以不需要DNS服务器
                       请求地址时,先在自身系统C盘找映射关系,找不到再去dns找该主机地址
                       电信--不配置DNS服务器---默认电信的DNS服务器
                      127.0.0.1 - ---域名===>可以屏蔽一些主机

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值