java网络编程-tcp和udp的使用-TCP聊天和UDP文件上传与下载


前言

提示:本文章问题:
什么是网络?
何为网络协议?
IP和端口是干嘛的?
TCP和UDP协议、URL能干嘛?
如何通过Java写聊天程序,如何下载网络资源

什么是ip和端口号以及它们有什么用(电脑是通过什么来识别另一台电脑及内部的应用程序),TCP和UDP的主要区别,主要的通信协议,如何通过TCP和UDP实现聊天通讯,文件上传(客户端上传文件到服务器端)。


一、网络和网络协议

1.简单例子来形容网络编程

定义:就好像自己给朋友写一封信一样,需要知道对方的邮编、地址、姓名等信息,最后还要填写自己信息(姓名和地址等)。

在这里插入图片描述
计算机网络
是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

2.网络编程目的:

  • 无线电台…传播交流信息、数据交换、通信。
  • 需要做的准备:
  • ip、端口、定位到计算机上的某个资源。

3.OSI七大网络模型和四层概念模型

在这里插入图片描述

小结:
1.网络编程中有两个主要问题:

  • 如何准确的定位到网络上的一台或者多台主机
  • 找到主机之后如何进行通信

2.网络编程中的要素

  • IP和端口号
  • 网络通信协议 udp、tcp

二、IP和端口Port

1.IP(InelAddress)

  • 唯一定位一台网络计算机
  • 127.0.0.1:本机localhost

2.ip的值的分类

  • IPV4:4个字节组成,0-255;
  • IPV6:128位,8个无符号整数;
    如图:
    在这里插入图片描述
    公网(互联网),私网(局域网)
  • ABCDE类地址;

A类:1.0.0.1~126.255.255.254(0000 0001 0000 0000 0000 0000 0000 0001
~0111 1111 1110 1111 1111 1111 1111 1110),注意127.x.x.x不能用。
B类:128.0.0.1~191.255.255.254(1000 0000 0000 0000 0000 0000 0000 0001
~1011 1111 1111 1111 1111 1111 1111
1110),注意169.254.x.x被微软买断,用作用户获取不到IP时自动分配的IP地址。
C类:192.0.0.1~223.255.255.254(1100 0000 0000 0000 0000 0000 0000 0001
~1101 1111 1111 1111 1111 1111 1111 1110)
D类:224.0.0.1~239.255.255.254(1110 0000 0000 0000 0000 0000 0000 0001
~1110 1111 1111 1111 1111 1111 1111 1110)
E类:240.0.0.1~255.255.255.254(1111 0000 0000 0000 0000 0000 0000 0001
~1111 1111 1111 1111 1111 1111 1111 1110)
私有地址
A类:10.0.0.0~10.255.255.255
B类:172.16.0.0~172.31.255.255
C类:192.168.0.0~192.168.255.255
子网掩码
定义:
子网掩码 (Subnet mask)是一个32位的2进制数 ,它必须结合IP地址一起使用。
子网掩码只有一个作用,就是将某个IP地址划分成“网络地址”“主机地址”两部分。用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在广域网上。
举例:
有时候我们会看到192.168.1.123/24这样的表示方法,其中/24就是子网掩码255.255.255.0的缩写

默认子网掩码:

网络类型默认子类掩码缩写
A类255.0.0.0/8
B类255.255.0.0/16
C类255.255.255.0/24
  • 192.168.xx.xx专门给组织内部使用的。

2022/10/13-第100天(我与她)

代码测试:

import java.net.InetAddress;
import java.net.UnknownHostException;

public class NettoIp {
    public static void main(String[] args) throws UnknownHostException {
        //查询网站ip地址
        InetAddress inetAddress = InetAddress.getByName("www.baidu.com");
        //常用方法
        System.out.println(inetAddress.getCanonicalHostName());//ip规范的名字
        System.out.println(inetAddress.getHostAddress());//ip
        System.out.println(inetAddress.getHostName());//域名
    }
}

运行截图
在这里插入图片描述

2.端口Port

ip是确定唯一主机,端口号是用确定主机里面唯一的应用程序。

在这里插入图片描述

代码实例

import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;

