1、 基本概述
网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用。
网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。
中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,代码、开发工具、数据库、服务器架设和网页设计这5部分你都要接触。
计算机网络
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
网络编程目的
交流信息、数据交换、通信。
想要达到的效果
-
如何准确的定位网络上一台主机 192.164.16.243 端口 定位到计算机上的某个资源
-
找到了主机,如何进行传输?
Java web : 网页编程 B/S
网络编程 :TCP / I P C/S
2、网络通信的要素
如何实现双方的通信?
通信双方的地址 : 1. I P 2. 端口号
规则 :网络通信协议
(1、1.1 )
小结:
-
网络编程中主要的两个问题
1、如何准确的定位网络上一台或多台电脑主机
2、找到主机后如何通信
-
网络编程中的要素
1、TCP/I P 端口号
2、网络通信协议 U D P TCP
3、I P
I P地址 : lnetAddress
1、唯一定位一台网络计算机
2、127.0.0.1 本机 localhost
3、i p地址的分类 :
1. IPV4 / 由四个字节组成 (0~255) 大概有42亿 北美30亿 亚洲4亿
IPV6 / 128位 。8个无符号整数
2. 公网(互联网)—— 私网(局域网)
4、域名:记忆I P问题
4、端口
端口表示一个程序的进程;
-
不同的进程有不同的端口号!用来区分软件(0~65536)
-
TCP / UDP ; 65536*2 ; TCP = 80;U D P = 80; 是可以的,但是单个协议下端口号不能冲突。
-
端口分类:
1、公有端口 (0~1023)
HTTP : 80
HTTP S : 443
FTP : 21
SSH : 22
Telent : 23
2、程序注册端口 (1024~49151), 分配给用户或者程序的
Tomcat : 8080
MySQL : 3306
Oracle : 1521
3、动态、私有端口 (49152~65535)
netstat -ano #查看所有的端口 netstat -ano|findstr "5900" #查看指定的端口 tastlist|findstr "8696" #查看指定端口的进程
5、通信协议
网络通信协议 :速率、传输码率、代码结构、传输控制
大事化小 :分层!
TCP : 用户传输协议
UDP : 用户数据报协议
I P :网络互联协议
TCP和UDP对比
TCP : 好比打电话
:连接,稳定
:三次握手,四次挥手
:客户端、服务端
:传输完成、释放连接、效率低
UDP : 好比发短信
:不连接,不稳定
:客户端、服务端;没有明确的界限
:不管准备好与否,都进行发送
:导弹
:DDOS(洪水攻击!)饱和攻击
6 、TCP
1.客户端
1、连接服务器通过Socket
2、发送消息
package IP01; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; //客户端 public class TcpClientDemon01 { public static void main(String[] args) { Socket socket = null; OutputStream os = null; try { //1、要知道服务器的地址.端口号 InetAddress serviceIP = InetAddress.getByName("127.0.0.1"); int port = 9999; //2、创建一个socket连接 socket = new Socket(serviceIP, port); //3、发送消息 os = socket.getOutputStream(); os.write("你好,这是合适呢吗".getBytes()); } catch (Exception 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(); } } } }
2.服务端
1、建立服务端口 Server Socket
2、等待用户的连接 通过accept
3、接受用户的消息
package IP01; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; //服务端 public class TcpServiceDemon01 { public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; Socket socket = null; InputStream is = null; ByteArrayOutputStream baos = null; try { //1、我得有一个地址 serverSocket = new ServerSocket(9999); //2、等待客户端连接过来 socket = serverSocket.accept(); //3、读取客户端消息 is = socket.getInputStream(); //管道流 baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer))!=-1){ baos.write(buffer,0,len); } System.out.println(baos.toString()); } catch (IOException e) { e.printStackTrace(); } finally { //关闭资源 if (baos!=null){ try { baos.close(); } catch (IOException e){ e.printStackTrace(); } } if (is!=null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket!=null){ try { socket.close(); }catch (IOException e){ e.printStackTrace(); } } if ( serverSocket!= null){ try { serverSocket.close(); }catch (IOException e){ e.printStackTrace(); } } } } }
3.文件上传
package IP01; import java.io.*; import java.net.InetAddress; import java.net.Socket; //客户端 public class TcpClientDemon02 { public static void main(String[] args) throws Exception { //1.创建一个Socket连接 Socket socket = new Socket(InetAddress.getByName(" 192.168.1.106"), 9000); //2.创建一个输出流 OutputStream os = socket.getOutputStream(); //3.文件流 FileInputStream fil = new FileInputStream(new File("D:\\123.jpg"));//路径要具体 //4.写出文件 byte[] buffer = new byte[1024]; int len; while ((len = fil.read(buffer))!=-1) { os.write(buffer,0,len); } //通知服务器,我已经结束了 socket.shutdownOutput();//我已经传输完了 //确定服务器接收完毕,才能够断开连接 InputStream inputStream = socket.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer2 = new byte[2048]; int length2; while ((length2 = inputStream.read(buffer2))!=-1){ baos.write(buffer2,0,length2); } System.out.println(baos.toString()); //5.关闭资源 fil.close(); os.close(); socket.close(); baos.close(); inputStream.close(); } }
package IP01; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.io.InputStream; public class TcpServiceDemon02 { public static void main(String[] args) throws Exception { //1.创建服务 ServerSocket serverSocket = new ServerSocket(9000); //2.监听客户端连接 Socket socket = serverSocket.accept();//设置阻塞监听 //3.获取输入流 InputStream is = socket.getInputStream(); //4.文件输出 FileOutputStream fos = new FileOutputStream(new File("D:\\receive.jpg")); //路径要具体 byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer))!=-1){ fos.write(buffer,0,len); } //通知客户端我接受完毕了 OutputStream os = socket.getOutputStream(); os.write("我接受完毕了".getBytes()); //关闭资源 fos.close(); is.close(); socket.close(); serverSocket.close(); } }
7、Tomcat
1.服务端
-
自定义 S
-
Tomcat 服务端 S :Java后台开发!
2.客户端
-
自定义 C
-
浏览器 B
8、UDP
属于发短信行为,只需要知道对方地址
没有客户端和服务端这种说法,而是说发送端和接收端
package UDP; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; //发送端 //不需要连接服务器 public class Demon01 { public static void main(String[] args) throws Exception { //1.建立一个Socket DatagramSocket socket = new DatagramSocket(); //2.建立包 String msg = "你好啊"; //发送给谁,地址 InetAddress localhost = InetAddress.getByName("localhost"); int port = 9090; // 数据,数据的起始长度 最后是要发送给谁 DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port); //3.发送包 socket.send(packet); //4.关闭流 socket.close(); } }
package UDP; import java.net.DatagramPacket; import java.net.DatagramSocket; //接收端 public class Demon02 { public static void main(String[] args) throws Exception { //开放端口 DatagramSocket socket = new DatagramSocket(9090); //接收数据 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())); System.out.println(packet.getAddress().getHostAddress() ); socket.close(); } }
9、URL
统一资源定位符 : 定位资源,定位互联网上的某一个资源