网络编程概述
1.什么是计算机网络
把分布在不同地方的"计算机",通过通信设备与线路连接起来,实现信息,资源共享.
2.计算机网络最早出现在哪里,演变趋势是什么?
最早出现在美国军方使用,后逐渐推广至全球各地
网络模型
java语言是支持网络的, java把网络实现细节封装成不同的类,使用这些类开发的程序就可以实现网络间的数据传输.
网络编程的目的:直接或间接地通过网络协议与其它计算机进行通讯
网络编程两个核心要素:
1.如何精确找到网络中的某台主机
2.找到后如何可靠高效的进行数据传输
解决这两个要素的方法一般是:
1.通过IP(主机)找主机+端口(程序)找计算机中的程序
2.通信协议:通信双方TCP或UDP进行数据传输
传输层协议中有两个非常重要的协议:
● 传输控制协议TCP(Transmission Control Protocol)
● 用户数据报协议UDP(User Datagram Protocol)。
TCP
特点
安全可靠 相对于UDP协议 传输效率低
发送数据前 先要建立连接 三次握手
三次握手:通俗理解就是客户端向服务器端发送链接请求,服务器端收到后会向客户端返回连接请求和序号无误,客户端收到反馈后会再次向服务器端反馈信息,从而建立连接
确定网络没有问题开始进行数据发送
结束时 四次挥手
**四次挥手:**客户端向服务器端发送断开请求与序号,服务器端收到后会返回确认断开连接信息以及未传输完成的数据,客户端收到后会向服务器端进行数据确认收到信息后断开
UDP
特点:
发送数据不需要建立和释放连接 速度快
但是不可靠: 将数据,源,目的 封装在一个数据报中,只管发送即可
TCP编程
网络app开发大多利用套接字Soket进行开发,并且通信的两端都要有Socket,因为Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输
Socket常用方法
- InputStream getInputStream() throws IOException
获取与Socket相关联的字节输入流,用于从Socket中读 数据
- OutputStream getOutputStream() throws IOException
获取与Socket相关联的字节输出流,用于向Socket中写 数据。
socket工作过程
● 创建 Socket
● 打开连接到 Socket 的输入/出流:
**使用 getInputStream()方法获得输入流,
使用 getOutputStream()方法获得输出流,进行数据传输
● 按照一定的协议对 Socket 进行读/写操作
● 关闭 Socket:
代码实现
package lesson.io3_12_18;
import com.sun.corba.se.spi.activation.Server;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class netdemo {
/*启动服务器端*/
public static void main(String[] args) throws IOException {
/*1.创建服务器*/
ServerSocket serverSocket = new ServerSocket(9966);
System.out.println("服务器启动,等待客户端连接");
//监听客户带有无连接到服务器,裂解后返回客户端socker对象,如果一直没有客户端连接,一直阻塞等待
Socket socket = serverSocket.accept();
System.out.println("客户端连接成功");
//4.在服务器端接收消息
InputStream in = socket.getInputStream();
byte[] b = new byte[100];
int length = in.read(b);
String s = new String(b, 0, length, "utf-8");
System.out.println(s);
}
}
package lesson.io3_12_18;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Clint {
//启动客户端
public static void main(String[] args) throws IOException {
/*2.创建客户端*/
//创建客户端Sockert,创建时三次握手,检测网络是否畅通,不畅通报错
Socket socket = new Socket();
/* 3.客户端向服务器端发消息*/
//获得输出流对象,并向服务器端发送数据
//客户端给服务器端以流的方式发消息
OutputStream outputStream = socket.getOutputStream();
outputStream.write( "你好".getBytes("utf-8"));
}
}
UDP编程
UDP不同于TCL,它通过类DatagramSocket和 DatagramPacket 实现了基于 UDP 协议网络程序。
UDP数据报通过数据报套接字 DatagramSocket 发送和接收,它只管发送不考虑是否送达,这就是为什么UDP不够安全的原因
DatagramPacket 对象封装了UDP数据报
<注释:UDP的发送与接收方不用建立联系---->
下面我们使用代码实现
package lesson.net12_21;
//服务器端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Udp1 {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(9999);
byte[] b = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(b, b.length);
//接受
while (true) {
datagramSocket.receive(datagramPacket);
String s = new String(b, 0, datagramPacket.getLength(), "utf-8");
System.out.println(s);
}
}
}
package lesson.net12_21;
//客户端
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.*;
public class udp2 {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket();
while(true){
//创建数据报
byte [] b = "你好服务器".getBytes("UTF-8");
DatagramPacket packet = new DatagramPacket(b,b.length, InetAddress.getByName("127.0.0.1"),9999);
datagramSocket.send(packet);
}
}
}