网络编程
计算机的基础知识
1.网络模型 5层模型和七层模型
2.网络编程的三要素 ip 端口 协议
3.Tcp连接过程 三次握手和四次挥手
网络模型:https://blog.youkuaiyun.com/qq_22238021/article/details/80279001
Tcp连接过程 三次握手和四次挥手:https://baijiahao.baidu.com/s?id=1596016296668694374&wfr=spider&for=pc
IP地址
网络中针对计算机的唯一表示,类似于一个人的身份证,每个计算机都有自己的ip地址,计算机中是用点分十进制来表示的: 192.168.5.109,ip的存储是使用二进制存储
如:11000000.10101000.00000010.01101101
端口
1.端口的范围: 0~65535是可以使用端口的范围
2.0~1024一般是系统进程端口,不建议使用,建议我们不要和系统进程或者和已经打开的程序端口重复,否则会出现端口被占用的问题
协议
HTTP: 超文本传输协议
FTP: 文件传输协议
TCP: 传输控制协议
UDP: 用户数据报协议
UDP:
1.对数据打包传输
2.数据传输的数量有限制
3.速度快
4.面向无连接
5.不安全不可靠
TCP
1.数据传输没有限制
2.面向连接的协议
3.速度慢
4.可靠安全
InetAddress
它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的
byte[] getAddress() 返回此 InetAddress 对象的原始 IP 地址。
static InetAddress[] getAllByName(String host) 在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
static InetAddress getByAddress(byte[] addr) 在给定原始 IP 地址的情况下,返回 InetAddress 对象。static InetAddress getByAddress(String host, byte[] addr) 根据提供的主机名和 IP 地址创建 InetAddress。
static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
String getCanonicalHostName() 获取此 IP 地址的完全限定域名。
String getHostAddress() 返回 IP 地址字符串。
String getHostName() 获取此 IP 地址的主机名。
public class NetDemo01 {
public static void main(String[] args) throws UnknownHostException {
byte[] bys = {(byte) 192,(byte) 168,1,112};
InetAddress ip = InetAddress.getByAddress(bys);
System.out.println(ip);
System.out.println(InetAddress.getByName("192.168.1.120"));
System.out.println(InetAddress.getByName("www.baidu.com"));
System.out.println(InetAddress.getLocalHost());
System.out.println(InetAddress.getLoopbackAddress());
InetAddress address = InetAddress.getByName("localhost");
System.out.println(address.getHostAddress());
System.out.println(address.getHostName());
System.out.println(address.isLoopbackAddress());
System.out.println(ip.getHostName());
System.out.println(ip.getHostAddress());
}
}
UDP协议
/* UDP协议发送数据步骤
* 1.创建Socket对象
* 2.创建数据
* 3.创建一个数据包将数据打包
* 4.调用Scock的send方法发送数据
* 5.释放资源
*/
public class SendDemo {
public static void main(String[] args) throws IOException {
System.out.println("我是发送端");
// 1.创建Socket对象
DatagramSocket ds = new DatagramSocket(10001);
// 2.创建数据,将数据打包
byte[] bys = "我给你发消息了".getBytes();
InetAddress ip = InetAddress.getByName("192.168.1.124");
// 3.创建一个数据包
DatagramPacket dp = new DatagramPacket(bys, bys.length, ip, 10086);
// 4.调用Scock的send方法发送数据
ds.send(dp);
ds.close();
}
}
/*
* UDP协议接收端
* 1.创建服务器端对应的Socket对象 (DatagramSocket)
* 2.创建空包裹来接受发送过来的数据包
* 3.调用Socket的接收数据包的方法
* 4.解析数据包,输出对应的数据
* 5.释放资源
*/
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// 1.创建服务器端对应的Socket对象 (DatagramSocket)
DatagramSocket ds = new DatagramSocket(10086, InetAddress.getByName("127.0.0.1"));
System.out.println("服务器端启动了...");
// 2.创建空包裹来接受发送过来的数据包
byte[] bys = new byte[100];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
// 3.调用Socket的接收数据包的方法
System.out.println("等待客户端发送数据...");
ds.receive(dp); // 该方法还是一个阻塞方法
// 4.解析数据包,输出对应的数据
bys = dp.getData();
int len = dp.getLength();
String ip = dp.getAddress().getHostAddress();
String data = new String(bys, 0, len);
System.out.println("收到了来自" + ip + ",端口为" + dp.getPort() + "的数据: " + data);
// 5.释放资源
ds.close();
}
}
TCP协议
/*
* 发送数据
* 1.创建Socket对象
* 2.通过Socket对象获取输出流
* 3.输出数据
* 4.释放资源
* 注意:必须先开启服务器端,如果先开启的是客户端会报错
*
*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
// 1.创建Socket对象
Socket s = new Socket("192.168.1.124", 10086);
// 2.通过Socket对象获取输出流
OutputStream os = s.getOutputStream();
// 3.输出数据
os.write("我发消息了".getBytes());
// 4.释放资源
os.close();
s.close();
}
}
/*
* TCP协议接收数据
* 1.创建服务器端的ServerSocket
* 2.监听客户端的连接,返回与客户端匹配的Socket
* 3.读取或者写入数据
* 4.释放资源(这里不需要释放服务器的资源)
*/
public class Server {
public static void main(String[] args) throws IOException {
// 1.创建服务器端的ServerSocket
ServerSocket ss = new ServerSocket(10086);
// 2.监听客户端的连接,返回与客户端匹配的Socket
Socket s = ss.accept(); // 这是一个阻塞方法,等待用户的Socket连接
// 3.读取或者写入数据
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String data = new String(bys, 0, len);
System.out.println("数据:" + data);
}
}
TCP协议实现文件上传
//客户端
public class FileUpload {
public static void main(String[] args) throws Exception {
System.out.println("我是客户端");
Socket s = new Socket("192.168.1.116", 10086);
BufferedReader br = new BufferedReader(new FileReader("D:\\haha.txt"));
OutputStream os = s.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
String line = null;
while ((line = br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
//通过socket.shutdownOutput()关闭输出流,但仍然是连接状态,连接并未关闭如果直接关闭输入或者输出流,即:in.close()或者out.close(),会直接关闭socket
s.shutdownOutput();
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
// 读取服务器的响应数据
int len = is.read(bys);
String data = new String(bys, 0, len);
System.out.println(data);
br.close();
s.close();
}
}
//服务端
public class FileUploadService {
public static void main(String[] args) throws IOException {
System.out.println("我是服务器");
ServerSocket ss = new ServerSocket(10086);
while (true) {
Socket s = ss.accept();
InputStream inputStream = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
BufferedWriter bw = new BufferedWriter(new FileWriter("download" +System.currentTimeMillis()+ "txt" ));
String line = null;
while ((line = br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
s.shutdownInput();
OutputStream is = s.getOutputStream();
is.write("文件上传成功!!!".getBytes());
bw.close();
s.close();
}
}
}