01网络编程的概述
02网络通信中的三要素
直接见图
示例
03InetAddress的概述和测试
直接上代码
/*
* InetAddress类 :是用来表示互联网协议(IP)地址
*/
public class InetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
// static InetAddress getByName(String host) : 在给定主机名的情况下确定主机的 IP 地址。
InetAddress ia = InetAddress.getByName("LAPTOP-6OGPH9CE");//192.168.43.188
System.out.println(ia);
InetAddress ia2 = InetAddress.getByName("192.168.43.188");
System.out.println(ia2);
// String getHostName()
// 获取此 IP 地址的主机名。
String hostName = ia2.getHostName();
System.out.println(hostName);
}
}
运行结果
04UDP协议发送数据
发送的步骤
Socket构造方法的区别
创建数据并打包的步骤 的具体实现
后面的实现
完整代码
//创建发送端Socket对象
DatagramSocket ds = new DatagramSocket();
//创建数据并打包
/*
* 数据byte[]
* IP地址
* 程序的地址 端口
*
* DatagramPacket 是用来表示数据包
*
*/
//数据
String s = "hello world";
byte[] bys = s.getBytes();
int len = bys.length;
InetAddress address = InetAddress.getByName("LAPTOP-6OGPH9CE");
int port = 6666;
//打包
DatagramPacket dp = new DatagramPacket(bys,len,address,6666);
//发送数据
ds.send(dp);
//释放资源
ds.close();
此时运行不会报错,也不会有结果
05UDP协议接收数据
大致步骤
构造的差别
步骤代码
结果
解析数据步骤可用的方法
完整代码
//创建接收端Socket对象
DatagramSocket ds = new DatagramSocket(6666);
//接收数据
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
ds.receive(dp);
//解析数据
InetAddress address = dp.getAddress();
//输出数据
System.out.println("sender---->"+address.getHostAddress());
System.out.println(new String(bys));
//释放资源
ds.close();
运行结果
注意:要先运行接受的代码,再运行发送的代码 才会收到数据
创建接收端Socket对象时,一定要指定发送时的同一端口
06UDP协议收发数据注意事项
连着运行两次服务端就会报错:端口已经绑定
07TCP协议发送数据
大致步骤
我的代码
Socket s = new Socket(InetAddress.getByName("LAPTOP-6OGPH9CE"),2333);
OutputStream os = s.getOutputStream();
String str = "dlkahsjdas";
os.write(str.getBytes());
// os.close(); //Socket对象会帮你关闭,不用再关输出
注意:tcp协议是要创建连接的,只有客户端就运行的话 就会报错
08TCP协议接收数据
大致步骤
具体
tcp协议中在没有像DatagramPacket类的情况下,获取数据的方法:
利用Socket对象.方法
我的代码
//创建接收端Socket对象
DatagramSocket ds = new DatagramSocket(6666);
//接收数据
byte[] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
ds.receive(dp);
//解析数据
InetAddress address = dp.getAddress();
//输出数据
System.out.println("sender---->"+address.getHostAddress());
System.out.println(new String(bys));
//释放资源
ds.close();
运行结果
10模拟用户登陆
大致步骤
客户端
先到这一步,然后转到服务端去
再回到客户端写完整
我的代码
客户端的
Socket s =new Socket("LAPTOP-6OGPH9CE",2999);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入用户名:");
String username = br.readLine();
System.out.println("请输入密码:");
String password = br.readLine();
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
pw.write(username);
pw.write(password);
//获取输入流对象
BufferedReader sbr = new BufferedReader(new InputStreamReader(s.getInputStream()));
String result = sbr.readLine();
System.out.println(result);
s.close();
服务端的
ServerSocket ss = new ServerSocket(2999);
Socket s =ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String un = br.readLine();
String pw = br.readLine();
boolean flag = false;
if("杨帅".equals(un)&&"sh123567".equals(pw)) {
flag = true;
}
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
if(flag) {
out.println("登录成功");
}
else {
out.println("登录失败");
}
s.close();
// ss.close(); //服务器一般不关闭
11模拟用户登录案例改写
按死了比用户名和密码不可取…
改写第一步:写个用户类
再把构造方法,set和get方法都生成出来
接着写个数据库类,装用户的信息
正码里改的地方
运行
失败了 为什么呢?
原因
比较的那个方法 contains方法的源码是equals方法比较,但是我们又没有改写equals
所以需要在用户类里改写equals
运行结果