Java学习:网络编程

Java网络编程概述

TCP相关类通常使用读写流的方式来接受、发送网络数据。

UDP则需要创建byte数组存储要接受和发送的文件。

Java学习:网络编程_第1张图片

一、IP(IPv4、IPv6)

 1.InetAddress类

  • 它表示互联网的IP地址,用以存储IP地址和主机名。
  • 支持IPv4、IPv6。

构造方法:

        常使用静态方法创建InetAddress对象。

1.
static InetAddress getByName(String host)
在给定主机名的情况下确定主机的 IP 地址,基于DNS服务器解析。主机名也可以是IP地址。
2.
static InetAddress getLocalHost()
返回本地主机IP和主机名,返回一个InetAddress对象。
3.
static InetAddress getByAddress(byte[] addr)
在给定原始 IP 地址的情况下,返回 InetAddress 对象。
4.
static InetAddress getByAddress(String host, byte[] addr)
根据提供的主机名和 IP 地址创建 InetAddress。
5.
static InetAddress getAllByName(String host)
根据主机名,返回其所有IP地址。大型网站的主机名对应多个IP地址,例如:百度

实例方法:

1.
String getHostAddress() 
以字符串形式,返回 IP 地址。
2.
String getHostName() 
以字符串形式返回,此 IP 地址的主机名,一般来说在远端主机上只能获得IP地址。
3.
String toString()
将此 IP 地址转换为 String。

二、TCP编程

