网络编程
文章目录
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();
}
}

被折叠的 条评论
为什么被折叠?



