现在让我们(快乐的)来学习java中的网络编程
(猫娘和汪君在最后)
一、认识InetAddress
1.首先通过查阅API帮助文档
我们知道,InetAddress是net包下的一个类,表示互联网协议(IP)地址。
2.然后我们往下查看它的常用方法
对于一个方法,阅读的时候要注意,功能、需要我们提供给方法的值的类型、返回值的类型,大体了解后继续往下走。
3.接下来我们通过一段代码来学习InetAddress
package 网络编程;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressTest {
public static void main(String[] args) throws UnknownHostException {
InetAddress[] ips = InetAddress.getAllByName("www.baidu.com");
for(InetAddress ip:ips) {
System.out.println(ip);
}//ips作为百度的ip地址的集合,用for循环输出
System.out.println("==============");
InetAddress ip = InetAddress.getByName("localhost");//返回本机ip
System.out.println(ip);
System.out.println("==============");
InetAddress ip2 = InetAddress.getLocalHost();//同样是返回本机ip
System.out.println(ip2);
System.out.println(ip2.getHostName());//输出本机名
}
}
运行结果为:
www.baidu.com/119.75.217.109
www.baidu.com/119.75.217.26
==============
localhost/127.0.0.1
==============
DESKTOP-BN6OHT3
二、URL的学习
1.查阅帮助文档
URL是net包下的一个类,URL的中文名是统一资源定位符,外文名是Uniform Resource Locator,具体可分成几个部分:
(1)协议
(2)文件所在的服务器的名称或IP地址,后面是到达这个文件的路径和文件本身的名称。
2.查看常用构造方法和常用方法
3.然后通过一个代码来实践里面提到的方法
package 网络编程;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
public class URLTest {
public static void main(String[] args) throws IOException {
URL url = new URL("https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=URL&rsv_pq=ecf631580002d369&rsv_t=c3e1xfOEvgtYFqWVscp62vOHgsWPJkqOCcx4upAeKgEpmAUoFaYG4e3itMI&rqlang=cn&rsv_enter=1&rsv_sug3=2&rsv_n=2");
//输出url的协议名
System.out.println("1 "+url.getProtocol());
//输出此url的主机名
System.out.println("2 "+url.getHost());
//输出url端口号(注:访问客户端端口号时只会返回0和-1
System.out.println("3 "+url.getPort());
//获取与此 URL 关联协议的默认端口号。
System.out.println("4 "+url.getDefaultPort());
//输出url的路径部分
System.out.println("5 "+url.getPath());
//输出url的查询部分
System.out.println("6 "+url.getQuery());
//输出此url的文件名(也就是路径和查询的合体)
System.out.println("7 "+url.getFile());
System.out.println("================================");
//打开到此 URL 的连接并返回一个用于从该连接读入的输入流
InputStream is = url.openStream();
FileWriter fw = new FileWriter("d:/lin/god.txt");
//BufferedReader类能从字符输入流中读取文本,缓冲各个字符,实现高效读取
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String line = null;
while((line=br.readLine())!=null) {
fw.write(line);
fw.write("\n");
}
br.close();
is.close();
fw.close();
}
}
输出结果为:
1 https
2 www.baidu.com
3 -1
4 443
5 /s
6 ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=URL&rsv_pq=ecf631580002d369&rsv_t=c3e1xfOEvgtYFqWVscp62vOHgsWPJkqOCcx4upAeKgEpmAUoFaYG4e3itMI&rqlang=cn&rsv_enter=1&rsv_sug3=2&rsv_n=2
7 /s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=URL&rsv_pq=ecf631580002d369&rsv_t=c3e1xfOEvgtYFqWVscp62vOHgsWPJkqOCcx4upAeKgEpmAUoFaYG4e3itMI&rqlang=cn&rsv_enter=1&rsv_sug3=2&rsv_n=2
================================
下面的是将信息读取到了一个txt文档中,在此不显示,当然也可以直接的添加到一个空的.html文档中,只要改变编码模式,能基本复原原网页框架。
三、TCP和UDP协议特点
1.TCP–就像打电话,可靠传输
2.UDP协议–就像写信,寄邮件,不能保证可靠传输,但是速度快。
1.1 小狗服务器,TCPServer
打电话当然要两方通话啦,所以有服务器,和客户端,首先是服务器的代码和运行结果,两者是相通的
package TCP;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPserve {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);//创建绑定到制定端口的服务器套接字
while(true) {//意为接受多个客户端发出的信息
//第一环节
Socket socket = ss.accept();//等待客户端应答
System.out.println("服务器:");
System.out.println(socket);
//第二环节,接受客户端的问候,并显示
System.out.println("----------------");
InputStream iss = socket.getInputStream();
byte[] bytes = new byte[10];
String str = null;
int len = 0;
while((len = iss.read(bytes)) != -1) {
str = new String(bytes, 0, len);
System.out.println(str);
}
System.out.println("服务器: get it!!");
//第三环节,互动环节,向客户端示好
System.out.println("---------------");
OutputStream os = socket.getOutputStream();
os.write("服务器:woof!".getBytes());
socket.shutdownInput();
System.out.println("服务器:reply!");
//将输出输出流关闭,套接字关闭
iss.close();
os.close();
socket.close();
//当接收到end时,表示不再接收数据,关闭服务器
if(str.equals("end"))
break;
}
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出:
服务器:
Socket[addr=/192.168.1.106,port=63828,localport=8888]
----------------
client:meow!
服务器: get it!!
---------------
服务器:reply!
1.2 小猫客户端,TCPClient
package TCP;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPClient {
public static void main(String[] args) {
try {
Socket socket = new Socket(InetAddress.getLocalHost(),8888);
//创建一个流套接字并将其链接到指定IP地址的指定端口号
//第一阶段
System.out.println("客户:");
System.out.println(socket);
//第二阶段,從客戶端发送,服務端輸出
System.out.println("---------------");
OutputStream os = socket.getOutputStream();
os.write("client:meow!".getBytes());
socket.shutdownOutput();//此套接字的输入流位于“流的末尾”
System.out.println("客户端:send!");
//第三阶段
System.out.println("---------------");
InputStream is = socket.getInputStream();
byte[] b = new byte[1024];
int len = 0;
String str = null;
while((len = is.read(b)) != -1) {
str = new String(b,0,len);
System.out.println(str);
}
System.out.println("客户端: get it!");
is.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出:
客户:
Socket[addr=DESKTOP-BN6OHT3/192.168.1.106,port=8888,localport=63828]
---------------
客户端:send!
---------------
服务器:woof!
客户端: get it!
两个代码想要干什么呢,
首先把小猫在猫窝打电话,小猫说,这里是“猫窝”,我打的是“xxxx”这个号码,我是“xxxxx”这个号码,
小狗在狗窝接电话,也是如此。
然后大概就是小猫对小狗meow了一声之后,小狗收到后,反过来对小猫woof了一声。
2、最后要讲的是猫娘和汪君的凄美爱情故事
故事发生在南北朝时期,汪君为国攻城略地,雄姿英发,猫娘嫁与汪君后独守空房五载,只能够通过DatagramSocket(数据报套接字),也就是驿站,来传达心意。他们用的信封是Datagrampocket牌的信封。
2.1 地点有两个:一个是汪君所在的9996战场
package TCP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPServer {
public static void main(String[] args) {
try {
//数据报套接字,是包投递服务的发送或接收点,相当于邮局的作用
//此构造方法相当于将数据报套接字绑定到本机的9996端口
DatagramSocket ds = new DatagramSocket(9996);
byte[] data = new byte[1024];
DatagramPacket dp = new DatagramPacket(data,data.length);
ds.receive(dp);
byte[] data2 = dp.getData();
int length = dp.getLength();
InetAddress ip = dp.getAddress();
int port = dp.getPort();
String str = new String(data2,0,length);
System.out.println("猫娘来信中写道:"+str);
System.out.println("汪君含泪喃喃自语道:"+"DogServer:吾闻矣,五岳无棱不负卿!");
System.out.println("------------------");
//随即汪君给猫娘回信
System.out.println("汪君写了一封信给猫娘");
byte[] reply = "欲以深情,与卿白头,然匈奴未灭,不敢家为!".getBytes();
DatagramPacket dgp = new DatagramPacket(reply,reply.length,InetAddress.getLocalHost(),9977);
ds.send(dgp);
System.out.println("交给信使,信使从服务器出发了");
ds.close();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出结果为:
猫娘来信中写道:meow~meow~
汪君含泪喃喃自语道:DogServer:吾闻矣,五岳无棱不负卿!
------------------
汪君写了一封信给猫娘
交给信使,信使从服务器出发了
2.2 另一方是远在天边的9977深闺
package TCP;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class UDPClient {
public static void main(String[] args) {
try {
DatagramSocket ds = new DatagramSocket(9977);//系统自动分配
//客户端向服务器通信,相当于写信
byte[] buf = "meow~meow~".getBytes();
//此类表示数据报包,相当于一封信,信的内容、长度,将要邮往的地址和门牌号
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 9996);
ds.send(dp);
System.out.println("CatClient:君不见,妾托信使寄相思?");
System.out.println("----------------");
//猫娘收到回信
//感觉这就是固定的收信格式,就当做猫娘不忍看汪君征战沙场的地方,只看信的内容和长度吧
byte[] reply = new byte[1024];
DatagramPacket dgp = new DatagramPacket(reply,reply.length);
ds.receive(dgp);
String str = new String(dgp.getData(),0,dgp.getData().length);
System.out.println("汪君回信: "+str);
System.out.println("猫娘:自古妾身与夫君,人间不许见白头;定当壮君鸿鹄志,小窗幽院空自愁。");
ds.close();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出结果为:
CatClient:君不见,妾托信使寄相思?
----------------
汪君回信: 欲以深情,与卿白头,然匈奴未灭,不敢家为!
猫娘:自古妾身与夫君,人间不许见白头;定当壮君鸿鹄志,小窗幽院空自愁。
这就是目前学到的所有的网络编程的基础。