1.服务器端建立通讯(ServerSocket的使用)

  • 服务器建立通讯ServerSocket。
  • 服务器建立Socket等待客户端连接并接收。
  • 建立IO输入流读取客户端发送的数据和向客户端发送数据。

  具体代码:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server {
   public static void main(String[] args) {
      try {
         ServerSocket ss = new ServerSocket(8888);
         //8888表示服务器要监听的端口,等待客户端连接。
         //如果8888端口已经被其他进程占用,则会抛出异常IOException。
         System.out.println("启动服务器....");
         Socket s = ss.accept();
         //接受客户端连接,Socket套接口对象。
         System.out.println("客户端:"+s.getInetAddress().getLocalHost()+"已连接到服务器");
         //getInetAddress()返回客户端IP地址,getLocalHost()返回域名和IP地址。
         BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
         //读取客户端发送来的消息。
         String mess = br.readLine();
         System.out.println("客户端:"+mess);
         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
         //向客户端发送消息。
         bw.write(mess+"\n");
         bw.flush();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

        ServerSocket不是一种Socket,它可以监听服务器端口(端口号对应着某个应用程序),来获取客户端的连接情况,通过接收客户端连接来建立Socket。如果监听端口已经被其他进程占用,则会抛出异常IOException。

2.客户端建立通讯(Socket)

  • 创建Socket通信,设置通信服务器的IP和Port
  • 建立IO输出流向服务器发送数据消息和读取服务器发送来的数据消息

    具体代码:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class Client {
   public static void main(String[] args) {
      try {
         Socket s = new Socket("127.0.0.1",8888);
         //127.0.0.1为要进行通讯的服务器IP,8888为要客户端连接到的服务器端口
         //客户端发起Https通讯要走传输层端口号443,而http通讯则是80端口。
         //而服务器端端口号是指定的,不是固定的。
         //构建IO
         InputStream is = s.getInputStream();
         OutputStream os = s.getOutputStream();
         
         BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
         //向服务器端发送一条消息
         bw.write("测试客户端和服务器通信,服务器接收到消息返回到客户端\n");
         bw.flush();
         
         //读取服务器返回的消息
         BufferedReader br = new BufferedReader(new InputStreamReader(is));
         String mess = br.readLine();
         System.out.println("服务器:"+mess);
      } catch (UnknownHostException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

        Socket建立TDP连接,绑定服务器IP地址和指定服务器端口,与服务器建立连接。当服务器地址不正确或无法识别时,会抛出UnknownHostException异常,当Socket等待连接超时会抛出SocketTimeoutException异常,当服务器端代码口被占用无法绑定端口时,会抛出BindException异常,当服务器没有启动,没有监听对应端口或拒绝连接时,会抛出ConnectException异常,它们都是IOException的直接或间接子类

3.SocketAddress类和InetSocketAddress类

        SocketAddress是一个抽象类,通过InetSocketAddress实例化,是用于标识网络套接字地址的类,它提供了连接所需的目标地址信息,不提供连接服务。

构造方法:

public InetSocketAddress(InetAddress addr, int port) 
通过给定ip地址和端口创建套接字地址标记
例:SocketAddress socketAddress = new InetSocketAddress(address, 80);
address是InetAddress对象,可以通过getByName获取

4.Socket类

构造方法:

public Socket(String host, int port) throws IOException
创建一个流套接字并将其连接到指定主机上的指定端口号。
例:Socket s = new Socket("127.0.0.1",8888);

常用方法: 

以下方法均为Socket对象的内部方法,可以通过.号来使用该方法。
例如:s.close()//s为Socket对象
1.
public void close() throws IOException
关闭套接字。
2.
public InetAddress getInetAddress()
返回套接字连接的地址,为InetAddress对象。
3.
public int getPort()
返回此套接字连接到的远程端口
4.
public int getLocalPort()
返回此套接字绑定到的本地端口。
5.
public InputStream getInputStream() throws IOException
返回此套接字的输入流,返回一个InputStream对象。
6.
public OutputStream getOutputStream() throws IOException
返回此套接字的输出流,返回一个OutputStream对象。
7.
public void connect(SocketAddress host, int timeout) throws IOException
将此套接字连接到服务器,并指定一个超时值。
若时间超过timeout还没有连接到服务端,则抛出异常SocketTimeoutException。
8.
public void bind(SocketAddress bindpoint) throws IOException 
Socket绑定SocketAddress提供的IP地址和端口。
如果bindpoint为null,则系统会去寻找一个空闲的端口和一个有效的ip地址。

5.ServerSocket 类

构造方法:

public ServerSocket(int port) throws IOException
监听服务器端口port
例: ServerSocket ss = new ServerSocket(8888);

常用方法: 

1.
public int getLocalPort()
返回此套接字在其上侦听的端口。
2	
public Socket accept() throws IOException
侦听并接受到此套接字的连接。
3	
public void setSoTimeout(int timeout)
通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位。

三、URL类(以Socket为基础)

        通过Socket与HTTP服务器通讯,相对繁琐,用户必须掌握HTTP协议,但使用URL可以使Java程序更方便的访问http服务器。

        URL统一资源定位符:定位资源位置。

        URL组成:协议部分+资源名称部分。

 例子:       Java学习:网络编程_第2张图片

构造方法:

        如果URL对不支持的协议,或者未知的协议,则会抛出MalformedURLException异常。

public URL(String spec) throws MalformedURLException
通过解析url来创建新的URL对象

例子: 

 实例方法:

public final InputStream openStream() throws java.io.IOException
打开URL连接,并返回一个用于该连接读取的InputStream流。
它是openConnection().getInputStream()的缩写。

四、UDP编程

1.DatagramSocket类

       它可以作为客户端发送数据,也可以作为服务器端接受数据,当要发送或接收UDP数据时,首先要创建一个DatagramSocket对象。

Java学习:网络编程_第3张图片

2.DatagramPacket类

        在发送或接收UDP数据时,要创建一个DatagramPacket对象。DatagramPacket使用byte数组来存放发送和接受的数据。

Java学习:网络编程_第4张图片       

具体代码: 

import java.io.IOException;
import java.net.*;

public class Main {
    public static void main(String[] args) {
        try {
            InetAddress address;
            byte[]add="172.28.4.0".getBytes();
            address= InetAddress.getByAddress(add);
            DatagramSocket socket =new DatagramSocket(8091,address); 
            //创建DatagramSocket对象。
            byte[]message="hello".getBytes();
            //String类转byte[]数组的内部方法。
            DatagramPacket dp=new DatagramPacket(message, message.length);
            socket.send(dp);
            //发送数据,要提前建立byte[]数组。
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

五、TCP与UDP编程的区别

Java学习:网络编程_第5张图片

你可能感兴趣的:(Java学习,网络,java,学习)