网络编程
网络编程:java语言支持网络间的数据传输,将底层的细节封装起来了,给程序员提供了一套标准类库,方便java开发出可以进行网络通信的软件
核心问题:如何找到网络世界中的目标主机,和目标软件:找ip地址
如何安全可靠的进行数据传输
基本知识:
网络模型:
OSI参考模型:理想化的标准模型,有七层
实际使用的TCP/IP模型:
-
应用层:各种协议规则,软件部分
-
运输层:协议检测
-
网络层:找ip
-
物理链路层:硬件设备(网卡…)
通信要素:ip,端口,协议
IP:在网络世界中,表示计算机的地址
-
局域网地址:连接路由器,由路由器自动分配ip
-
广域网地址:家里的宽带,与外界连接
-
本机地址:本地回环地址
端口:是计算机中运行中的程序的编号
0~1024是留给系统程序的
1024~65535是为开发的程序使用,是我们为程序定义端口号时使用的
端口不能重复,不能与已有的端口冲突
如何安全传输——通信协议:
对传输的内容,速率,出错之后的处理办法等进行的控制与制约
传输层有两个主要协议:
-
传输控制协议TCP(Transmission Control Protocol)
使用TCP前必须先要检测网络是否畅通,服务器是否能连接到网络
即三次握手:第一次客户端给服务器发确保服务器能收到,第二次服务器收到给客户端发,此时客户端知道服务器能收到,然后第三次客户端再给服务器发,此时服务器也知道了自己的消息能被客户端收到
断开流程:
四次挥手:第一次客户端告诉服务器要断开了,第二次服务器给客户端反馈,第三次服务器把没有发完的数据给客户端,第四次客户端再通知服务器最终断开
-
用户数据报协议UDP(User Datagram Protocol)
将数据封装成一个一个数据报
每个数据报的大小限制在64K内
数据报中包含数据,源(自己电脑ip)目标(接收端ip 端口)
发送前不需要建立连接,只管发送不管成功与否
不够安全,但是效率高
例如根据坐标发射导弹
服务器与客户端:
Socket(InetAddress address,int port)throws IOException //根据InetAddress对象所表示的IP地址以及端口号port发起连接。 Socket(String host,int port) //域名是host。端口号为port)发起TCP连接,若成功,则创建Socket对象,否则抛出异常。 Socket accept() throws IOException //等待客户端的连接请求,返回与该客户端进行通信用的Socket对象
客户端:
//创建客户端try {//host是域名,port是端口Socket socket=newSocket("192.168.124.185",7777);//在客户端向服务器发送一段话OutputStream o=socket.getOutputStream();String s="哈哈哈";o.write(s.getBytes());} catch (IOException e) {e.printStackTrace();System.out.println("连接服务器失败");}
服务器:
try {//创建并启动服务器ServerSocket so=new ServerSocket(7777);System.out.println("服务器启动成功");//监听有没有客户端连接到服务器,监听时会阻塞程序Socket socket=so.accept();System.out.println("有客户端连接到了服务器");//接收客户端发送的数据InputStream in= socket.getInputStream();byte[] bytes=new byte[100];int size=in.read(bytes);String s=new String(bytes,0,size);System.out.println(s);} catch (IOException e) {e.printStackTrace();System.out.println("服务器启动失败");}
用Data在客户端和服务器之间输入输出数据:
客户端:
//创建客户端try {Socket socket=new Socket("192.168.124.185",7777);//host是域名,port是端口//在客户端向服务器发送一段话OutputStream outputStream= socket.getOutputStream();DataOutputStream dataOutputStream=new DataOutputStream(outputStream);//数据处理流,直接可以输出字符串Scanner scanner=new Scanner(System.in);System.out.println("客户端输入:");String s=scanner.next();dataOutputStream.writeUTF(s);//接收服务器发的消息InputStream inputStream= socket.getInputStream();DataInputStream dataInputStream=new DataInputStream(inputStream);String s1=dataInputStream.readUTF();System.out.println("服务器说:"+s1);} catch (IOException e) {e.printStackTrace();System.out.println("连接服务器失败");}
/*
客户端输入:
xswl
服务器说:byd
*/
服务器:
try {//创建并启动服务器ServerSocket so=new ServerSocket(7777);System.out.println("服务器启动成功");Socket socket=so.accept();//监听有没有客户端连接到服务器,监听时会阻塞程序System.out.println("有客户端连接到了服务器");//接收客户端发送的数据InputStream inputStream= socket.getInputStream();DataInputStream dataInputStream=new DataInputStream(inputStream);String s=dataInputStream.readUTF();System.out.println("客户端说:"+s);//服务器回复消息OutputStream outputStream = socket.getOutputStream();DataOutputStream dataOutputStream=new DataOutputStream(outputStream);Scanner scanner=new Scanner(System.in);System.out.println("服务器输入:");String s1=scanner.next();dataOutputStream.writeUTF(s1);} catch (IOException e) {e.printStackTrace();System.out.println("服务器启动失败");}
/*
服务器启动成功
有客户端连接到了服务器
客户端说:xswl
服务器输入:
byd
*/