0
点赞
收藏
分享

微信扫一扫

第九章:网络编程

晗韩不普通 2022-04-13 阅读 192

第九章:网络编程

1.网络编程的概述

1.什么是计算机网络:

把分布在不同地理区域的具有独立功能的计算机(各种设备),通过通信设备与线路(网线)连接起来,有功能完善的软件实现资源共享和信息传递系统

2.什么叫网络编程:

我们写的程序可以支持网络通信,实现程序与程序之间互联互通。

java提供的网络类库,可以实现网络连接,联网的底层细节被隐藏在Java本机安装系统里 ,由JVM控制,并且Java实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境

3.网络编程的目的:

直接或间接的通过网络协议与其他计算机进行通讯

4.网络编程要素:

如何找到对方主机(电脑):IP

如何可靠高效的进行数据传输:通信协议

2.网络模型

一端与另一端进行网络通信过程中的模型

OSI参考模型:理想中的规范

 

TCP/IP模型:实际中的规范

 

3.网络通信要素:IP,端口号,通信协议

1.IP地址:互联网协议地址 又译为忘记协议地址,网络中的计算机使用IP地址来进行唯一标识(网络中一个计算机地址)

本机回环地址:如127.0.0.1 没网卡的情况下访问本机软件

cmd里输入ipconfig

2.端口号:与计算机上安装的软件有关

一个电脑上安装了许多软件,可以为运营中的程序分配一个端口号

一般访问:

IP(找主机)+端口(找程序)

3.通信协议:就是约定,通信双方如何发送数据,出错了怎么办 速率啊啥的

两个非常著名的传输层协议:

TCP:传输控制协议(客服端与服务端之间的通信协议

UDP:用户数据报协议

4.TCP协议

速度慢 需要建立连接 释放连接

发送前要进行3次握手,确保连接通道是顺畅的

TCP三次握手:

 

 

四次挥手:传输完毕后关闭是一个过程 不是啪的就关闭了 要进行四次挥手

 

5.UDP协议

将数据、源(从哪发出)、目的封装成数据报,不需要建立连接 故不是可靠的 但发送数据结束时无需释放资源,所以速度快。每个数据报大小限制在64K

 

6.java支持TCP和UDP通信协议的实现类

Socket是基于TCP协议的

客户端:

package feifan;
​
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
​
public class Wangluokehuduan {
    public static void main(String[] args) throws IOException {
        //客户端Socket,创建时会3次握手建立连接
​
        Socket socket=new Socket("192.168.223.5",9999);//IP+端口
​
        OutputStream out=socket.getOutputStream();
​
        out.write("林书豪".getBytes("utf-8"));
     /*   out.write("加油".getBytes("utf-8"));*/
​
        InputStream in=socket.getInputStream();
        byte[] b=new byte[100];
        int size=in.read(b);
​
        String s=new String(b,0,size,"utf-8");
        System.out.println(s);
​
​
    }
}
​

服务端:

package feifan;
​
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
​
public class Wangluofuwuduan {
    public static void main(String[] args) throws IOException {
        //客户端与服务器连接
​
        //建立服务器
        ServerSocket serverSocket=new ServerSocket(9999);//端口在0-65535之间  不能使用已存在的端口
        System.out.println("服务器启动了");
        Socket socket=serverSocket.accept();//监听  有没有客服端尝试连接服务器  一直就在监听
        System.out.println("客户端连接成功");
​
​
       InputStream in= socket.getInputStream();
        OutputStream out=socket.getOutputStream();
       byte[] b=new byte[100];
       int size=in.read(b);
       //byte数组如何转换成字符串
String s=new String(b,0,size,"utf-8");
        System.out.println(s);
​
        //回消息
​
        out.write("团子".getBytes("utf-8"));
​
    }
}
​

 

 

客户端和服务端一来一回聊天:要建立连接 先启动服务端 再启动客户端

客户端:

package feifan;
​
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
​
public class client {
    //客户端
    public static void main(String[] args) throws IOException {
​
        Socket socket=new Socket("192.168.242.5",9999);//IP+端口
        DataInputStream datain=new DataInputStream(socket.getInputStream());
        DataOutputStream dataout=new DataOutputStream(socket.getOutputStream());
        Scanner scanner=new Scanner(System.in);
        while (true){
​
            System.out.println("客户端说:");//发消息
            String s=scanner.next();
            dataout.writeUTF(s);
            if (s.equals("886")){
                break;
            }
​
​
//接收服务器的消息 然后输出
​
            System.out.println("服务器说:"+datain.readUTF());
        }
socket.close();
        datain.close();
        dataout.close();
    }
}
​

服务端:

package feifan;
​
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
​
public class server {
    //服务端
    public static void main(String[] args) throws IOException {
​
​
        ServerSocket serverSocket=new ServerSocket(9999);//端口
        Socket socket=serverSocket.accept();//监听
        DataInputStream datain=new DataInputStream(socket.getInputStream());
        DataOutputStream dataout=new DataOutputStream(socket.getOutputStream());
​
        Scanner scanner=new Scanner(System.in);
        while (true){
​
            System.out.println("客户端说:"+datain.readUTF());//接收完了输出
​
            System.out.println("服务器说:");//回消息
            String ss=scanner.next();
            dataout.writeUTF(ss);
​
​
​
        }
    }
}

7.UDP协议实现类

没有服务的概念 就只有发送端和接收端 不需要建立连接

·类DatagramSocket与DatagramPacket实现了基于UDP协议网络程序。

·数据报通过DatagramSocket发送和接收,不保证一定送达,何时送达

·DatagramPacket对象封装了UDP数据报,数据报中包含了发送端和接收端的IP地址和端口号 所以不需要建立连接

流程:

1.DatagramSocket与DatagramPacket

2.建立发送端和接收端(是两个独立程序)

3.建立数据报

4.调用Socket的发送、接收方法

5.关闭Socket

 

 

发送端:

package feifan;
​
import java.io.IOException;
import java.net.*;
​
public class send {
    public static void main(String[] args) throws IOException {
        //发送端
​
        DatagramSocket datagramSocket=new DatagramSocket();//DatagramSocket既可以发送 也可以接收 不需要端口 数据报里有
​
      byte[] b="季后赛".getBytes();
      //创建数据报   封装数据
        while (true){//一直发
            DatagramPacket datagramPacket=new DatagramPacket(b,b.length, InetAddress.getByName("192.168.242.5"),9999);//数据报
            datagramSocket.send(datagramPacket);
​
        }
    }
}
​

接收端:

 
package feifan;
​
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
​
public class receive {
    public static void main(String[] args) throws IOException {
​
        //接受信息
        DatagramSocket datagramSocket=new DatagramSocket(9999);
        byte[] b=new byte[1024];
while (true){//一直接
​
    DatagramPacket datagramPacket=new DatagramPacket(b,b.length);//传进去一个数组 还有数组长度
    datagramSocket.receive(datagramPacket);//接受数据到数据报中
    String s=new String(b,0,datagramPacket.getLength());//实际长度
    System.out.println(s);
​
}
    }
}
​


举报

相关推荐

Java基础 - 第九章 - 网络编程

第九章 Flask

第九章JDBC

第九章 时间

第九章_子查询

第九章 顺序容器

0 条评论