public class NettoIp {
    public static void main(String[] args) throws UnknownHostException {
        //端口号常用的api函数
        InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1",8080);
        System.out.println(socketAddress);
        System.out.println(socketAddress.getAddress());
        System.out.println(socketAddress.getHostName());
        System.out.println(socketAddress.getPort());
    }
}

运行截图:
在这里插入图片描述
拓展:
在这里插入图片描述

三、通信协议

网络通信协议:速率、传输码率、代码结构、传输控制…

TCP(用户传输协议)

TCP/IP协议:实际上是一组协议;
ip:网络传输协议。

  • 连接、稳定;
  • 类似于打电话,是先准备好,建立连接通话;
  • 三次握手、四次挥手;
  • 客户端、服务器端;
  • 传输完成,释放链接,效率低。
    代码实例
    (1)简单的TCP聊天(服务器-客户端)
//客户端
//1.要知道服务器的地址和端口号
InteAddress 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());
finally
{
	if(os!=null)
	{
		os.close();
	}
	if(socket!=null)
	{
		socket.close();
	}
}

服务器端

//服务器端
//1.需要一个自己的地址:port端口号
ServerSocket serverSocket = new ServerSocket(9999);
//2.等待客户端链接过来,实现监听-》类似于c++ 中的Scaner
Socket socket = serverSocket.accept();
//3.读取客户端的消息
InputStream is = socket.getInputStream();
/*
//普通信息传输方式-》字节流
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer))!=-1)
{
	String msg = new String(buffer,0,len);
	System.out.println(msg);
}
*/
//管道流
ByteArrayOutStream 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());
finally
{
	if(baos!=null)
	{
		baos.close();
	}
	if(is!=null)
	{
		is.close();
	}
	if(socket!=null)
	{
		socket.close();
	}
	if(serverSocket!=null)
	{
		serverSocket.close();
	}
}

(2)TCP文件上传

//1.创建一个Socket链接
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);
//2.创建一个输出流
OutputStream os = socket.getOutputStream();

//3.读取文件
FileInputStream fis = new FileInputSrream(new File("baoru.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();
//String byte[]
ByteArrayOutputStream baos = new ByteArrayOutputStream();

bytr[] buffer2 = new byte[1024];
int len2;
while((len2 = inputStream.read(buffer2))!=-1)
{
	baos.write(buffer2,0,len2);
}
System.out.println(baos.toString());

//5.关闭资源
baos.close();
inputStream.close();
fis.close();
os.close();
socket.close();

服务器

//服务器端
//1.创建服务
ServerSocket serverSocket = new ServerSocket(9000);
//监听客户端的链接
Socket socket = serverSocket.accept();//阻塞式监听,会一直等待客户端链接

//3.获取输入流
InputStream is = socket.getInputStream();

//4.文件输出
FileOutputStrem fos = new FileOutputStream(new File("receive.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("我接受完毕了,你可以断开了",getBytes());

//关闭资源
fos.close();
is.close();
socket.close();
serverSocket.close();


UDP(用户数据报协议)

  • 不连接、不稳定;
  • 类似于发信息,不管有没有准备好都会发给你;
  • 客户端、服务器端,没有明确的界限
  • 导弹原理、

四、通过url下载文件

该处使用的url网络请求的数据。
代码示例:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class UrlDown {
    public static void main(String[] args) throws IOException {
        //1.下载url
        URL url = new URL("https://webfs.ali.kugou.com/202205222150/eeb3c7ac322beadd5be3bf63977f816d/part/0/960115/KGTX/CLTX001/ac4f18157bc6f54e755132823d241bbd.mp3");
        //2.链接到这个资源
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

        InputStream inputStream = urlConnection.getInputStream();
        FileOutputStream fileOutputStream = new FileOutputStream("4.mp3");//输出文件类型以及文件名

        //转换为字节流的形式
        byte[] buffer=new byte[1024];
        int len;
        while((len=inputStream.read(buffer))!=-1){
            fileOutputStream.write(buffer,0,len);
        }
        //断开链接
        fileOutputStream.close();
        inputStream.close();
        urlConnection.disconnect();
    }
}


总结

在过三天,是一个值得纪念的日子。
愿我们能够一起相伴下去,一起努力下去。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴躁茹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值