- 网络编程
- InetAddress类
- 常用方法
- 协议
- UDP的三种通讯方式
- 三次握手
- 四次挥手
- 再网络通讯写一下,不同计算机上运行的程序,可以进行数据传输。
网络编程三要素
- 网络IP地址----------设备再网络中的地址,时唯一标识
- 端口号-----------------应用再设备中唯一的标识
- 传输协议---------------数据再网络中传输的规则,常用的协议有UDP和TCP
IPv4
32bit == 4组 ===8bit为一组
采用点分十进制表示法进行表示
IPv6
128bit地址长度,分为8组,两字节分为一组
冒分十六进制表示,前面有零可以省略
public class InetAddressDemo1 {
public static void main(String[] args) throws Exception {
//static InetAddress getByName(String host)确定主机名称的IP地址
InetAddress byName = InetAddress.getByName("DESKTOP-B94P8SK");
//String getHostName() 获取次IP地址的主机名
String hostName = byName.getHostName();
System.out.println(hostName);
//String getHostAddress() 返回文本显示中的IP地址字符串
String Ip = byName.getHostAddress();
System.out.println(Ip);
}
}
协议
计算机中连接和通讯的规则被称之为网络通讯协议
UDP
- 面向无连接
- 速度块,大小限制64K,数据不安全,容易丢失
发送端步骤
- 创建发送端的DatagramSocket对象
- 创建数据,并把数据打包(DatagramPacket)
- 调用DatagramSocket对象的方法发送数据
- 释放资源
public class ClientDemo {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket();
String s = "你好呀!";
byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10000;
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
ds.send(dp);
ds.close();
}
}
发送端步骤:
- 创建接受端的对象DatagramSocket对象
- 创建接受数据对象
- 调用DatagramSocket的方法接受数据并将数据放入箱子中
- 解析数据包,并把数据再控制台显示
- 释放资源
public class ReceiveDemo {
public static void main(String[] args)throws Exception{
DatagramSocket ds = new DatagramSocket(10000);
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b,b.length);
ds.receive(dp);
byte[] data = dp.getData();
int length = dp.getLength();
System.out.println(new String(data,0,length));
ds.close();
}
}
UDP的三种通讯方式
- 单播,上面演示的就是单单播,一对一传输
- 组播(IPv4)
public class ClientDemo {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket();
String s = "你好呀吗!";
byte[] bytes = s.getBytes();
//组播地址
InetAddress address = InetAddress.getByName("224.0.1.0");
int port = 10000;
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
ds.send(dp);
ds.close();
}
}
public class ReceiveDemo {
public static void main(String[] args)throws Exception{
//创建加入组播的对象
MulticastSocket ms = new MulticastSocket(10000);
byte[] bytes = new byte[1023];
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
//把当前计算机绑定一个组播地址,表示添加到这一组中
ms.joinGroup(InetAddress.getByName("224.0.1.0"));
ms.receive(dp);
int length = dp.getLength();
System.out.println(new String(bytes,0,length));
ms.close();
}
}
- 广播—广播地址为:255.255.255.255
书写方式根单播一摸一样,把地址改一下就行
TCP
-
面向连接通讯
-
速度慢,没有大小限制,数据安全
-
TCP通讯协议是一种可靠的网络协议,它再通讯的两端创建一个Socket对象,通讯之前保证连接已经建立
发送端步骤:
- 创建客户端的Socket对象与指定服务器端连接
- 获取输出流写数据
- 释放资源
public class ClientDemo1 {
public static void main(String[] args)throws Exception{
//1. 创建一个Socket对象
Socket socket = new Socket("127.0.0.1",10000);
//2. 获取一个IO流开始写数据
OutputStream os = socket.getOutputStream();
os.write("你好".getBytes());
//3. 释放资源
os.close();
socket.close();
}
}
接收数据的步骤
- 创建服务器的Socket对象
- 监听客户端连接,返回一个Socket对象
- 获取输入流对象,读数据,并把数据显示再控制台
public class ServerDemo1 {
public static void main(String[] args) throws Exception{
//1 创建Socket对象
ServerSocket ss = new ServerSocket(10011);
//2. 等待客户端连接
Socket accept = ss.accept();
//3. 获取输入流对象
InputStream is = accept.getInputStream();
int len;
while ((len = is.read())!=-1){
System.out.print((char)len);
}
//4. 释放资源
is.close();
ss.close();
}
}
三次握手
- 客户端向服务端发出连接请求,等待确认
- 服务器向客户端返回一个响应 ,告诉客户端接收到了请求
- 客户端向服务器再次发出确认消息,连接建立
- 向客户端发出取消连接的请求
- 服务器向客户端返回一个响应,表示收到客户端取消请求
- 服务器将最后的数据处理完毕,服务器再向客户端发出确认取消消息
- 客户端再次发送确认消息,连接取消
练习
- 客户端: 发送数据,接受服务器反馈
- 服务器: 接受数据,给出反馈
public class ClientDemo1 {
public static void main(String[] args)throws Exception{
Socket socket = new Socket("127.0.0.1",11000);
OutputStream os = socket.getOutputStream();
os.write("hello".getBytes());
//仅仅关闭输出流,并写一个结束标记,对socket没有任何影响
socket.shutdownOutput();
// InputStream is = socket.getInputStream();
// int b;
// while ((b = is.read()) != -1) {
// System.out.println((char) b);
// }
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
os.close();
socket.close();
}
}
public class ServerDemo1 {
public static void main(String[] args)throws Exception{
ServerSocket ss = new ServerSocket(11000);
Socket accept = ss.accept();
InputStream is = accept.getInputStream();
int b;
while ((b = is.read()) != -1) {
System.out.println((char) b);
}
// OutputStream os = accept.getOutputStream();
// os.write("你是谁".getBytes());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
bw.write("拿来吧你!!!");
bw.close();
is.close();
ss.close();
}
}



