现在让我们(快乐的)来学习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");//返回本机ipSystem.out.println(ip);System.out.println("==============");InetAddress ip2 = InetAddress.getLocalHost();//同样是返回本机ipSystem.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和-1System.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 blocke.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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}输出结果为:
CatClient:君不见,妾托信使寄相思?
----------------
汪君回信: 欲以深情,与卿白头,然匈奴未灭,不敢家为!
猫娘:自古妾身与夫君,人间不许见白头;定当壮君鸿鹄志,小窗幽院空自愁。
这就是目前学到的所有的网络编程的基础。