Socket应用

一. Java网络相关API的应用

1. InetAddress类的应用

InetAddress类用于标识网络上的硬件资源,主要用来表示互联网协议(IP)地址的相关信息。
因为InetAddress类没有构造方法,所以不能直接new一个新的实例。我们可以通过InetAddress类中的一些静态方法来获取到一个实例。

    InetAddress address = InetAddress.getLocalHost();  //获取本机信息,返回一个InetAddress类的实例。
    InetAddress address = InetAddress.getByName();  //根据机器名获取信息,返回一个InetAddress类的实例。

获取到实例之后就可以利用InetAddress中的方法去获取需要的信息。

    address.getHostName();  //获取主机名
    address.getHostAddress();  //获取IP地址

2. URL类的应用

URL(Uniform Resource Locator) 统一资源定位符,实际上就是表示Internet上的某一个资源的地址,即俗称的网址。
URL由两部分组成:
一部分是协议名称,另一部分叫资源名称。它们之间用冒号( : )隔开。
要使用URL类,第一步就是先创建一个URL类的实例。

    URL url = new URL("http://blog.csdn.net/czb1n");  //根据一个资源字符串来创建一个URL类的实例。
    URL url2 = new URL(url,"/article");  //通过已有的URL实例来创建一个新的URL类的实例。也可以通过使用问号(?)来传参数,用井号(#)来指定锚点。

创建好实例之后就可以通过URL类中的方法来获取需要的信息。

     url.getProtocol();  //获取协议信息
     url.getHost();  //获取主机信息
     url.getPort();  //获取端口号信息。这里需要注意的是如果url没有指定端口号的情况下,则使用默认的端口号,但此时getPort()方法的返回值为-1。
     url.getPath();  //获取文件路径
     url.getRef();  //获取文件的相对路径
     url.getFile(); //获取文件名
     url.getQuery();  //获取查询字符串

还可以用URL类来读取网页上的内容,通过URL对象中的openStream()方法可以得到一个指定资源的字节输入流(InputStream),通过输入流可以读取和访问网络上的数据。

    InputStream is = url.openStream();  //获取指定资源的字节输入流
    InputStreamReader isr = new InputStreamReader(is, "utf-8");  //把字节输入流转换为字符输入流并指定字符集
    BufferedReader br = new BufferedReader(isr); //为字符输入流添加缓冲

利用一个循环每次读取一行来读取网页的数据。

    String data = null;
    while((data = br.readLine()) != null){
        System.out.println(data);
        data = br.readLine();
    }

读取完毕之后需要把相应的资源和输入流关闭。

    br.close();
    isr.close();
    is.close();

二. 通过 Socket 实现 TCP 编程

TCP(Transmission Control Protocol)传输控制协议是面向连接、可靠的、有序的、以字节流的方式发送数据。基于TCP协议实现网络通信的类有两个:
客服端的Socket类,服务器端的ServerSocket类。

Socket的通信模型:
Socket的通信模型

使用Socket通信实现的步骤:

1. 服务器端:

    ServerSocket serverSocket = new ServerSocket(8888);  //创建ServerSocket,指定绑定并监听端口。
    Socket socket = serverSocket.accept();
    //调用accept()方法开始监听端口,一旦调用这个方法即进入阻塞状态,等待客户端的连接返回一个Socket的实例。
    //客户端连接后,用Socket对象中的getInputStream()方法获取到一个字节输入流并读取客户端信息。
    InputStream is = socket.getInputStream();  //获取字节输入流
    InputStreamReader isr = new InputStreamReader(is)  //将字节输入流转换为字符输入流
    BufferedReader br = new BufferedReader(isr)  //为字符输入流添加缓冲

利用一个循环每次读取一行来读取客户端发送过来的信息。

    String data = null;
    while((data = br.readLine()) != null){
        System.out.println(data);
        data = br.readLine();
    }

读取完毕之后需要把相应的资源和输入流关闭。

    socket.shutdownInput();
    br.close();
    isr.close();
    is.close();
    socket.close();
    serverSocket.close();

2. 客户端:

    Socket socket = new Socket("localhost", 8888);  //指定服务器地址和端口号,创建一个客户端Socket,用来给服务器端发送信息。
    OutputStream os = socket.getOutputStream();  //获取一个字节输出流,用来给服务器端发送信息。
    PrintWriter pw = new PrintWriter(os);  //将字节输出流包装为打印流
    pw.write("my name is czb1n!");  //发送信息
    pw.flush();  //刷新缓存

读取完毕之后需要把相应的资源和输入流关闭。

    socket.shutdownOutput();
    pw.close();
    os.close();
    socket.close();

三. 通过 Socket 实现 UDP 编程

UDP(User Datagram Protocol)用户数据报协议是无连接、不可靠的、无序的、以数据报(Datagram)作为数据传输的载体。和TCP协议一样,基于UDP协议实现网络通信的类有两个:
数据报包DatagramPacket类,进行端到端通信的DatagramSocket类。

使用Socket通信实现的步骤:

1. 服务器端:

    DatagramSocket socket = new DatagramSocket(8888);  //创建服务器端DatagramSocket并指定端口
    byte[] data = new byte[1024];  //创建一个指定大小的字节数组用于存储数据
    DatagramPacket packet = new DatagramPacket(data, data.length);  //创建数据报包,用于接收客户端发送的数据
    socket.receive(packet);  //接收客户端发送的数据,和accept()方法一样,一旦调用这个方法在接收到数据报之前会一直进入阻塞状态。
    String info = new String(data, 0, packet.getLength());  //读取数据,把字节数组接收到的数据转换为String

    //packet.getAddress();  获取客户端的地址
    //packet.getPort();  获取客户端的端口号

2. 客户端:

    InetAddress address = InetAddress.getByName("localhost");  //根据主机名获得服务器的信息
    int port = 8888;  //指定与服务器相同的端口号
    byte[] data = "my name is czb1n!".getBytes();  //把要发送的信息存储在字节数组
    DatagramPacket packet = new DatagramPacket(data, data.length, address, port);  //创建一个包含发送的数据信息的数据报
    DatagramSocket socket = new DatagramSocket();  //创建一个DatagramSocket对象实例来发送信息
    socket.send(packet);  //发送数据报

以上TCP协议方式和UDP协议方式都仅实现了一个服务器端对一个客户端之间的通信,可以应用多线程来实现服务器端和多个客户端之间的通信。

Keep Going…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值