网络编程1

1、网络模型:OSI参考模型和TCP/IP参考模型

通常用户操作的是应用层,而编程人员需要做的是传输层和网际层,用户在应用层操作的数据,经过逐层封包,最后到物理层发送到另一个模型中,再进行逐层解包。

2、网络通信三要素:IP地址,端口号,传输协议
A、IP地址
a、它是网络中的设备标识
b、不易记忆,可用主机名表示,两者存在映射关系
c、本机回环地址:127.0.0.1,主机名为:localhost。
D、常用的端口8023 25
IP地址:java中对应的是InetAddress类,存在于java.net包中。
InetAddress类:

(一)无构造函数,可通过getLocalHost()方法获取InetAddress对象,此方法是静态的,返回本类对象。
InetAddress i =InetAddress.getLocalHost();

(二)方法:

byte[]  getAddress()
  返回此 InetAddress 对象的原始 IP 地址。
static InetAddress[]
get AllByName(String host) 
  在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
static InetAddress
getByAddress(byte[] addr)
  在给定原始 IP 地址的情况下,返回 InetAddress 对象。
static InetAddress
getByAddress(String host, byte[] addr) 
  根据提供的主机名和 IP 地址创建 InetAddress。
static InetAddress
getByName(String host) 
  在给定主机名的情况下确定主机的 IP 地址。
String getCanonicalHostName()
  获取此 IP 地址的完全限定域名。
String  getHostAddress()
  返回 IP 地址字符串(以文本表现形式)。
String getHostName()
  获取此 IP 地址的主机名。
static InetAddress getLocalHost()

返回本地主机。

(三)如何获取任意一台主机的IP地址对象:
1)功能:返回InetAddress对象
2)对于任意主机,需要指定传入主机名的参数
注意:如果IP地址和对应的主机名,这种映射关系没有在网络上,就不会解析成功,返回的还是指定的IP。

importjava.net.*;
/**
 * InetAddress封装了IP对象
 *@author dell
 */
class TestIPAddress{
   publicstaticvoid main(String[] args)throws Exception {
      //获取本类对象
      InetAddress ia=InetAddress.getLocalHost();
      //ip
      String address=ia.getHostAddress();
      //主机名
      String name=ia.getHostName();
   System.out.println("IP="+address+"\tname="+name);
      //获取指定主机的ip信息
      InetAddress i=InetAddress.getByName("127.0.0.1");
      String add=i.getHostAddress();
      String na=i.getHostName();
      System.out.println("addIP="+add+"\tiname="+na);
      //获取指定主机名的ip信息
      InetAddress[] baidu=InetAddress.getAllByName("www.sina.com");
      for (InetAddress b :baidu)
      {
        String baddress=b.getHostAddress();
        String bname=b.getHostName();
        System.out.println("bIP="+baddress+"\tbaiduname="+bname);
      }
   }
}

第二讲 传输协议

UTP协议
1、通过类DatagramSocket,此类表示用发送和接收数据包的套接字,即Socket。

2、方法:

1)创建UDPSocket发送服务对象:DatagramSocket(),不指定端口。DatagramSocket(intport),指定端口。
2)发送:voidsend(DatagramPacket p)
3)接收:voidreceive(DatagramPacket p)

3、步骤
1)发送数据:

a、建立UDPSocket服务
b、提供数据,并将数据封装到数据包中
c、通过socket服务的发送功能,将数据包发送出去
d、关闭资源

2)接收数据:

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

例子:

/**
 * UDP数据发送端
 */
importjava.net.*;
class UDPSend{
   publicstaticvoid main(String[] args)throws Exception
   {
      DatagramSocket ds=new DatagramSocket();
      byte[] buf="this is a UDPtest !".getBytes();
      DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),12345);
      //通过Socket服务,将已有的数据包发送出去。通过send方法。
      ds.send(dp);
      //关闭资源
      ds.close();
   }
}
packageorg.nagi.net;

importjava.net.DatagramPacket;
importjava.net.DatagramSocket;
/**
 *  UTP接收端
 *@author dell
 *
 */

class UTPReceive{
   publicstaticvoid main(String[] args)throws Exception
   {
      //一直处于接收状态
      while(true)
      {

        DatagramSocket ds=new DatagramSocket(12345);//1、创建udp Socket服务,建立端点

        byte[] buf=newbyte[1024]; //2、定义数据包。用于存储数据
        DatagramPacket dp=new DatagramPacket(buf,buf.length);
        //3、通过Socket服务的receive方法将接收到的数据存入数据包中
        ds.receive(dp);//阻塞式方法
        //4、通过数据包的方法获取其中的数据
        String ip=dp.getAddress().getHostName();
        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.*;
import java.io.*;
/**
 * UDP数据发送者
 *@author dell
 *
 */
class TestUDPSenderimplements Runnable
{
   //定义Socket服务引用
   privateDatagramSocket ds;
   TestUDPSender(DatagramSocketds)
   {
      this.ds=ds;
   }
   //复写run方法
   publicvoid run()
   {
      try
      {
        //确定数据,从键盘录入,并把键盘录入的数据封装成数据包
        DatagramPacket dp=null;
        //键盘标准录入
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String line=null;
        //br.readLine() 堵塞式
        while((line=br.readLine())!=null)
        {
          byte[] buf=line.getBytes();
          dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),12345);
          //通过Socket服务,将已有的数据包发送出去
          ds.send(dp);//发送数据包
          if ("886".equals(line)){
             break;
          }
        }
        //4、关闭资源
        ds.close();
      }
      catch (Exception e)
      {
        thrownew RuntimeException("发送数据失败");
      }    
   }
}

/**
 * UDP接受数据包
 *@author dell
 *
 */
class TestDUPReceiver implements Runnable
{
   //定义Socket服务引用
   privateDatagramSocket ds;
   TestDUPReceiver(DatagramSocket ds)
   {
      this.ds=ds;
   }
   //复写run方法
   publicvoid run()
   {
      try
      {
        //一直处于接收状态
        while (true)
        {
          //定义数据包,用于存储数据
          byte[] buf=newbyte[1024];
          DatagramPacket dp=new DatagramPacket(buf,buf.length);
          //通过Socket服务,将数据接收并存储进数据包中
          ds.receive(dp);
          //通过数据包的方法获取其中的数据
          String ip=dp.getAddress().getHostAddress();
          String data=new String(dp.getData(),0,dp.getLength());
          int port=dp.getPort();

          System.out.println("IP:"+ip+"port" +port +"Data=="+data);
        }
      }
      catch (Exception e)
      {
        thrownew RuntimeException("receiver error");
      }
   }
}
/**
 *主函数
 *@author dell
 *
 */
class TestUDPChat
{
   publicstaticvoid main(String[] args)throws Exception
   {
      //发送者线程
      new Thread(new TestUDPSender(new DatagramSocket())).start();
      //接受者线程
      new Thread(new TestDUPReceiver(new DatagramSocket(12345))).start();
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值