Java 网络编程


前言

在进行网页编程和多线程的学习之前需要对网络编程有足够的了解以及学会如何去运用进程序当中


一、什么是计算机网络?

在没有互联网之前,我们都是通过写书信然后由邮递员送到我们指定人的手上。随着科技的发展,现在已经是通过网络把整个地球连接起来了,正如人们说描述的那样形成了一个地球村。而计算机网络就是这个的代表物,两台电脑之间想要传输照片或者视频,就需要计算机网络来辅助。总而言之,计算机网络就是连接分散计算机设备以实现信息传递的系统。

二、网络通信的两个重要因素

1.通讯双方的地址

1)ip

例如:192.0.0.1

2)端口号

例如:8080、3306等

2.规则:网络协议

例如:TCP/IP HTTP,HTTPS,FTP....

三、Ip地址

1.InetAddress

因为没有构造方法所以不能通过new的方式创建一个InetAddress对象。

通过静态调用我们可以使用以下的方法来获取一台网络计算机的ip地址

1、getByName()

2、getLocalHost()

3、getAllByName()

4、getLoopbackAddress()

5、getByAddress()

2.Ip的分类

1)ipv4/ipv6

ipv4:32位,由四个字节组成,从0-255. 例如:127.0.0.1

ipv6:128位,8个无符号整数构成 例如:2022:1aaa:2bbb:3ccc:4ddd:0000:0000:12ab

2)公网(互联网)和私网(局域网)

通过a,b,c,d,e来划分

a类:1.0.0.0~126.0.0.0 子网:255.0.0.0

b类:128.0.0.0~191.255.0.0子网:255.255.0.0

c类:192.0.0.0~223.255.255.0子网:255.255.255.0

d类:多播地址

e类:保留地址

私有地址a,b,c

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

3.域名

通常ip不是很好记忆所以通过域名来记忆ip


四、端口

1.什么是端口

可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。电话使用RJ11插口也属于物理端口的范畴。

2.端口的分类

端口是从0~65535,TCP和UDP是独立分开计算的所以总共会有65535*2的端口号

1)公有端口

从0~1023,比如HTTP:80,HTTPS:443,FTP:21,Telent:23

2)程序注册端口

1024~49151,分配给用户或者程序,如Mysql:3306,Tomcat:8080

3)动态、私有端口

从49152~65535

4)cmd查看端口指令

1、netstat -ano -------查看所有端口

2、netstat -ano|findstr ----------查看指定端口

3、tasklist|findstr --------------查看指定端口的进程

5)InetSocketAddress类

1、getAddress()

2、getHostString()

3、getHostString()

4、getPort()

5、getHostName()

五、通信协议

1.TCP

连接,稳定

有客户端和服务器端

传输完成,释放连接,效率低

1)三次握手

1、第一次握手

客户端发送请求给服务器端,希望与服务器端建立连接,并进入等待状态,等待服务器端确认

2、第二次握手

服务器端检测到客户端想要建立连接,经设置后表示收到客户端的信息并也想与客户端建立连接的信息

3、第三次握手

客户端接受服务器传来的信息后发送数据包给服务器端,服务器端检查如果正确,则客户端与服务器端建立连接,并可以进行数据的传输

2)四次挥手

1、第一次挥手

客户端发送请求想要终止连接的信息给服务器端,停止发送信息并进入等待状态,等待服务器端确认

2、第二次挥手

服务器端接受到客户端发来的停止连接信息,并传递消息给上层,然后进入关闭等待状态,虽然此时客户端已经不会发送数据到服务器端,但是服务器端仍能发送数据到客户端

3、第三次挥手

客户端接受到服务器端的信息后,进入最终等待状态。此时服务器端再次发送断开连接的信息,并等待客户端确认

4、第四次挥手

客户端接收到信息后发出确认断开连接的信息后,服务器端立刻关闭连接,但是客户端需要等待2*MSL(最长报文段寿命)的时间后,客户端才进入CLOSED状态关闭连接

2.UDP

不连接,不稳定

有客户端和服务器端,但是无明显区别

不管是否接收,都会先传输给你

六、TCP实现聊天

1.客户端

要与服务器端连接,就必须要获取到服务器的ip和端口,然后协议是TCP协议,然后然后通过套接字传入ip和端口,创建输出流,并写入要传输的内容

示例代码
public class Client {
    public static void main(String[] args) throws IOException {
        //创建InetAddress对象用来获取ip地址
        InetAddress localhost = InetAddress.getByName("localhost");
        //创建服务器给定的端口号
        int port = 6693;
        //创建套接字对象并传入ip和端口号
        Socket socket = new Socket(localhost,port);

        //创建输出流,并写入要传输的内容
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("你好啊".getBytes());

        //关闭流
        outputStream.close();
        socket.close();
    }
}

2.服务器端

创建套接字对象,并监听指定端口,创建输入流来获取客户端传来的数据,然后创建一个管道流保证不会乱码

