一 网络编程
网络编程就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。
二 网络模型7层概述
1物理层:主要定义物理设备标准。
2数据链路层:主要将从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装。
3网络层:主要将从下层接收到的数据进行IP地址的封装与解封装。
4传输层:定义了一些传输数据的协议和端口号。
5会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。
6表示层:主要是进行对接收的数据进行解释、加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转换成人能够能识别的东西如图片、声音等)。
7应用层: 主要是一些终端的应用。
三 网络通信3要素
IP地址:网络中设备的标识,不易记忆,可用主机名。
端口号:用于标识进程的逻辑地址,不同进程的标识。
传输协议:通讯的规则。常见协议:TCP,UDP。
四 UDP与TCP
UDP:将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,但是速度快。
UDP发送端:
import java.net.*;
import java.io.*;
public class UDPSendKey {
public static void main(String[] args)throws Exception {
//创建投递包服务对象
DatagramSocket ds = new DatagramSocket(6000);
//创建接收键盘输入IO流
BufferedReader bfr = new
BufferedReader(new InputStreamReader(System.in));
//开始读取键盘输入
String line = null;
while((line = bfr.readLine())!=null){
if("over".equals(line))
break;
//转成字节数组
byte[] bytes = line.getBytes();
//封装数据包
DatagramPacket dp = new DatagramPacket(bytes, bytes.length,
InetAddress.getByName("127.0.0.1"),8000);
//发送数据包
ds.send(dp);
}
ds.close();
}
}
UDP接收器:
import java.net.*;
public class UDPReceive {
public static void main(String[] args)throws Exception {
//定义字节数组
byte[] bytes = new byte[1024];
//创建投递包,接收包服务对象DatagramSocket,传递端口号
DatagramSocket ds = new DatagramSocket(6000);
while(true){
//创建数据包对象,接收对方发来的数据包
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
//调用投递包对象方法receive接收数据包
ds.receive(dp);
//拆包
//获取发送的字节数组有效长度
int length = dp.getLength();
//获取发送端IP地址
String ip = dp.getAddress().getHostAddress();
//获取发送的端口号
int port = dp.getPort();
//输出接收的字节数组
System.out.println(new String(bytes,0,length)+".."+ip+".."+port);
}
//ds.close();
}
}
TCP:建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低。
TCP客户端:
import java.net.*;
import java.io.*;
public class TCPClient {
public static void main(String[] args)throws Exception {
//创建客户端连接对象,连接服务器
Socket s = new Socket("127.0.0.1", 9000);
//读取键盘数据
BufferedReader bfr = new
BufferedReader(new InputStreamReader(System.in));
//通过客户端连接对象,获取字节输出流向服务器发送数据
//OutputStream out = s.getOutputStream();
//打印流,简化操作 PrintWriter(任何流数据目的)
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;
while((line = bfr.readLine())!=null){
if("over".equals(line))
break;
//发送服务器
out.println(line);
}
bfr.close();
s.close();
}
}
TCP服务端:
import java.net.*;
import java.io.*;
public class TCPServer {
public static void main(String[] args) throws Exception{
//创建服务器连接对象,打开9000端口
ServerSocket ss = new ServerSocket(9000);
//获取客户端连接对象
Socket s = ss.accept();
//读取客户端数据,客户端连接对象获取字节输入流
//InputStream in = s.getInputStream();
//发送的字符文本,字节流直接读不方便,转成字符流
BufferedReader bfrIn =
new BufferedReader(new InputStreamReader(s.getInputStream()));
//循环读取客户端数据
String line = null;
while((line = bfrIn.readLine())!=null){
System.out.println(line.toUpperCase());
}
s.close();
ss.close();
}
}