黑马程序员-学习日记18(网络编程 1 )

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

 

网络编程(概述)
 1.网络编程
  1)网络模型
    OSI参考模型
    TCP/IP参考模型
  2)网络通讯要素
    IP地址
    端口号
    传输协议

 2.网络通讯图示:Day23-01-网络通讯原理

02-网络编程(网络模型)

 1.注意:
 1)JavaWeb开发主要在应用层,网络编程主要在传输层和网际层,http和ftp都是应用层协议。
 2)传输层主要的协议是UDP和TCP,网际层主要的协议是IP.

 2.网络模型图如:Day23-03-网络模型

 3.网络模型分析图如:
 Day23-03-网络模型示意图及1,2,3,4


03-网络编程(IP地址)


 1.网络通讯要素

  1)IP地址:
  网络中设备的标识
  不易记忆,可用主机名
  本地回环地址:127.0.0.1 主机名:localhost
  2)端口号
  用于标识进程的逻辑地址,不同进程的标识
  有效端口:0~65535,其中0~1024系统使用或保留端口。
  3)传输协议
  通讯的规则
  常见协议:TCP,UDP
 2.InetAddress类(java.net包)

  1)此类表示互联网协议 (IP) 地址。

  IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,
  UDP 和 TCP 协议都是在它的基础上构建的
  InetAddress 的实例包含 IP 地址,还可能包含相应的主机名
  (取决于它是否用主机名构造或者是否已执行反向主机名解析)。
  2)方法摘要
  boolean equals(Object obj)
     将此对象与指定对象比较。
  byte[] getAddress()
     返回此 InetAddress 对象的原始 IP 地址。
  static InetAddress getByName(String host)
     在给定主机名的情况下确定主机的 IP 地址。
  String getHostAddress()
     返回 IP 地址字符串(以文本表现形式)。
  String getHostName()
     获取此 IP 地址的主机名。
  static InetAddress getLocalHost()
     返回本地主机。
  String toString()
     将此 IP 地址转换为 String。
  static InetAddress getLocalHost()
     返回本地主机。
  static InetAddress[] getAllByName(String host)
     在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
    
 3.UnknownHostException异常:

  IPDemo.java:7: 未报告的异常 java.net.UnknownHostException;必须对其进行捕捉或声
  明以便抛出
     InetAddress i = InetAddress.getLocalHost();


04-网络编程(TCP和UDP)


 TCP和UDP

 1)UDP:
  将数据及源和目的封装成数据包中,不需要建立连接。
  每个数据包的大小限制在64K内
  因无连接,是不可靠协议
  不需要建立连接,速度快
 2)TCP:
  建立连接,形成传输数据的通道。
  在连接中进行大量数据传输
  通过三次握手完成连接,是可靠协议
  必须建立连接,效率会稍低。

 3)应用:UDP如QQ聊天,视频会议等
    TCP如下载等
 4)举例:UDP如同报话机。
    TCP如同打固定电话。

 注:三次握手--1你在吗?2我在呢3好了,我知道你在了。


05-网络编程(Socket)


 1.Socket
  Socket就是为网络服务提供的一种机制。
  通信的两端都有Socket.
  网络通信其实就是Socket间的通信。
  数据在两个Socket间通过IO传输。

 2.原理分析图如:Day23-06-Socket分析图


