网络编程的开始(猫娘和汪君的凄美爱情故事)

现在让我们(快乐的)来学习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:君不见,妾托信使寄相思?
----------------
汪君回信: 欲以深情,与卿白头,然匈奴未灭,不敢家为!
猫娘:自古妾身与夫君,人间不许见白头;定当壮君鸿鹄志,小窗幽院空自愁。

这就是目前学到的所有的网络编程的基础。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值