示例代码
public class Service {
    public static void main(String[] args) throws IOException,InterruptedException {
        //创建服务器套接字对象,并监听指定端口
        ServerSocket serverSocket = new ServerSocket(6693);
        System.out.println("服务器开启ing......");

        //模拟服务器开启过程
        Thread.sleep(1200);
        System.out.println("服务器已开启");

        //接收客户端传来的数据
        Socket accept = serverSocket.accept();

        //创建输入流
        InputStream inputStream = accept.getInputStream();
        System.out.println("服务器接收成功");
        //创建管道输出流,保证不会乱码
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        int len = 0;
        byte[] bytes = new byte[1024];
        //边读边写
        while((len=inputStream.read(bytes))!=-1){
            byteArrayOutputStream.write(bytes,0,len);
        }
        //返回获取到的客户端文件
        System.out.println("client:   "+byteArrayOutputStream.toString());


        //关闭服务器和流
        Thread.sleep(5000);
        byteArrayOutputStream.close();

        inputStream.close();
        serverSocket.close();

        System.out.println("服务器关闭成功");
    }
}

七、TCP实现上传

1.客户端

客户端需要通过字节或者字符输入流来获取图片或者文件,然后再通过输出流传入到套接字中

示例代码
public class Client {
    public static void main(String[] args) throws IOException {
        //创建InetAddress对象用来获取ip地址
        InetAddress localhost = InetAddress.getByName("localhost");
        //创建服务器给定的端口号
        int port = 6693;
        //创建套接字对象并传入ip和端口号
        Socket socket = new Socket(localhost,port);
        OutputStream os = socket.getOutputStream();

        //创建输出流,并写入要传输的内容
        FileInputStream in = new FileInputStream("d:\\picture\\pixiv\\小奏.jpg");
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len=in.read(bytes))!=-1){
            os.write(bytes,0,len);
        }

        //关闭流
        in.close();
        os.close();
        socket.close();
    }
}

2.服务器端

创建套接字对象,并监听指定端口,创建输入流来获取客户端传来的数据,然后创建一个管道流保证不会乱码

示例代码
public class Service {
    public static void main(String[] args) throws IOException,InterruptedException {
        //创建服务器套接字对象,并监听指定端口
        ServerSocket serverSocket = new ServerSocket(6693);
        System.out.println("服务器开启ing......");

        //模拟服务器开启过程
        Thread.sleep(1200);
        System.out.println("服务器已开启");

        //接收客户端传来的数据
        Socket accept = serverSocket.accept();

        //创建输入流
        InputStream inputStream = accept.getInputStream();
        System.out.println("服务器接收成功");
        //创建管道输出流,保证不会乱码
        FileOutputStream fo = new FileOutputStream(new File("test"));
        int len = 0;
        byte[] bytes = new byte[1024];
        //边读边写
        while((len=inputStream.read(bytes))!=-1){
            fo.write(bytes,0,len);
        }
        //返回获取到的客户端文件
        System.out.println("client:   "+fo.toString());


        //关闭服务器和流
        Thread.sleep(5000);
        fo.close();

        inputStream.close();
        serverSocket.close();

        System.out.println("服务器关闭成功");
    }
}

八、UDP实现聊天

1.接收端/传输端1

与TCP协议不同的是,UDP只需要你知道对方的IP、端口就可以直接发送包给你但是并不需要你去确认收到,而且没有TCP的C/S或者B/S模式,接收端也可以是发送端

示例代码
public class Udp1 {
    public static void main(String[] args) throws IOException {
        //创建套接字,并监听端口
        DatagramSocket datagramSocket = new DatagramSocket(6603);

        //创建输入流,并读取控制台输入信息
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        //将传入信息放入byte数组
        String msg = reader.readLine();
        byte[] buffer = msg.getBytes();

        //创建包
        DatagramPacket packet =
                new DatagramPacket(buffer,0,buffer.length,
                        new InetSocketAddress("localhost",6604));

        //发送包
        datagramSocket.send(packet);

        
        //准备接收包
        byte[] buffer2 = new byte[1024];
        DatagramPacket packet2 = new DatagramPacket(buffer2,0,buffer2.length);


        //接收包并输出
        datagramSocket.receive(packet2);
        System.out.println(new String(buffer2, 0, buffer2.length));

        //关闭流
        reader.close();
        datagramSocket.close();
    }
}

2.接收端/传输端2

与1一样,创建接收和传输的内容即可,只不过是与1的代码相调换了顺序

示例代码
public class Udp2 {
    public static void main(String[] args) throws IOException {
        
        DatagramSocket datagramSocket = new DatagramSocket(6604);
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);


        datagramSocket.receive(packet);
        System.out.println(new String(buffer, 0, buffer.length));


        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        String msg = reader.readLine();
        byte[] buffer2 = msg.getBytes();

        DatagramPacket packet2 =
                new DatagramPacket(buffer2,0,buffer2.length,
                        new InetSocketAddress("localhost",6603));

        datagramSocket.send(packet2);

        reader.close();
        datagramSocket.close();
    }
}

总结

网络变成更多的还是流的使用,而真正进行通讯的只是需要ip端口,和协议,然后通过套接字就可以实现了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值