06.-网络编程(Udp-发送端)

 1.UDP传输
  DatagramSocket与DatagramPacket
  建立发送端,接收端
  建立数据包。
  调用Socket的发送接收方法。
  关闭Socket.

  发送端与接收端是两个独立的运行程序。

 2.DatagramSocket类(java.net包)

  1)此类表示用来发送和接收数据报包的套接字。

  数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。
  从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

  在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。
  在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。
  2)构造方法摘要
  DatagramSocket()
     构造数据报套接字并将其绑定到本地主机上任何可用的端口。
  protected  DatagramSocket(DatagramSocketImpl impl)
     创建带有指定 DatagramSocketImpl 的未绑定数据报套接字。
  DatagramSocket(int port)
     创建数据报套接字并将其绑定到本地主机上的指定端口。
  DatagramSocket(int port, InetAddress laddr)
     创建数据报套接字,将其绑定到指定的本地地址。
  DatagramSocket(SocketAddress bindaddr)
     创建数据报套接字,将其绑定到指定的本地套接字地址。
  3)方法摘要
  void receive(DatagramPacket p)
     从此套接字接收数据报包。
  void send(DatagramPacket p)
     从此套接字发送数据报包。
  void close()
     关闭此数据报套接字。
  void connect(InetAddress address, int port)
     将套接字连接到此套接字的远程地址。
 
 3.类 DatagramPacket(java.net包)

  1)此类表示数据报包
  2)构造方法摘要
  DatagramPacket(byte[] buf, int length)
     构造 DatagramPacket,用来接收长度为 length 的数据包。
  DatagramPacket(byte[] buf, int length, InetAddress address, int port)
     构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
  3)方法摘要
  InetAddress getAddress()
     返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
  byte[] getData()
     返回数据缓冲区。
  void setData(byte[] buf)
     为此包设置数据缓冲区。
  void setLength(int length)
     为此包设置长度。
  void setPort(int iport)
     设置要将此数据报发往的远程主机上的端口号。
  int getLength()
     返回将要发送或接收到的数据的长度。
  int getPort()
     返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

 4.需求:通过UDP传输方式,将一段文字数据发送出去。
  定义udp的发送端
  思路:
  1)建立udpsocket服务。
  2)提供数据,并将数据封装到数据包中。
  3)通过socket服务的发送功能,将数据包发出去。
  4)关闭资源。


 5.相关异常:
 UdpSend.java:7: 未报告的异常 java.net.SocketException;必须对其进行捕捉或声明以
 便抛出
     DatagramSocket ds = new DatagramSocket();
          ^
 UdpSend.java:9: 未报告的异常 java.net.UnknownHostException;必须对其进行捕捉或声
 明以便抛出
     DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddres
 s.getByName("192.168.0.2"),2000);

      ^
 UdpSend.java:10: 未报告的异常 java.io.IOException;必须对其进行捕捉或声明以便抛
 出
     ds.send(dp);


07.-网络编程(Udp-接收端)


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

 定义udp的接收端。
 思路:
 1)定义udpsocket服务。通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标识。
 方便于明确哪些数据过来该应用程序可以处理。
 2)定义一个数据包,因为要存储接收到的字节数据。
 因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
 3)通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
 4)通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。
 5)关闭资源。

08-网络编程(TCP传输)


 1.TCP传输
  Socket和ServerSocket
  建立客户端和服务器端
  建立连接后,通过Socket中的IO流进行数据的传输
  关闭socket

   同样,客户端与服务器端是两个独立的应用程序。

 2.类 Socket(java.net )

  1)此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点
  2)构造方法摘要
  Socket()
     通过系统默认类型的 SocketImpl 创建未连接套接字
  Socket(InetAddress address, int port)
     创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
  Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
     创建一个套接字并将其连接到指定远程地址上的指定远程端口。
  Socket(String host, int port)
     创建一个流套接字并将其连接到指定主机上的指定端口号。
  Socket(String host, int port, InetAddress localAddr, int localPort)
     创建一个套接字并将其连接到指定远程主机上的指定远程端口。
  3)方法摘要
  void bind(SocketAddress bindpoint)
     将套接字绑定到本地地址。
  void close()
     关闭此套接字。
  void connect(SocketAddress endpoint)
     将此套接字连接到服务器。
  void connect(SocketAddress endpoint, int timeout)
     将此套接字连接到服务器,并指定一个超时值。
  InetAddress getInetAddress()
     返回套接字连接的地址。
  InputStream getInputStream()
     返回此套接字的输入流。
  OutputStream getOutputStream()
     返回此套接字的输出流。
  int getPort()
     返回此套接字连接到的远程端口。
  String toString()
     将此套接字转换为 String。
 
 3.类 ServerSocket(java.net)

  1)此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
  2)构造方法摘要
  ServerSocket()
     创建非绑定服务器套接字。
  ServerSocket(int port)
     创建绑定到特定端口的服务器套接字。
  ServerSocket(int port, int backlog)
     利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。
  ServerSocket(int port, int backlog, InetAddress bindAddr)
     使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。
  3)方法摘要
  Socket accept()
     侦听并接受到此套接字的连接。
  void close()
     关闭此套接字。
  void bind(SocketAddress endpoint)
     将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
  void bind(SocketAddress endpoint, int backlog)
     将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
  String toString()
     作为 String 返回此套接字的实现地址和实现端口。    

 

 4.原理图示如:Day23-11-TCP传输原理图

 5.
 需求1:给服务端发送一个文本数据。
 步骤:
 1.创建Socket服务。并指定要连接的主机和端口。

 需求2:定义端点接收数据并打印在控制台上。

 服务端:
 1,建立服务端的socket服务。ServerSocket();
  并监听一个端口。
 2,获取连接过来的客户端对象。
  通过ServerSocket的accept方法。没有连接就会等,所以这个方法阴塞式的。
 3.客户端如果发过来数据,那么服务端要使用对应的客户端对象,
  并获取到该客户端对象的读取流来读取发过来的数据。并打印在控制台。
 4.关闭服务端。(可选)


