Java——(十)网络编程

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、Java的基本网络支持

  Java为网络支持提供了java.net包,该包下的URL和URLConnection等类提供了以编程方式访问Web服务的功能,

而URLDecoder和URLEncoder则提供了普通字符串和application/x-www-form-urlencoded MIME相互转换的静态

方法。

1.使用InetAdress

  Java提供了InetAdress类来代表IP地址,InetAdress下还有两个子类:Inet4Address、Inet6Adress。InetAdress

类没有提供构造器,而是提供了如下两个静态方法来获取InetAdress实例。

1)getByName(String host):根据主机获取对应的InetAdress对象。

2)getByAddress(byte[] addr):根据原始IP地址来获取对应的InetAdress对象。

3)getLocalHost():根据本机IP地址来获取对应的InetAdress对象。

InetAdress还提供了如下三个方法来获取InetAdress实例对应的IP地址和主机名。

3)String getCanonicalHostName():获取此IP地址的全限定域名。

4)String getHostAddress():返回该InetAdress实例对应的IP地址字符串。

5)String getHostName():获取此IP地址的主机名。

6)boolean isReachable(int timeout):用于测试是否可到达该地址。

  下面程序测试了InetAdress类的简单用法。

 1 package com.socket;
 2 
 3 import java.net.InetAddress;
 4 
 5 public class InetAddressTest {
 6 
 7     public static void main(String[] args) throws Exception {
 8 
 9         // 根据主机名来获取对应的InetAddress实例
10         InetAddress ipAddress = InetAddress
11                 .getByName("www.4399.com");
12         //判断是否可达
13         System.out.println("4399网址是否可达:" + ipAddress.isReachable(2000));
14         //获取该InetAdress实例的IP字符串
15         System.out.println(ipAddress.getHostAddress());
16         //获取本机IP地址对应的InetAdress实例
17         System.out.println("本机IP:"+ InetAddress.getLocalHost());
18         //根据原始IP地址来获取对应的InetAdress实例
19         InetAddress local = InetAddress.getByAddress(new byte[]{127,0,0,1});
20         System.out.println("本机是否可达:" + local.isReachable(3000));
21         //获取该InetAdress实例对应的全限定域名
22         System.out.println(local.getCanonicalHostName());
23     }
24 
25 }

运行结果:

4399网址是否可达:true
175.43.124.195
本机IP:XiongXueSong/192.168.1.113
本机是否可达:true
127.0.0.1

2.使用URLDecoder和URLEncoder

  URLDecoder和URLEncoder用于完成普通字符串和application/x-www-form-urlencoded MIME字符串之间的

相互转换。

  在介绍application/x-www-form-urlencoded MIME字符串之前,现在浏览器搜索关键字“黑马程序员”,将看到

下图所示界面。

 

  从图中可以看出当我们所示的关键字包含中文时,这些关键字就会变成如上图所示的“乱码”——这就是所谓的

application/x-www-form-urlencoded MIME字符串。

  当URL地址里包含非西欧字符的字符串时,系统就会将这些非西欧字符串转换成上图所示的特殊字符串。这就

需要使用URLDecoder和URLEncoder类。

1)URLDecoder类包含一个decode(String s, String enc)静态方法,它可以将看上去是乱码的特殊字符串转换

成普通字符串。

2)URLEncoder类包含一个encode(String s, String enc)静态方法,它可以将普通字符串转换成

application/x-www-form-urlencoded MIME字符串。

  下面程序示范了将上图所示地址栏中的“乱码”转换成普通字符串,并示范了如何将普通字符串转换成

application/x-www-form-urlencoded MIME字符串。

 1 package com.socket;
 2 
 3 import java.io.UnsupportedEncodingException;
 4 import java.net.URLDecoder;
 5 import java.net.URLEncoder;
 6 
 7 public class URLDecoderTest {
 8 
 9     public static void main(String[] args) throws UnsupportedEncodingException {
10 
11         // 将application/x-www-form-urlencoded MIME字符串转换成普通字符串
12         String keyString = URLDecoder.decode(
13                 "%E9%BB%91%E9%A9%AC%E7%A8%8B%E5%BA%8F%E5%91%98", "UTF-8");
14         System.out.println(keyString);
15         //将普通字符串转换成application/x-www-form-urlencoded MIME字符串
16         String urlString = URLEncoder.encode("黑马程序员", "UTF-8");
17         System.out.println(urlString);
18     }
19 
20 }

运行结果:

黑马程序员
%E9%BB%91%E9%A9%AC%E7%A8%8B%E5%BA%8F%E5%91%98

