第九章:网络编程
1.网络编程的概述
1.什么是计算机网络:
把分布在不同地理区域的具有独立功能的计算机(各种设备),通过通信设备与线路(网线)连接起来,有功能完善的软件实现资源共享和信息传递的系统
2.什么叫网络编程:
我们写的程序可以支持网络通信,实现程序与程序之间互联互通。
java提供的网络类库,可以实现网络连接,联网的底层细节被隐藏在Java本机安装系统里 ,由JVM控制,并且Java实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境
3.网络编程的目的:
直接或间接的通过网络协议与其他计算机进行通讯
4.网络编程要素:
如何找到对方主机(电脑):IP
如何可靠高效的进行数据传输:通信协议
2.网络模型
一端与另一端进行网络通信过程中的模型
OSI参考模型:理想中的规范
TCP/IP模型:实际中的规范
3.网络通信要素:IP,端口号,通信协议
1.IP地址:互联网协议地址 又译为忘记协议地址,网络中的计算机使用IP地址来进行唯一标识(网络中一个计算机地址)
本机回环地址:如127.0.0.1 没网卡的情况下访问本机软件
cmd里输入ipconfig
2.端口号:与计算机上安装的软件有关
一个电脑上安装了许多软件,可以为运营中的程序分配一个端口号
一般访问:
IP(找主机)+端口(找程序)
3.通信协议:就是约定,通信双方如何发送数据,出错了怎么办 速率啊啥的
两个非常著名的传输层协议:
TCP:传输控制协议(客服端与服务端之间的通信协议
UDP:用户数据报协议
4.TCP协议
速度慢 需要建立连接 释放连接
发送前要进行3次握手,确保连接通道是顺畅的
TCP三次握手:
四次挥手:传输完毕后关闭是一个过程 不是啪的就关闭了 要进行四次挥手
5.UDP协议
将数据、源(从哪发出)、目的封装成数据报,不需要建立连接 故不是可靠的 但发送数据结束时无需释放资源,所以速度快。每个数据报大小限制在64K
6.java支持TCP和UDP通信协议的实现类
Socket是基于TCP协议的
客户端:
package feifan;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Wangluokehuduan {
public static void main(String[] args) throws IOException {
//客户端Socket,创建时会3次握手建立连接
Socket socket=new Socket("192.168.223.5",9999);//IP+端口
OutputStream out=socket.getOutputStream();
out.write("林书豪".getBytes("utf-8"));
/* out.write("加油".getBytes("utf-8"));*/
InputStream in=socket.getInputStream();
byte[] b=new byte[100];
int size=in.read(b);
String s=new String(b,0,size,"utf-8");
System.out.println(s);
}
}
服务端:
package feifan;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Wangluofuwuduan {
public static void main(String[] args) throws IOException {
//客户端与服务器连接
//建立服务器
ServerSocket serverSocket=new ServerSocket(9999);//端口在0-65535之间 不能使用已存在的端口
System.out.println("服务器启动了");
Socket socket=serverSocket.accept();//监听 有没有客服端尝试连接服务器 一直就在监听
System.out.println("客户端连接成功");
InputStream in= socket.getInputStream();
OutputStream out=socket.getOutputStream();
byte[] b=new byte[100];
int size=in.read(b);
//byte数组如何转换成字符串
String s=new String(b,0,size,"utf-8");
System.out.println(s);
//回消息
out.write("团子".getBytes("utf-8"));
}
}
客户端和服务端一来一回聊天:要建立连接 先启动服务端 再启动客户端
客户端:
package feifan;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
public class client {
//客户端
public static void main(String[] args) throws IOException {
Socket socket=new Socket("192.168.242.5",9999);//IP+端口
DataInputStream datain=new DataInputStream(socket.getInputStream());
DataOutputStream dataout=new DataOutputStream(socket.getOutputStream());
Scanner scanner=new Scanner(System.in);
while (true){
System.out.println("客户端说:");//发消息
String s=scanner.next();
dataout.writeUTF(s);
if (s.equals("886")){
break;
}
//接收服务器的消息 然后输出
System.out.println("服务器说:"+datain.readUTF());
}
socket.close();
datain.close();
dataout.close();
}
}
服务端:
package feifan;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class server {
//服务端
public static void main(String[] args) throws IOException {
ServerSocket serverSocket=new ServerSocket(9999);//端口
Socket socket=serverSocket.accept();//监听
DataInputStream datain=new DataInputStream(socket.getInputStream());
DataOutputStream dataout=new DataOutputStream(socket.getOutputStream());
Scanner scanner=new Scanner(System.in);
while (true){
System.out.println("客户端说:"+datain.readUTF());//接收完了输出
System.out.println("服务器说:");//回消息
String ss=scanner.next();
dataout.writeUTF(ss);
}
}
}
7.UDP协议实现类
没有服务的概念 就只有发送端和接收端 不需要建立连接
·类DatagramSocket与DatagramPacket实现了基于UDP协议网络程序。
·数据报通过DatagramSocket发送和接收,不保证一定送达,何时送达
·DatagramPacket对象封装了UDP数据报,数据报中包含了发送端和接收端的IP地址和端口号 所以不需要建立连接
流程:
1.DatagramSocket与DatagramPacket
2.建立发送端和接收端(是两个独立程序)
3.建立数据报
4.调用Socket的发送、接收方法
5.关闭Socket
发送端:
package feifan;
import java.io.IOException;
import java.net.*;
public class send {
public static void main(String[] args) throws IOException {
//发送端
DatagramSocket datagramSocket=new DatagramSocket();//DatagramSocket既可以发送 也可以接收 不需要端口 数据报里有
byte[] b="季后赛".getBytes();
//创建数据报 封装数据
while (true){//一直发
DatagramPacket datagramPacket=new DatagramPacket(b,b.length, InetAddress.getByName("192.168.242.5"),9999);//数据报
datagramSocket.send(datagramPacket);
}
}
}
接收端:
package feifan;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class receive {
public static void main(String[] args) throws IOException {
//接受信息
DatagramSocket datagramSocket=new DatagramSocket(9999);
byte[] b=new byte[1024];
while (true){//一直接
DatagramPacket datagramPacket=new DatagramPacket(b,b.length);//传进去一个数组 还有数组长度
datagramSocket.receive(datagramPacket);//接受数据到数据报中
String s=new String(b,0,datagramPacket.getLength());//实际长度
System.out.println(s);
}
}
}