网络编程 知识点及练习

网络编程

IP地址

唯一标识网络上的每一台计算机

IPv4的组成:32位,由4个8位二进制数组成

**11000000.10101000.00000001.11001000 ** 二进制

192.168.1.200 十进制

IP地址的组成

IP地址 = 网络地址 + 主机地址

网络地址:标识计算机或网络设备所在的网段

主机地址:标识特定主机或网络设备

在这里插入图片描述

IP地址的配置和检测

cmd命令

ipconfig 查看本机的IP地址

**ping目标IP地址 ** 测试网络是否通畅

DNS域名解析

访问网站时,为什么时输入网址而不是IP地址?

DNS核心功能

解决 “域名→IP 地址” 的映射问题。由于互联网中的设备通过 IP 地址定位和通信,但 IP 地址(如 IPv4 的 32 位数字、IPv6 的 128 位数字)难以记忆,而域名(由字母、数字和符号组成)更易被人类理解,因此需要 DNS 作为 “翻译官”。

服务器

通常指在网络环境下,具有较高计算能力,能够提供用户服务功能的计算机

网络通讯协议

为了在网络中不同的计算机之间进行通信而建立的规则、标准或约定的集合

在这里插入图片描述

Socket

通信链路的端点就被称为“套接字”(英文名Socket)

是提供给应用程序的接口

java.net包

Socket

ServerSocket

DatagramPacket

DatagramSocke

InetAddress等

基于TCP协议的socket编程

基于TCP协议的Socket网络通信

用来实现双向安全连接网络通信

Socket通信模型

进行网络通信时,Socket需要借助数据流来完成数据的传递工作

在这里插入图片描述

socket网络编程一般可以分为如下步骤进行

建立连接

打开Socket关联的输入输出流

数据流中读写信息

关闭所有的数据流和Socket

练习:模拟用户登录的功能

模拟用户登录的功能

实现客户发送登录用户信息,服务器端显示登录信并响应给客户端登录成功

public class Server {
    public static void main(String[] args) throws IOException {
        //创建一个服务器套接字并填上端口
        ServerSocket serverSocket = new ServerSocket(9999);
        System.out.println("服务器正在等待接受");
        //服务器等待接受数据
        Socket socket = serverSocket.accept();
        //创建输入字符流用于读取数据
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //将读取到的数据赋给一个字符串
        String s = bufferedReader.readLine();
        //创建输出字符流用于回复客户端
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        //对客户端传输的数据进行判断,做出回复
        if (s.contains("123")){
            bufferedWriter.write("登录成功");
        }else {
            bufferedWriter.write("登录失败");
        }
        //关闭流
        bufferedWriter.newLine();
        bufferedWriter.flush();
        socket.close();
    }
}
public class Client {
    public static void main(String[] args) throws IOException {
        //创建一个客户端套接字,并声明要链接的主机和端口号
        Socket socket = new Socket(InetAddress.getLocalHost(),9999);
        //new一个键盘输入
        System.out.println("请输入你的密码");
        Scanner scanner = new Scanner(System.in);
        String password = scanner.next();
        //创建一个字符输出流并写入数据
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bufferedWriter.write("admin:123");
        bufferedWriter.newLine();//换行表示输出结束
        bufferedWriter.flush();//需要手动flush
        //创建输入字符流用于读取数据
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println(bufferedReader.readLine());
        //关闭流
        bufferedReader.close();
        socket.close();
    }
}

socket中实现对象的传递

传递对象信息

ObjectOutputStream  oos = new  ObjectOutputStream();
oos.writeObject();

ObjectInputStream  ois = new  ObjectInputStream();
Object = ois.readObject();

多线程处理多请求

实现多客户请求

采用多线程的方式

一个专门负责监听的应用主服务程序

一个专门负责处理请求的线程程序

基于UDP协议的Socket编程

基于UDP协议的Socket网络编程步骤

利用 DatagramPacket 对象封装数据包

利用 DatagramSocket 发送数据包

利用 DatagramSocket 接收数据包

利用 DatagramPacket 处理数据包

练习3:客户咨询问题

实现客户咨询问题,客服人员答复问题

package demo2;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class Recive {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(9998);//如果在同一台电脑上比如做练习端口不要一样
        byte[] data = new byte[1024];
        //创建一个DatagramPacket接收数据包
        DatagramPacket packet = new DatagramPacket(data,data.length);
        //把传输的数据包给了自己创建的
        datagramSocket.receive(packet);
        //拆包获取内容
        int length = packet.getLength();
        byte[] bytes = packet.getData();
        String s = new String(bytes,0,length);
        System.out.println(s);
        //准备回复
        byte[] senf = "8700元".getBytes();
        //创建一个数据包封装回复内容
        DatagramPacket sendPacket = new DatagramPacket(senf,senf.length, InetAddress.getLocalHost(),9999);
        datagramSocket.send(sendPacket);
        //释放资源
        datagramSocket.close();
    }
}

package demo2;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class Send {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(9999);
        byte[] bytes = "这款手机多少钱".getBytes();
        //创建一个数据包封装发送内容
        DatagramPacket packet = new DatagramPacket(bytes,bytes.length, InetAddress.getLocalHost(),9998);
        datagramSocket.send(packet);
        byte[] bytes1 = new byte[1024];
        //创建一个DatagramPacket接收数据包
        DatagramPacket datagramPacket = new DatagramPacket(bytes1,bytes1.length);
        //把传输的数据包给了自己创建的
        datagramSocket.receive(datagramPacket);
        //拆包获取内容
        int length = datagramPacket.getLength();
        byte[] bytes2 = datagramPacket.getData();
        String s = new String(bytes2,0,length);
        System.out.println(s);
        //释放资源
        datagramSocket.close();
    }
}

获取内容
int length = datagramPacket.getLength();
byte[] bytes2 = datagramPacket.getData();
String s = new String(bytes2,0,length);
System.out.println(s);
//释放资源
datagramSocket.close();
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值