提示:

  包含中文字符串的普通字符串需要转换,转换方法是每个中文字符串栈2个字节,每个字节可以转换成

2个十六进制的数组,所以每个中文字符将转换成“%XX%XX”的形式。

3.使用URLhURLConnection

  URL对象代表统一资源定位器,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以

是对更为复杂的引用。通常情况下,URL可以由协议名、主机、端口和资源组成,即满足如下格式:

protocol://host:port/resourceName

例如如下的URL地址:

http://www.4399.com

3.TCP编程

客户端:

 1 package TCPDemo;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.io.InputStreamReader;
 7 import java.io.OutputStream;
 8 import java.net.Socket;
 9 
10 public class TCPClient {
11 
12     public static void main(String[] args) throws IOException {
13 
14         //创建TCP客户端服务
15         Socket s = new Socket("localhost", 8000);
16         //
17         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
18         String line = null;
19         while ((line = br.readLine()) != null) {
20             if ("over".equals(line)) {
21                 break;
22             }
23             OutputStream out = s.getOutputStream();
24             out.write(line.getBytes());
25             
26             byte[] buf = new byte[1024];
27             InputStream in = s.getInputStream();
28             in = s.getInputStream();
29             int len = in.read(buf);
30             String text = new String(buf, 0, len);
31             String ip = s.getInetAddress().getHostAddress();
32             System.out.println(ip + ": " + text);
33         }
34         
35         
36     }
37 
38 }

服务端:

 1 package TCPDemo;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.OutputStream;
 6 import java.net.ServerSocket;
 7 import java.net.Socket;
 8 
 9 public class TCPServer {
10 
11     public static void main(String[] args) throws IOException {
12 
13         //创建服务器套接字,端口号必须明确
14         ServerSocket serverSocket = new ServerSocket(8000);
15         
16         //监听来自客户端的套接字
17         Socket socket = serverSocket.accept();
18         while (true) {
19             try {
20 
21                 String ip = socket.getInetAddress().getHostAddress();
22                 byte[] buf = new byte[1024];
23 
24                 InputStream in = socket.getInputStream();
25                 int len = in.read(buf);
26                 String text = new String(buf, 0, len);
27                 System.out.println(ip + ":" + text);
28                 
29                 OutputStream out = socket.getOutputStream();
30                 out.write("已连接".getBytes());
31             } catch (Exception e) {
32                 // TODO: handle exception
33                 System.out.println(e.toString());
34             }
35             
36         }
37     }
38 
39 }

运行结果:

 4.UDP编程

客户端

 1 package TCPDemo;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.OutputStream;
 6 import java.net.ServerSocket;
 7 import java.net.Socket;
 8 
 9 public class TCPServer {
10 
11     public static void main(String[] args) throws IOException {
12 
13         //创建服务器套接字,端口号必须明确
14         ServerSocket serverSocket = new ServerSocket(8000);
15         
16         while (true) {
17             //监听来自客户端的套接字
18             try {
19                 Socket socket = serverSocket.accept();
20 
21                 String ip = socket.getInetAddress().getHostAddress();
22                 byte[] buf = new byte[1024];
23 
24                 InputStream in = socket.getInputStream();
25                 int len = in.read(buf);
26                 String text = new String(buf, 0, len);
27                 System.out.println(ip + ":" + text);
28                 
29                 OutputStream out = socket.getOutputStream();
30                 out.write("已连接".getBytes());
31             } catch (Exception e) {
32                 // TODO: handle exception
33                 System.out.println(e.toString());
34             }
35             
36         }
37     }
38 
39 }

服务端

 1 package UDPDemo;
 2 
 3 import java.io.IOException;
 4 import java.net.DatagramPacket;
 5 import java.net.DatagramSocket;
 6 
 7 public class UDPServer {
 8 
 9     public static void main(String[] args) throws IOException {
10         System.out.println("开启Server。。。。。");
11 
12         //建立接收端的UDPSocket服务,必须明确端口号
13         DatagramSocket ds = new DatagramSocket(8888);
14         while (true) {
15             
16             //创建数据包
17             byte[] buf = new byte[1024];
18             DatagramPacket dp = new DatagramPacket(buf, buf.length);
19             //使用接收方法将接收到的数据存储到数据包中
20             ds.receive(dp);
21             //对数据进行解析
22             String ip = dp.getAddress().getHostAddress();
23             int port = dp.getPort();
24             String text = new String(dp.getData(), 0 , dp.getLength());
25             System.out.println(ip + ": " + port + ": " + text);
26         }
27     }
28 
29 }

运行结果:

原文地址:https://www.cnblogs.com/xiongxuesong/p/4572306.html