1 概述
计算机网络:
- 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,
实现资源共享和信息传递的计算机系统
网络编程
- 在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换
网络编程三要素
-
IP地址
要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接收数据的计算机和识别发送的计算机,而lP地址就是这个标识号。也就是设备的标识 -
端口
如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的应用程序了。也就是应用程序的标识 -
协议
连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。常见的协议有UDP协议和TCP协议
2 InetAddress使用(ip)
这个类表示的是ip地址
端口
端口:设备上应用程序的唯一标识
端口号:用两个字节表示的整数,它的取值范围是0~65535。其中,0~1023
之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被另外一个服务或应用所占用,会导致当前程序启动失败
3 协议
协议:计算机网络中,连接和通信的规则被称为网络通信协议
UDP
无连接,不可靠传输
TCP
面向连接,可靠无差错
三次握手
4 UDP通信
UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象
通信双方没有客户端和服务端
Java提供了DatagramSocket类作为基于UDP协议的Socket
UDP发送数据的步骤
1 创建发送端的Socket对象(DatagranSocket)
DatagramSocket()构造数据报套接字并将其绑定到本地主机上的任何可用端口
2 创建数据,并把数据打包
创建数据,并把数据打包
DatagramPacket (byte[ ] buf, int length,InetAddress oddress, int port)
3 调用DatagramSocket对象的方法发送数据
调用DatagramSocket对象的方法发送数据
void send (DatagramPacket p)从此套接字发送数据报包
4 关闭发送端
关闭发送端
void close 关闭此数据报套接字
package com.yy;
import org.junit.Test;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPTest {
@Test
public void SendTest() throws Exception {
//DatagramSocket()构造数据报套接字并将其绑定到本地主机上的任何可用端口
DatagramSocket ds = new DatagramSocket();
//创建数据,并把数据打包
//DatagramPacket (byte[ ] buf, int length,InetAddress oddress, int port)
//构造一个数据包,发送长度为length的数据包到指定主机上的指定端口号。
byte[] bytes = "upd,我来了".getBytes();
DatagramPacket dp = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("192.168.20.220"),10086);
//调用DatagramSocket对象的方法发送数据
//void send (DatagramPacket p)从此套接字发送数据报包
ds.send(dp);
//关闭发送端
//void close 关闭此数据报套接字
ds.close();
}
}
UDP接收数据
接收数据的步骤
- 创建接收端的Socket对象(DatagramSocket)
DatagramSocket (int port)构造数据报套接字并将其绑定到本地主机上的指定端口
- 创建一个数据包,用于接收数据
DatagramPacket (byte[J buf,int length)构造一个DatogramPacket用于接收长度为 length数据包
- 调用DatagramSocket对象的方法接收数据
调用DatagramSocket对象的方法接收数据
- 解析数据包,并把数据在控制台显示
byte[] getData()返回数据缓冲区
int getLength()返回要发送的数据的长度或接收到的数据的长度
- 关闭接收端
@Test
public void sdTest() throws Exception {
//1. 创建接收端的Socket对象(DatagramSocket)
//DatagramSocket (int port)构造数据报套接字并将其绑定到本地主机上的指定端口
DatagramSocket ds = new DatagramSocket(10086);
//2. 创建一个数据包,用于接收数据
//DatagramPacket (byte[J buf,int length)构造一个DatogramPacket用于接收长度为 length数据包
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
//3. 调用DatagramSocket对象的方法接收数据
ds.receive(dp);
//4. 解析数据包,并把数据在控制台显示
// byte[] getData()返回数据缓冲区
byte[] datas =dp.getData();
//int getLength()返回要发送的数据的长度或接收到的数据的长度
int length = dp.getLength();
String dataString = new String(datas,0,length);
System.out.println("date is : "+dataString);
//5. 关闭接收端
ds.close();
}
在运行该方法时,执行上面的发送方法,如何会将上面的结果进行获取,如下图所示
5 TCP通信
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链趵一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信
Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信
Java为客户端提供了Socket类,为服务器端提供了ServerSocket类
TCP发送数据
TCP发送数据的步骤
- 创建客户端的Socket对象(Socket)
ocket (String host,int port)创建流套接字并将其连接到指定主机上的指定端口号
- 获取输出流,写数据
outputStream getoutputStream()返回此套接字的输出流
- 释放资源
@Test
public void SendTest() throws Exception {
//1. 创建客户端的Socket对象(Socket)
//Socket (InetAddress address, int port)创建流套接字并将其连接到指定IP地址的指定端口号
// InetAddress byName1 = InetAddress.getByName("www.baidu.com");
// InetAddress byName2 = InetAddress.getByName("192.168.20.220");
// InetAddress byName3 = InetAddress.getByName("localhost");
// System.out.println(byName1+"-----"+byName2+"-----------"+byName3);//www.baidu.com/110.242.68.3-----/192.168.20.220-----------localhost/127.0.0.1
//Socket (String host,int port)创建流套接字并将其连接到指定主机上的指定端口号
Socket s = new Socket("192.168.20.220",10000);
//2. 获取输出流,写数据
//outputStream getoutputStream()返回此套接字的输出流
OutputStream os = s.getOutputStream();
os.write("tcp,I am coming".getBytes());
//3. 释放资源
os.close();
}
TCP接收数据
TCP接收数据的步骤
-
创建服务器端的Socket对象(ServerSocket)
ServerSocket (int port)创建绑定到指定端口的服务器套接字
-
监听客户端连接,返回一个Socket对象
Socket accept ()侦听要连接到此套接字并接受它
-
获取输入流,读数据,并把数据显示在控制台
InputStream getInputStream()
-
释放资源
void close()
@Test
public void sdTest() throws Exception {
//1. 创建服务器端的Socket对象(ServerSocket)
//ServerSocket (int port)创建绑定到指定端口的服务器套接字
ServerSocket ss = new ServerSocket(10086);
//Socket accept ()侦听要连接到此套接字并接受它
Socket accept = ss.accept();
//2. 获取输入流,读数据,并把数据显示在控制台
InputStream is = accept.getInputStream();
byte[] bytes = new byte[1024];
int len = is.read();
String data = new String(bytes,0,len);
System.out.println("data is : "+ data);
//3. 释放资源
ss.close();
accept.close();
}