Java-网络编程

网络结构

网络编程的三要素

IP地址

  • 概念:IP地址是网络中计算机的唯一标识
  • IP的组成:网络号+主机号

    java提供了InetAddress类来对IP地址解析和操作

    确定主机名称的IP地址
    public static InetAddress getByName(String host)
    获取此IP地址的主机名
    public String getHostName()

端口

  • 端口是正在运行程序的标识

协议

  • UDP
    将数据源和目的地封装在数据包中,无连接,是不可靠协议,不需要建立连接,速度快

  • TCP
    建立连接,形成传输数据的通道,在连接中进行大数据量的传输,通过三次握手完成连接,是可靠地,效率会低

Socket网络编程

Socket包含了IP地址和端口号
Socket原理机制:通信的两端都有Socket,网络通信其实是Socket间的通信,数据在两个Socket间通过IO传输

UDP

UDP使用DatagramSocket类用于发送和接收数据报数据包

构造方法:
public DatagramSocket()—发送数据使用的构造方法
public DatagramSocket(int port)—接收数据使用的构造方法
主要成员方法:
public void close()关闭此数据报套接字
public void send(DatagramPacket p)从此套接字发送数据报包
public void receive(DatagramPacket p)从此套接字接收数据报包

发送和接收的数据是DatagramPacket类的,该类表示数据报包,send方法中需要传递DatagramPacket对象

构造方法:
public DatagramPacket(byte[] buf,int length,InetAddress address,int port)–发送数据使用的构造方法
public DatagramPacket(byte[] buf,int length) –接收数据使用的构造方法
buf - 分组数据
length - 包长度
address - 目的地址
port - 目的端口号
主要成员方法:
public byte[] getData()返回数据缓冲区
public int getLength()返回要发送的数据的长度或接收到的数据的长度
public InetAddress getAddress()返回该数据报发送或接收数据报的计算机的IP地址

UDP协议发送数据
1.创建发送端Socket对象
2.创建数据并打包
3.调用Socket对象的发送方法发送数据
4.释放资源

下面为实现UDP协议发送数据

public class send{  
      public static void main(String[] args){
      //创建发送端Socket
          DatagramSocket ds=new DatagramSocket();
      //创建数据并打包
          byte[] bys="UDP协议发送的数据".getBytes();
          int length=bys.length;
          //发送数据的目的IP地址
          InetAddress address=InetAddress.getByName("主机名");
          //发送端计算机的端口
          int port=10086;
          DatagramPacket dp=new DatagramPacket(bys,length,address,port);
      //发送数据
          ds.send(dp);
      //释放资源
          ds.close();
    }
}

UDP协议接收数据
1.创建接收端Socket
2.创建数据包接收数据(接受容器)
3.用Socket接受方法接收数据
4.解析数据输出
5.释放资源

下面为实现UDP协议接收数据

 public class Receive {
     public static void main(String[] args) throws IOException {
       // TODO Auto-generated method stub
       //创建接收端Socket
       DatagramSocket ds=new DatagramSocket(10086);
       //创建数据包接收
       byte[] bys=new byte[1024];
       int length=bys.length;
       DatagramPacket dp=new DatagramPacket(bys,length);
       //接收数据
       ds.receive(dp);
       //解析数据
       InetAddress address=dp.getAddress();
       String ip=address.getHostAddress();
       byte[] bys2=dp.getData();
       int len=dp.getLength();
       String s=new String(bys2,0,len);
       System.out.println(ip+":"+s);
       //释放资源
       ds.close();
    }
}

TCP

TCP协议发送数据 (客户端)
1.创建发送端Socket
2.获取输出流写数据
3.释放资源

TCP发送客户端使用的是Socket类

构造方法:
public Socket(InetAddress address,int port)
public Socket(String host,int port)
主要成员方法:
public void close()关闭
public OutputStream getOutputStream()返回此套接字的输出流

public class TSend {  

    public static void main(String[] args) throws IOException {
        //创建Socket
        Socket s=new Socket("daw-PC",10086);
        //获取输出流写数据
        OutputStream os=s.getOutputStream();
        os.write("TCP发送数据".getBytes());
        //释放资源
        s.close();
    }  
} 

TCP协议接收数据(服务器)
1.创建接收端Socket
2.监听客户端连接,返回对应的Socket对象
3.获取输入流读数据
4.释放资源

TCP接收客户端使用的是ServeSocket类

构造方法:
public ServerSocket(int port)
成员方法:
public Socket accept()监听 ,返回的是Scoket类,所以需要Socket类的方法
Socket类的—public InputStream getInputStream()返回此套接字的输入流

public class TReceive {
    public static void main(String[] args) throws IOException {
        //创建接收端Socket
        ServerSocket ss=new ServerSocket(10086);
        //监听客户端
        Socket s=ss.accept();
        //获取输入流写数据
        InputStream is=s.getInputStream();
        byte[] bys=new byte[1024];
        int len=is.read(bys);
        String str=new String(bys,0,len);
        System.out.println(str);
        //释放资源,注意不关闭服务器
        s.close();
    }
}