1.计算机网络概念
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接(有线性、无线)起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
网络编程的目的
传播交流信息
数据交换、通信。
想要达到这个效果,需要什么
1.如何准确的定位网络上的一台主机 192.168.1.100: 端口,定位到这个计算机上的某个资源。
2.找到了这个主机,如何传输数据呢?
JavaWeb : 网页编程 B/S架构
网络编程: TCP/IP C/S架构
网络通信要素
如何实现网络的通信?
通信双方的地址:
IP、端口号。
192.168.1.100:8080
TCP/IP参考模型
小结:
1.网络编程中两个主要问题
如何准确定位到网络上的一台或多台主机
找到主机之后如何进行通信
2.网络编程中的要素
IP 和 端口号
网络通信协议
3.Java 万物皆对象
2、IP
/*** @author chenGen* @version 1.0.0* @ClassName TestInetAddress.java* @Description TODO* @createTime 2021年09月24日 09:47:00*/public class TestInetAddress {public static void main(String[] args) throws Exception {//查询本机的ip地址InetAddress localhost = InetAddress.getByName("localhost");System.out.println(localhost);InetAddress localHost = InetAddress.getLocalHost();System.out.println(localHost);System.out.println("==============");//查询网站ip地址InetAddress taobao = InetAddress.getByName("www.taobao.com");System.out.println(taobao);System.out.println("==============");//常用方法System.out.println(taobao.getHostAddress());//获取主机ip地址System.out.println(taobao.getHostName());//获取域名System.out.println(taobao.getCanonicalHostName());//获取规范的ip地址}}
3.端口
端口表示计算机上的一个程序的进程。
1.一栋楼表示一个ip ,这栋楼里面的 门牌号 就是端口号。
2.不同的进程有不同的端口号!用来区分软件的。
3.端口被规定为:0-65535
4.TCP ,UDP: 每个都有 0-65535 * 2 ,单个协议下,端口号不能冲突。
5.端口分类
公有端口:0-1023
HTTP : 80
HTTPS :443
FTP : 21
Telet : 23
程序注册端口:1024-49151,分配给用户或者程序
Tomcat:8080
Mysql:3306
Oracle:1521
动态、私有:49152-65535
netstat -ano #查看所有端口netstat -ano | findstr "5900" #查看指定的端口tasklist | findstr "8696" #查看指定端口的进程Ctrl + Shift + ESC
package cn.bloghut.lesson01;import java.net.InetSocketAddress;/*** @author by 闲言* @classname TesyInetSocketAddress* @description TODO* @date 2021/8/1 18:12*/public class TesyInetSocketAddress {public static void main(String[] args) {InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);InetSocketAddress socketAddress1 = new InetSocketAddress("localhost", 8080);System.out.println(socketAddress);System.out.println(socketAddress1);System.out.println("====================");System.out.println(socketAddress.getAddress());//ip地址System.out.println(socketAddress.getHostName());//主机名称System.out.println(socketAddress.getHostString());System.out.println(socketAddress.getPort());//端口}}
4.通信协议
协议:约定,就好比我们现在说的是普通话。大家都能听懂
网络通信协议:
1.速率
2.传输码率
3.代码结构
4.传输控制
问题:非常的复杂
TCP/IP协议簇:实际上是一组协议
重要:
TCP:用户传输协议
UDP:用户数据报协议
出名的协议:
TCP
IP
TCP和UDP 对比:
TCP:打电话
连接: 稳定
三次握手
A:你愁啥? 我要连接了
B:瞅你咋地? 好的,我准备好了,你可以连接了
A:干一次! 连接正常
四次挥手
A:我要断开了 (我要走了)
B:我知道你要断开了(你真的要走了吗?)
B:你真的断开了吗?(你真的真的要走了吗?)
A:我真的断开了 (我真的要走了)
客户端,服务端
传输完成,释放连接、效率低

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
UDP:发短信
1.不连接,不稳定
2.客户端、服务端:没有明确的界限
3.不管有没有准备好,都可以发给你…
4.导弹
5.DDOS:洪水攻击!(饱和攻击)
客户端
1.建立连接
2.发送消息
/*** @author chenGen* @version 1.0.0* @ClassName TcpClienDemo01.java* @Description TODO* @createTime 2021年09月23日 14:30:00*///客户端public class TcpClienDemo01 {public static void main(String[] args) {OutputStream os =null;Socket socket=null;//设置服务端的ip和端口try {InetAddress address = InetAddress.getByName("127.0.0.1");//端口int ip=9999;//创建一个socket连接socket=new Socket(address,ip);//发送os = socket.getOutputStream();os.write("hello!".getBytes());} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if (os!=null){try {os.close();} catch (IOException e) {e.printStackTrace();}}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}}
服务端
1.建立服务连接的端口 ServerSocket
2.等待用户的连接 accept
3.接收用户信息
//服务端public class TcpServerDemo1 {public static void main(String[] args) {ServerSocket socket=null;Socket accept=null;InputStream ios=null;ByteArrayOutputStream bais=null;try {//创建一个socket服务端socket=new ServerSocket(9999);//等待客户端发送信息accept = socket.accept();//读取客户端信息ios = accept.getInputStream();byte [] bytes=new byte[1024];int len;//管道流bais=new ByteArrayOutputStream();while ((len=ios.read(bytes))!=-1){bais.write(bytes,0,len);}System.out.println(bais.toString());} catch (IOException e) {e.printStackTrace();}finally {if (bais!=null){try {bais.close();} catch (IOException e) {e.printStackTrace();}}if (ios!=null){try {ios.close();} catch (IOException e) {e.printStackTrace();}}if (accept!=null){try {accept.close();} catch (IOException e) {e.printStackTrace();}}if (socket!=null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}}
TCP实现文件上传
客户端
//客户端发送文件public class TcpClienDemo2 {public static void main(String[] args) throws IOException {//创建一个socket连接Socket socket=new Socket(InetAddress.getByName("127.0.0.1"),9999);//创建一个输出流OutputStream outputStream = socket.getOutputStream();//读取文件FileInputStream fis=new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\ed437daaf444474e9391523df81e986.jpg"));byte[] bytes=new byte[1024];int len;//写出文件while ((len=fis.read(bytes))!=-1){outputStream.write(bytes,0,len);}//通知服务器我已经传输完毕socket.shutdownOutput();//获取服务器的信息InputStream is = socket.getInputStream();//管道流ByteArrayOutputStream baos=new ByteArrayOutputStream();byte [] bytes1=new byte[1024];int len1;while ((len1=is.read(bytes1))!=-1){baos.write(bytes1,0,len1);}System.out.println(baos.toString());//关闭连接socket.close();outputStream.close();fis.close();is.close();baos.close();}}
服务端
//服务端接收文件public class TcpServerDemo2 {public static void main(String[] args) {try {//创建服务的Socket端ServerSocket serverSocket=new ServerSocket(9999);//持续监听客户端请求Socket accept = serverSocket.accept();//阻塞式监听 会一直等待//获取读写流InputStream ios = accept.getInputStream();//文件输出FileOutputStream fos=new FileOutputStream(new File("abcd"));byte [] bytes=new byte[1024];int len;while ((len=ios.read(bytes))!=-1){fos.write(bytes,0,len);}//通知客户端我已接收到文件OutputStream os = accept.getOutputStream();os.write("文件已收到,请关闭连接!".getBytes());//关闭连接// os.close();fos.close();ios.close();accept.close();serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}
UDP发送端短信 需要ip地址
客户端
//UDP 不需要连接服务器public class TestUdpClient {public static void main(String[] args) throws Exception {//建立一个socketDatagramSocket socket=new DatagramSocket();//建包String msg="你好,我的朋友!";InetAddress inetAddress = InetAddress.getByName("localhost");int port=9090;DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,inetAddress,port);//发送包socket.send(packet);//关闭流socket.close();}}
服务端
//服务端public class TestUdpServer {public static void main(String[] args) throws Exception {//开放端口DatagramSocket socket=new DatagramSocket(9090);//接收数据包byte[]bytes=new byte[1024];DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);socket.receive(packet);System.out.println(new String(packet.getData(),0,packet.getLength()));//关闭连接socket.close();}}
//服务端public class UdpReceiveDemo1 {public static void main(String[] args) throws Exception {DatagramSocket socket=new DatagramSocket(6666);while (true){//接收byte [] bytes=new byte[1024];DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length);socket.receive(packet);//判断是否结束byte[] data = packet.getData();String receiveData = new String(data, 0, data.length);System.out.println(receiveData);if (receiveData.equals("Bye")){break;}}socket.close();}}//接收端public class UDPSend2 {public static void main(String[] args) throws Exception {DatagramSocket socket=new DatagramSocket(8888);//准备数据:控制台读取 System.inBufferedReader reader=new BufferedReader(new InputStreamReader(System.in));//循环发送while (true){String data = reader.readLine();byte[] bytes = data.getBytes();DatagramPacket packet=new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress("localhost",6666));socket.send(packet);if (data.equals("Bye")){break;}}socket.close();}}