09-网络编程(TCP传输2)

 演示tcp的传输的客户端和服务端的互访。
 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息。

 客户端:
 1.建立socket服务,指定要连接主机和端口。
 2.获取socket流中的输出流。将数据写到该流中。通过网络发送给服务端。
 3.获取socket流中的输入流,将服务端反馈的数据获取到,并打印。
 4.关闭客户端资源。

10-网络编程(TCP练习)


 需求:建立一个文本转换服务器。
 客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端。
 而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束。

 分析:
 客户端:
 既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考。
 源:键盘录入。
 目的:网络设备,网络输出流。
 而且操作的是文本数据。可以选择字符流。

 步骤:

 1.建立服务。
 2.获取键盘录入。
 3.将数据发给服务端。
 4.后去服务端返回大写数据。
 5.结束,关资源。

 都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲。


 注:PrintWriter(OutputStream out, boolean autoFlush)
     通过现有的 OutputStream 创建新的 PrintWriter。

11-网络编程(TCP复制文件)


Socket类的方法(用于加结束标记):
 void shutdownInput()
          此套接字的输入流置于“流的末尾”。
 void shutdownOutput()
          禁用此套接字的输出流。

注:用over作标记容易重复


 

以下是我的程序代码:

 

/*
1 ,数据通讯的原理就是数据的传输。
网络模型:
 OSI参考模型。开放网络
 TCT/IP参考模型。
网络通讯要素。
 IP地址:InetAddress
 端口号:它就是一个数据标识,所以说它没有必要封装成对象。
 传输协议

 一,找到对方IP.
 二,数据要发送到对方指定的应用程序上(软件),为了标识这些应用程序
 所以给这些网络应用程序都用数字进行标识,为了方便称呼这
 个数字,叫做逻辑端口。其它的软件,解析不了,只有本类的软件能解析了。
 为什么我在qq上发了一个信息,它用FeiQ收不了,因为它们的逻辑端口不同,
 只能用相同的端口(数字标识)来接收。(就像一个地址,各有各的地址和门号)。
 三,定义通信规则,这个通讯规则称为协议。
  国际标准化组织定义了通用协议TCP/IP。(各国电脑都用该广域网协议); 
  两台协议都用该协议才能通讯。  有些特有的组织或单位,和我们的通讯不同,他们
  有它自己特有的协议进行内部通讯,我们没有他们的协议,所以入侵不了他们的网络。

 
 IP地址,由四段组成,每段是一个字节 ,每段最大值255,


127.0.0.1 用于测试网卡(本地回还地址), Ping 127.0.0.1 
局域网中只要是同一网段就能通讯。
数字端口可先:0~65535范围内。0~1024端口被系统的程序所保留了,我们最好不要在用了。
WEB服务器默认端口:80
tomcat用品默认端口:8080
mySQL数据库默认端口:3306
网络应用程序必须有数字标识端口。这样外界应用程序才能把一些
信息发到指定的应用程序上。

 

具体的通讯方式。

 传输方式有两种:TCP、UDP.

层次的细致划分:
每一个层次都有自己该干的具体工作 。


OSI参考模型 TCP/IP参考模型

应用层   应用层
表示层
会话层
传输层   传输层   TCP,UDP
网络层   网际层   在给该数据,目的地,网络地址ip。
数据链路层  主机到网络层 通过什么方式,传输?
物理层       物理设备。

数据封包的过程,由上向下传递,每一层都会加入该层特有的一些数据
信息。

 

 

拆包的过程:先到
物理层:拆包,提取该层特有的能识别的数据。
应用层拆到最后,看标识端口,交给特定的应用程序,来解析。

 


玩网络编程(玩软件的)所以主机至网络层这一块不用管。我们在
网络层和传输层混。当玩javaweb开发时在应用层混。

每层都有自己的协议。
网际层最常见的协议就是IP(网际协议)
应用层协议:HTTP FTP  它基于传输层


三个要素的体现:

IP地址:
 网络中设备的标识
 IP不易记忆,可用主机名 或 域名 代替。
 本地回环地址:127.0.0.1 用本地主机名:localhost
 

端口号:
 用于标识进程的逻辑地址,不同进程的标识
 有效端口:0~65535 ,其中0~1024 系统使用或保留端口。

传输协议:
 通讯的规则
 常见协议:TCP ,UDP

我们要作的是用java语言来操作这三个要素。
先会想到的是,它是不是会提供一些对象呀?
能不能有对象,我们思考一下。

http://www.baidu.com我们访问的是百度的服务器,它有它的IP地址
但IP我们记不住,所以用域名来表示。

它有主机和IP地址相对应的特点。


java.net
类 InetAddress
java.lang.Object
  java.net.InetAddress
所有已实现的接口:
Serializable
直接已知子类:
Inet4Address, Inet6Address

--------------------------------------------------------------------------------

public class InetAddressextends Objectimplements Serializable此类表示互联网协议 (IP) 地址。

IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的
该对象,没有构造函数,不能new对象,,该对象中有非静态方法,
说明它里面有静态方法能返回一个自己本类对象,
 static InetAddress getLocalHost() //打印的是本地的主机名和地址。
        返回本地主机。 //打印的是本地的主机名和地址。
  String getHostAddress()
          返回 IP 地址字符串(以文本表现形式)。
  String getHostName()
          获取此 IP 地址的主机名。 //如果这个IP地址和它对应的主机名,没有映射关系,没在网络上,
          //能找到IP但,主机名没解析成功,将返回IP地址。
    //获取网络中任意一台主机的IP和主机名。
 static InetAddress getByName(String host) //最常用的方法。,里面也可放域名(主机名).
          在给定主机名的情况下确定主机的 IP 地址。
    //当有多个IP时,用下边的方法。
 static InetAddress[] getAllByName(String host) //返回的IP对象不唯一时,用该方法。
          在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。

 

如果IP地址和对应的主机名没有在网络上,没解析时,那么主机名
还是IP地址。


事物只要复杂的话,把它封装把对象,可以减化操作,因为面向
对象可以将复杂的问题简单化。

UDP:
1 ,面向无连接的:发数据之前,两端不需要建立连接,发向对方
 的地址和端口要明确出来,如找不到就丢掉。
2 ,将数据及源和目的的封装成数据包中,不需要建立连接
3 ,每个数据报的大小限制在64k.
4 ,因无连接,是不可靠协议
5 ,不需要建立连接,速度快,易丢包。
 对讲机,qq聊天,视频会议用的就是UDP,数据不重要,丢不丢无所谓。力求速度不求数据丢失。
 特点:面向无连接,不可靠,速度快,数据要封包,大小限制在64K。


TCP
1 ,面向连接,发送数据对方必须在,不在发不了,(对方在不在,
 通过三次握手机制来实现TCP通道的建立)先建立一个通路,送一个数据,
 如果对方收到给一个回应,我收到他的回应后,在给他一个确认信息。
 连接有了之后,数据在此通路中传输就行了。如果你要是单
 方面断开,数据就中断不传了,因为通路没了。它传输有点慢,因为建立
 通路需要消耗时间,但它可以大数据量传输,它相当于打电话
 打电话和下载,都是用的TCP。
2 ,建立连接,形成传输数据的通道。
3 ,在连接中进行大数据量传输。
4 ,通过三次握手完成连接,
5 ,必须建立连接,效率会稍低,连接耗时间。

Socket :
想要通讯必须要有港口,也就是Socket.
Socket(插座)就是为网络服务提供的一种机制,通信两端都有必须
有Socket,因为有了它才能去进行连接,连接后你的数据才会有传输的通路。
网络通讯其实就是Socket间的通信,数据在两个Socket间
通过IO传输。
每一个应用程序都有一个类似于这样的插座,两个应用程序通过
底层在互联,两边都是端点,
通讯的两端必须要有Socket,因为有了它,才能进行连接,连接后
数据才会有传输的通路。先有码头才会有般进行装卸货。


每个传输协议都有自己特有的建立传输端点的方式。
UDP特有的传输方式,对应的对象,UDP的Socket服务该怎样去建立呢,
类:DatagramSocket  此类表示用来发送和接收数据报包的套接字。


UDP:
DatagramSocket 与DatagramPacket
建立发送端,接收端。
建立数据包。
调用Socket的发送方法。
关闭Socket.
发送端与接收端是两个独立的运行程序。

 


  void receive(DatagramPacket p)
      从此套接字接收数据报包。
   void send(DatagramPacket p)
      从此套接字发送数据报包。 //UDP需要把数据封装成包发出去。

类:DatagramPacket  数据报包用来实现无连接包投递服务。

 

 

 

 

 

import java.net.*;
class Demo1{
 public static void main(String args[])throws UnknownHostException{
  method2();
 }
 public static void method1()throws UnknownHostException{
  InetAddress i = InetAddress.getLocalHost();
  System.out.println(i.toString());// java.net.UnknownHostException未知主机异常,是我们最常见的异常。
  //打印的是我们的本地的主机名和地址。
  //只要主机名和地址
  System.out.println("address:"+i.getHostAddress());//获取本机
  System.out.println("name:"+i.getHostName());//获取本机
 } 
 public static void method2()throws UnknownHostException{
  InetAddress ia = InetAddress.getByName("192,168.1.106");//拿ip最方便,
  System.out.println("address:"+ia.getHostAddress());
  System.out.println("name:"+ia.getHostName());
 }
 public static void method2()throws UnknownHostException{
  InetAddress ia = InetAddress.getByName("www.baidu.com");//拿主机名需要解析。
  System.out.println("address:"+ia.getHostAddress());
  System.out.println("name:"+ia.getHostName());
 }
}

 

需求:通过UDP传输方式,将一段文字数据发送出去。
 思路:
  1 ,建立UDPSocket服务,先建立端点。找邮局。
  2 ,要提供数据,并将数据封装到数据包中,
  3 ,通过Socket服务的发送功能,将数据包发出去。
  4 ,关闭资源。

 

import java.net.*;
class Demo1{
 public static void main(String args[]){
  //1 ,创建udp服务,通过DatagramSocket对象。
  DatagramSocket ds = new DatagramSocket(8888);
  //2 ,确定数据,并封装成数据包,DatagramPacket(byte[] b);
  byte[] buf = "udp ge men lai le".getBytes();
  DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000);
  //3 ,通过socket服务,将已有的数据包发送出去,通过send方法。
  ds.send(dp);
  //4 ,关闭资源。
  ds.close(); 
  //面向无连接,接收端没开,该数据丢失了。
 }
}

 


1,定义udpsocket服务,通常会监听一个端口,其实就是给这个接收
网络应用程序定义数字标识,(如果不定义系统会给你分配一个默认
的端口。)方便于明确哪些数据过来该应用程序可以处理。
2 ,定义一个数据包,该数据包中没有数据,因为要存储接收到的字节数据。因为数据包
对象中有更多功能可以提取字节数据中的不同数据信息。
3 ,通过Socket服务的receive方法将收到的数据存入已定义好的
数据包中。
4 ,通过数据包对象的特有功能,将这些不同的数据取出,打印在
控制台上。
5 ,关闭资源。

接收端通常会指定一个监听的端口。

receive它是一个阻塞式方法。当没有数据就等,(线程机制),当发
来数据。

import java.net.*;
class Demo1{
 public static void main(String args[])throws Exception{
  //1 ,创建udp服务,建立端点。通过DategramSocket对象。因为该服务既能接收又能发送。
  DatagramSocket ds = new DatagramSocket(10000);
  //2 ,定义数据包,用于存储数据。
  byte[] buf = new byte[1024];
  DatagramPacket dp = new DatagramPacket(buf,buf.length);
  //3 ,通过服务的receive方法将收到数据存入数据包中。
  ds.receive(dp);//将收入到的数据存入数据包中。
  //4 ,通过数据包的方法获取其中的数据。
  String ip = dp.getAddress().getHostAddress();
  String data = new String(dp.getData(),0,dp.getLength());
  int port = dp.getPort();
  System.out.println(ip+"::"+data+"::"+port);
  //5 ,关闭资源。
  ds.close();

 }
}

 

//只要用到net包通常要用到IO包。
import java.net.*;
class Demo1{
 public static void main(String args[])throws Exception{
  //1 ,创建udp服务,通过DategramSocket对象。
  DatagramSocket ds = new DatagramSocket(10000);//该语放到while中将出现:BindException,异常,服务建立一次就行了。
  while(true){//不是死循环,因为里面有一个阻塞式方法。
   //2 ,定义数据包,用于存储数据。,源变了,
   byte[] buf = new byte[1024];
   DatagramPacket dp = new DatagramPacket(buf,buf.length);
   //3 ,通过服务的receive方法将收到数据存入数据包中。
   ds.receive(dp);//阻塞式方法。将接收到的数据存储到定义好的数据包当中。
   //4 ,通过数据包的方法获取其中的数据。
   String ip = dp.getAddress().getHostAddress();
   String data = new String(dp.getData(),0,dp.getLength());
   int port = dp.getPort();
   System.out.println(ip+"::"+data+"::"+port); 
  }
  //5 ,关闭资源。
  ds.close();
 }
}

 

 


import java.net.*;
class Demo1{
 public static void main(String args[])throws Exception{
  //1 ,创建udp服务,建立端点。通过DategramSocket对象。因为该服务既能接收又能发送。
  DatagramSocket ds = new DatagramSocket(10000);
  //2 ,定义数据包,用于存储数据。
  byte[] buf = new byte[1024];
  DatagramPacket dp = new DatagramPacket(buf,buf.length);
  //3 ,通过服务的receive方法将收到数据存入数据包中。
  ds.receive(dp);//将收入到的数据存入数据包中。
  //4 ,通过数据包的方法获取其中的数据。
  String ip = dp.getAddress().getHostAddress();
  String data = new String(dp.getData(),0,dp.getLength());
  int port = dp.getPort();
  System.out.println(ip+"::"+data+"::"+port);
  //5 ,关闭资源。
  ds.close();
 }
}

 

 


class Demo2{
 public static void main(String args[])throws Exception{
  //1 ,创建udp服务,通过DatagramSocket对象。
  DatagramSocket ds = new DatagramSocket(8888);
  //2 ,确定数据,并封装成数据包,DatagramPacket(byte[] b);
  byte[] buf = "udp ge men lai le".getBytes();
  DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.1"),10000);
  //3 ,通过socket服务,将已有的数据包发送出去,通过send方法。
  ds.send(dp);
  //4 ,关闭资源。
  ds.close(); 
  //面向无连接,接收端没开,该数据丢失了。
 }
}

 

 

 


//多线程聊天软件的编写。 
//编写一个聊天程序,有收数据的部分,有发数据的部分。
//这两部分要同时执行。那就需要用到多线程技术,一个线程
//控制收,一个线程控制发,因为收和发动作是不一至的,所以要
//定义两个Run方法,而且这两个方法要封装到不同的类中。

*/

 

