TCP/IP
小结:
- 网络编程中有两个主要的问题
-
如何准确的定位到网络上的一台或多台主机
-
找到主机之后如何进行通信
- 网络编程中高端要素
-
IP和端口号 IP
-
网络通信协议 udp tcp
- 万物皆对象
==============================================================
ip地址:inteAddress 查看本地cmd ipconfig
-
唯一定位一台网络上计算机
-
127.0.0.1:本机localhost
-
ip地址的分类
-
ipv4/Ipv6
-
ipv4 127.0.0.1 4个字节组成。 0~255 42亿个
-
ipv6 fe80::60f8:dddd:6bea:17a7%5 ,128位。8个无符号整数!
try {
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);
InetAddress[] inetAddress1 = InetAddress.getAllByName(“127.0.0.1”);
System.out.println(inetAddress1);
System.out.println(InetAddress.getByName(“localhost”));
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
==============================================================
netstat -ano #查看所有的端口
netstat -ano|findstr"5900" #查看指定的端口
taskList|findstr “8696” #查看指定端口的进程
ctrl+shift+Esc
public static void main(String[] args) {
InetSocketAddress inetSocketAddress = new InetSocketAddress(“127.0.0.1”, 8080);
InetSocketAddress localhost = new InetSocketAddress(“localhost”, 8080);
System.out.println(inetSocketAddress);
System.out.println(localhost);
}
}
================================================================
网络通信协议:速率,传输码率,代码结构,传输控制…
TCP/IP协议簇:实际上是一组协议
重要:
-
TCP:用户传输协议
-
UDP:用户数据报协议
出名的协议:
-
TCP:
-
IP:网络互连协议
===============================================================
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
/**
-
@author ajun
-
Date 2021/6/29
-
@version 1.0
-
模拟客户端发送消息
*/
public class TCPClient {
public static void main(String[] args) throws IOException {
//socket连接
Socket socket = null;
//输出流
OutputStream os = null;
try{
//服务器地址
InetAddress host = InetAddress.getByName(“127.0.0.1”);
//服务器端口
int port = 9999;
//创建socket连接
socket = new Socket(host, port);
//获取输出流
os = socket.getOutputStream();
//发送消息
os.write(“Hi,Ajun!”.getBytes(StandardCharsets.UTF_8));
}finally {
//关闭输出流
if(os!=null){
os.close();
}
//关闭连接
if(socket!=null){
socket.close();
}
}
}
}
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
-
@author ajun
-
Date 2021/6/29
-
@version 1.0
-
模拟服务端接收消息
*/
public class TCPService {
public static void main(String[] args) {
//服务
ServerSocket serverSocket = null;
//连接
Socket socket = null;
//输入流
InputStream is = null;
//管道流
ByteArrayOutputStream baos = null;
try {
while (true) {
//创建服务
serverSocket = new ServerSocket(9999);
//等待客户端连接
socket = serverSocket.accept();//阻塞式监听,会一直等待客户端连接
//获取输入流
is = socket.getInputStream();
//建立管道流,接收消息
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
//读取消息
//int read(byte[] b):读取若干字节并填充到byte[]数组,返回读取的字节数
while ((len = is.read(buffer)) != -1) {
//把 buffer 中的数据从 0 到 len,写入 baos
baos.write(buffer, 0, len);
}
System.out.println(“收到!” + baos.toString());
}
}catch (IOException e){
}finally {
try{
//关闭管道流
if (baos != null) {
baos.close();
}
//关闭输入流
if (is != null) {
is.close();
}
//关闭连接
if (socket != null) {
socket.close();
}
//关闭服务
if (serverSocket != null) {
serverSocket.close();
}
}catch (IOException e){
}
}
}
}
package com.ajun;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
-
@author ajun
-
Date 2021/6/29
-
@version 1.0
-
模拟文件上传客户端
*/
public class TCPFileUploadClient {
public static void main(String[] args) throws Exception {
//创建连接
Socket socket = new Socket(InetAddress.getByName(“127.0.0.1”), 9900);
//获取输出流
OutputStream outputStream = socket.getOutputStream();
//读取文件
FileInputStream inputStream = new FileInputStream(“IMG_20200809_090035.jpg”);
//写入文件
byte[] buffer = new byte[1024];
int len;
while((len=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,len);
}
//上传完毕:关闭连接
socket.shutdownOutput();
//确定服务端接收完毕,然后再关闭连接
InputStream inputStream1 = socket.getInputStream();//接收服务端反馈信息
ByteArrayOutputStream os2 = new ByteArrayOutputStream();//把接收到的信息输出
byte[] buffer2 = new byte[1024];
int len2;
while ((len2 = inputStream1.read(buffer2))!=-1){
os2.write(buffer2,0,len2);
}
System.out.println(os2.toString());
//read是阻塞的,执行完之后,后面的代码才可以执行
//关闭
inputStream1.close();
os2.close();
inputStream.close();
outputStream.close();
socket.close();
}
}
package com.ajun;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
/**
-
@author ajun
-
Date 2021/6/29
-
@version 1.0
-
模拟文件接收服务端
*/
@SuppressWarnings({“all”})
public class TCPFileUploadService {
public static void main(String[] args) throws IOException {
//创建服务
ServerSocket serverSocket = new ServerSocket(9900);
//监听连接
Socket socket = serverSocket.accept();
//获取输入流
InputStream inputStream = socket.getInputStream();
//文件输出
FileOutputStream fos = new FileOutputStream(“service.jpg”);
byte[] buffer = new byte[1024];
int len;
while((len = inputStream.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//通知客户端接收完毕
OutputStream os = socket.getOutputStream();
os.write(“接收完毕”.getBytes(StandardCharsets.UTF_8));
//write是阻塞的,执行完之后,后面的代码才可以执行
//关闭
os.close();
fos.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
===============================================================
不需要连接,有地址和端口即可
package com.ajun;
import java.io.IOException;
import java.net.*;
/**
-
@author ajun
-
Date 2021/6/30
-
@version 1.0
-
客户端发送消息
*/
public class UDPClient {
public static void main(String[] args) throws IOException {
DatagramSocket socket = null;
try{
//建立socket
socket = new DatagramSocket();
//建立要发送的数据包
String msg = “Hello world!”;
byte[] buffer = msg.getBytes();
InetAddress host = InetAddress.getByName(“localhost”);
int port = 9999;
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length,host,port);
//发送
socket.send(packet);
}finally {
//关闭连接
socket.close();
}
}
}
package com.ajun;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
-
@author ajun
-
Date 2021/6/30
-
@version 1.0
-
服务端接收消息
*/
public class UDPService {
public static void main(String[] args) throws IOException {
DatagramSocket socket = null;
try{
//开放端口
socket = new DatagramSocket(9999);
//准备接收数据的容器
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
//接收
socket.receive(packet);
System.out.println(“接收到的数据:”+new String(packet.getData(),0,packet.getLength()));
}finally {
//关闭
socket.close();
}
}
}
键盘自定义输入
循环发送
package com.ajun;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
-
@author ajun
-
Date 2021/6/30
-
@version 1.0
-
发送
*/
public class UDPSender {
public static void main(String[] args) throws IOException {
DatagramSocket socket = null;
BufferedReader reader = null;
try{
//建立连接
socket = new DatagramSocket(9000);//本机端口
//准备数据:控制台输入
reader = new BufferedReader(new InputStreamReader(System.in));
System.out.println(“请输入要发送的消息…[注:bye 为退出]”);
//循环发送
while (true){
String data = reader.readLine();
byte[] datas = data.getBytes();
InetAddress host = InetAddress.getByName(“localhost”);
int port = 8000;//接收方端口
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, host, port);
//发送
socket.send(packet);
if(data.equals(“bye”)){
break;
}
}
}finally {
//关闭
reader.close();
socket.close();
}
}
}
package com.ajun.com.ajun;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
-
@author ajun
-
Date 2021/6/30
-
@version 1.0
-
接收
*/
public class UDPService {
public static void main(String[] args) throws IOException {
DatagramSocket socket = null;
try{
//开启服务,监听连接
socket = new DatagramSocket(8000);
//循环接收
while (true){
//准备接收
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
//接收
socket.receive(packet);//阻塞式
byte[] serviceData = packet.getData();
String sd = new String(serviceData, 0, packet.getLength());
System.out.println(sd);
if(sd.equals(“bye”)){
break;
}
}
}finally {
//关闭
socket.close();
}
}
}
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
while (true){
//准备接收
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
//接收
socket.receive(packet);//阻塞式
byte[] serviceData = packet.getData();
String sd = new String(serviceData, 0, packet.getLength());
System.out.println(sd);
if(sd.equals(“bye”)){
break;
}
}
}finally {
//关闭
socket.close();
}
}
}
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-TTKcsYaB-1715762884448)]
[外链图片转存中…(img-70mSwPDH-1715762884448)]
[外链图片转存中…(img-jHXEs6P9-1715762884448)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!