网络编程:java语言支持网络间的数据传输,将底层的细节封装起来了,给程序员提供了一套标准类库,方便java开发出可以进行网络通信的软件
核心问题:如何找到网络世界中的目标主机,和目标软件:找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
*/