//只要用到net包通常会用到IO包。因为网络通讯用的还有数据。

//readLine也是阻塞式方法。
//receive也是阻塞式方法。
import java.net.*;
import java.io.*;
class Demo1{
 public static void main(String args[])throws Exception{
  DatagramSocket ds = new DatagramSocket();
  BufferedReader buf =
   new BufferedReader(new InputStreamReader(System.in));
  String line = null;

  while((line=buf.readLine())!=null){
   if("886".equals(line))
    break;
   byte[] b = line.getBytes();
   DatagramPacket dp =
    new DatagramPacket(b,b.length,InetAddress.getByName("192.168.0.1"),10010);
   ds.send(dp);
  }
  ds.close();
 }
}
class Demo2{
 public static void main(String args[])throws Exception{
  DatagramSocket ds = new DatagramSocket(10010);
  while(true){
   byte[] buf = new byte[1024];
   //根据指定的字节数组和长度来开创数据报包。
   DatagramPacket dp = new DatagramPacket(buf,buf.length);
   //把接收到的内容存入数据报中,为了是利用数据报中的方法来提取对象。
   ds.receive(dp);
   String ip = dp.getAddress().getHostAddress();
   String data = new String(dp.getData(),0,dp.getLength());
   System.out.println(ip+"::"+data);
  }
 }
}

 


2.PATH:用于列出可执行文件的搜索路径.
因为通过要通过命令行的命令启动JAVA,JAVAC等编译工具和解释工具,
系统必须要知道他们所在的位置,
PATH就是用来指明他们的位置的.
3.CLASSPATH该变量是JAVA加载类(class or lib)的路径.
只有在classpath设置的路径中的类才能被加载.

 


1. PATH环境变量。作用是指定命令搜索路径,在i命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。我们需要把jdk安装目录下的bin目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好PATH变量后,就可以在任何目录下执行javac/java等工具了。
  2. CLASSPATH环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPTH来寻找类的。我们需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录“.”也必须加入到该变量中。

 

你可能感兴趣的:(黑马程序员-学习日记18(网络编程 1 ))