Java网络编程

1. 网络通信

计算机网路:将不同地理位置的电脑通过某种协议连接起来
网络编程的目的:数据交换、通信
网络通信需要解决几个问题:
1. 如何准确的定位网络上的一台主机:端口,定位到这个计算机上的某个资源
2. 找到这个主机,如何传输数据呢?

注意:网络编程和网页编程(javaweb)是两个不同的概念,网络编程是C/S架构,网页编程是B/S架构

网络通信的要素:
通信双方地址:IP、端口号
规则(网络通信协议):TCP/IP参考模型

2. IP地址

IP地址的分类
IPV4/IPV6:
IPV4 : 4个字节组成,0~255,共42亿,有30亿都在北美,亚洲4亿,2011年就用尽了
IPV6: 128位,8个无符号整数
公网-私网:
公网:互联网使用,ABCD类地址
私网:局域网,192.168.XX.XX
域名:解决记忆IP的问题

public static void main(String[] args){
	//一般作为参数传递的,不会单独拿出来,没意义
	InetAddress ina = InetAddress.getByName("127.0.0.1");
}

3. 端口Port

端口表示计算机上的一个程序的进程:
1. 不同的进程有不同的端口号,用来区分软件的
2. 被规定0~65535,分别支持TCP和UDP,所以一共是65535*2个端口,单个协议下端口号不能冲突
3. 端口分类:公有端口(0-1023) 程序注册端口(1024-49151) 私有端口(49152-65535)
共有端口: HTTP 80 HTTPS 443 FTP 21 SSH 22 Telent 23
程序注册端口:Tomcat 8080 MYSQL 3306 Oracle 1521

netstat -ano // 查看所有端口
netstat -ano|findstr “5900” //查看指定的端口

public static void main(String[] args){
	//一般作为参数传递的,不会单独拿出来,没意义
	InetSocketAddress isa = new InetSocketAddress ("127.0.0.1",8080);
}

4. 通信协议

TCP/IP协议簇,其中比较重要的两个协议有TCP和UDP
TCP: 用户传输协议,三次握手四次挥手
UDP: 用户数据报协议

三次握手
在这里插入图片描述
四次挥手
A:我要走了
B:你真的要走了吗?
B:你真的真的要走了吗?
A:我真的要走了

5. TCP通信 (了解)

底层代码,实际很少用到

public class TCPClientDemo{
	public static void main(String[] agrs){
		ServerSocket ss = null;
		Socket socket = null;
		InputStream is = null;
		ByteArrayOutputStream baos = null;
		try{
			//首先要有个地址,服务端的地址是localhost:9999,客户端要连接这个地址
			ss = new ServerSocket(9999);
			while(true){
				//等待客户端连接过来(从客户端拿过来的消息)
				socket = ss.accept();
				//读取客户端的消息
				is = socket.getInputStream();
				//用管道流读
				baos = new ByteArrayOutputStream();
				byte[] buffer = new byte[1024];
				int len;
				while((len = is.read(buffer)!= -1){
					baos.write(buffer,0,len);
				}
				System.out.println(baos.toString());
			}
		}catch(IOException e){
			e.printStackTrace();
		}finally{
			//自行优化,还有if **!=null try...catch
			baos.close();
			is.close();
			socket.close();
			ss.close();
		}
	}
}
public class TCPServerDemo{
	public static void main(String[] args){
		//要知道服务器的地址
		try{
			//1. 服务的地址
			InetAddress serverIp = InetAddress.getByName("127.0.0.1")
			int port = 9999;
			//2. 创建一个socket连接
			Socket socket = new Socket(serverIP, port);
			//3. 发送消息IO流
			OutputStream os = socket.getOutputStream();
			os.write("要发送的内容".getBytes());
			
		}catch(Exception e){
			e.printStackTrace();
		}
		//这里的finally写代码时自行补充
	}
	
}

6. TCP文件上传(了解)

public class TCPClientDemo2{
	public static void main(String[] args){
		//1. 创建一个socket连接
		Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
		//2. 创建一个输出流
		OutputStream os = socket.getOutputStream();
		//3. 文件输入流,读取本地的文件
		FileInputStream fis = new FileInputStream(new File("wenjianname.jpg"));
		//4. 写出文件,发送给服务端
		byte[] buffer = new byte[1024];
		int len;
		while(len = fis.read(buffer)!= -1){
			os.write(buffer, 0 ,len);
		}

		//通知服务器,我已经传输完了
		socket.shutdownOutput();
		
		//确定服务器接收完毕,断开连接
		InputStream inputStream =socket.getInputStream();
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		byte[] buffer2 = new byte[1024];
		int len2;
		while((len2=inputSteam.read(buffer2))!=-1){
			baos.write(buffer2, 0, len2);
		}
		System.out.println(baos.toString());
		//5. 关闭资源省略
	}
}

pubic class TCPServerDemo2{
	public static void main(String[] args){
		//1. 创建服务
		ServerSocket serverSocket = new ServerSocket(9000);
		//2. 监听客户端的连接,阻塞式监听会一直等待客户端连接
		Socket socket = serserSocket.accept();
		//3. 获取输入流
		InputStream is = socket.getInputStream();
		//4. 文件输出
		FileOutputStream fos = new FileOutputStream(new File("wenjianname.jpg");
		byte[] buffer = new byte[1024];
		int len;
		while(len = is.read(buffer)!= -1){
			fos.write(buffer, 0 ,len);
		}
		//通知服务器,接收完毕
		OutputStream os = socket.getOutputStream();
		os.write("我接收完毕了,你可以断开了")
		//关闭资源,省略
	}
}

7. Tomcat

服务器端用Tomcat, 客户端用浏览器,B/S结构

8. UDP

不用连接,需要知道对方地址,涉及到的两个类DatagramPacket和DatagramSocket.
UDP没有严格意义上的服务端和客户端,只要给IP和端口,可以互相发消息,也不用建立连接

public class UdpClientDemo1{
	public static void main(String[] args){
		//1. 创建一个Socket
		DatagramSocket socket = new DatagramSocket();
		//2. 建个包
		String msg = "hell0";
		//发送给谁
		InetAddress ip = InetAddress.getByName("localhost");
		int port = 9090;
		DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length(),ip, port);
		//3. 发送包
		socket.send(packet);
		//4. 关闭流
		socket.close();
	}
}
//服务端开放端口
public class UdpServerDemo2{
	public static void main(String[] args){
		//开放端口
		DatagramSocket socket = new DatagramSocket(9090);
		//接收数据
		byte[] buffer = new byte[1024];
		DatagramPacket packet = new DatagramPacket(buffer,0, buffer.length);
		socket.receive(packet);
		System.out.println(new String(packet.getData(),0,packet.getLength()));
		//关闭连接
		socket.close();
	}
}

9. URL

统一资源定位符,定位互联网上的某个资源,如https://www.baidu.com
组成:
协议://IP地址(DNS域名解析) :端口/项目名/资源

URL url = new URL("http://");*

public class UrlDown{
	public static void main(String[] args) throws Exception{
		//1. 下载地址
		URL url = new URL("***");
		//2. 连接到这个资源HTTP
		HttpURLConnection uc = (HttpURLConnection)url.openConnection();
		InputStream is = uc.getInputStream();
		//要存的文件是个什么样的格式 就写入什么格式的文件
		FileOutputStream fos = new FileOutputStream("***.txt");
		byte[] buffer = new byte[1024];
		int len;
		while((len=is.read(buffer))!=-1){
			//写出数据
			fos.write(buffer, 0, len)
		}
		fos.close();
		is.close();
		uc.disconnect();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值