Java——(十)网络编程

时间:2023-03-09 21:01:48
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类的简单用法。

 package com.socket;

 import java.net.InetAddress;

 public class InetAddressTest {

     public static void main(String[] args) throws Exception {

         // 根据主机名来获取对应的InetAddress实例
InetAddress ipAddress = InetAddress
.getByName("www.4399.com");
//判断是否可达
System.out.println("4399网址是否可达:" + ipAddress.isReachable());
//获取该InetAdress实例的IP字符串
System.out.println(ipAddress.getHostAddress());
//获取本机IP地址对应的InetAdress实例
System.out.println("本机IP:"+ InetAddress.getLocalHost());
//根据原始IP地址来获取对应的InetAdress实例
InetAddress local = InetAddress.getByAddress(new byte[]{,,,});
System.out.println("本机是否可达:" + local.isReachable());
//获取该InetAdress实例对应的全限定域名
System.out.println(local.getCanonicalHostName());
} }

运行结果:

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字符串之前,现在浏览器搜索关键字“黑马程序员”,将看到

下图所示界面。

 Java——(十)网络编程

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

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字符串。

 package com.socket;

 import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder; public class URLDecoderTest { public static void main(String[] args) throws UnsupportedEncodingException { // 将application/x-www-form-urlencoded MIME字符串转换成普通字符串
String keyString = URLDecoder.decode(
"%E9%BB%91%E9%A9%AC%E7%A8%8B%E5%BA%8F%E5%91%98", "UTF-8");
System.out.println(keyString);
//将普通字符串转换成application/x-www-form-urlencoded MIME字符串
String urlString = URLEncoder.encode("黑马程序员", "UTF-8");
System.out.println(urlString);
} }

运行结果:

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

提示:

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

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

3.使用URLhURLConnection

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

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

protocol://host:port/resourceName

例如如下的URL地址:

http://www.4399.com

3.TCP编程

客户端:

 package TCPDemo;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket; public class TCPClient { public static void main(String[] args) throws IOException { //创建TCP客户端服务
Socket s = new Socket("localhost", 8000);
//
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = br.readLine()) != null) {
if ("over".equals(line)) {
break;
}
OutputStream out = s.getOutputStream();
out.write(line.getBytes()); byte[] buf = new byte[1024];
InputStream in = s.getInputStream();
in = s.getInputStream();
int len = in.read(buf);
String text = new String(buf, 0, len);
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip + ": " + text);
} } }

服务端:

 package TCPDemo;

 import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class TCPServer { public static void main(String[] args) throws IOException { //创建服务器套接字,端口号必须明确
ServerSocket serverSocket = new ServerSocket(8000); //监听来自客户端的套接字
Socket socket = serverSocket.accept();
while (true) {
try { String ip = socket.getInetAddress().getHostAddress();
byte[] buf = new byte[1024]; InputStream in = socket.getInputStream();
int len = in.read(buf);
String text = new String(buf, 0, len);
System.out.println(ip + ":" + text); OutputStream out = socket.getOutputStream();
out.write("已连接".getBytes());
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.toString());
} }
} }

运行结果:

Java——(十)网络编程

4.UDP编程

客户端

 package TCPDemo;

 import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; public class TCPServer { public static void main(String[] args) throws IOException { //创建服务器套接字,端口号必须明确
ServerSocket serverSocket = new ServerSocket(8000); while (true) {
//监听来自客户端的套接字
try {
Socket socket = serverSocket.accept(); String ip = socket.getInetAddress().getHostAddress();
byte[] buf = new byte[1024]; InputStream in = socket.getInputStream();
int len = in.read(buf);
String text = new String(buf, 0, len);
System.out.println(ip + ":" + text); OutputStream out = socket.getOutputStream();
out.write("已连接".getBytes());
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.toString());
} }
} }

服务端

 package UDPDemo;

 import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket; public class UDPServer { public static void main(String[] args) throws IOException {
System.out.println("开启Server。。。。。"); //建立接收端的UDPSocket服务,必须明确端口号
DatagramSocket ds = new DatagramSocket(8888);
while (true) { //创建数据包
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//使用接收方法将接收到的数据存储到数据包中
ds.receive(dp);
//对数据进行解析
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text = new String(dp.getData(), 0 , dp.getLength());
System.out.println(ip + ": " + port + ": " + text);
}
} }

运行结果:

Java——(十)网络编程