一、什么是网络编程
网络编程的实质就是两个或多个设备之间的数据传输。和普通的单机程序相比,网络程序最大的不同就是需要交换数据的程序运行在不同的计算机上,交换时通过ip地址和端口实现设备之间的数据交互。
网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的!中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理!
二、网络编程的实现的必须条件
网络编程的三要素:
1)找到ip地址;2)指定端口;3)必须要有通信的协议
这三个要素可以这样理解,如果一台计算机要向另外一台计算机传输数据,那么首先就需要找到这台计算机,而每台计算机都有自己的ip地址,那么找到相应的ip地址就找了需要通信的计算机,而每个计算机又有很多端口,这就需要指定一个空闲的端口进行通信,这样计算机也可以稳定有序的工作。而通信协议就可以理解为双方做的约定,以大家都懂的方式进行数据的传输。
ip地址和端口号我们平时也都是可以理解的,那么网络编程中的重点就在通信协议上。
网络的通信协议这里提到两种:UDP协议和TCP协议
首先可以简单的理解为UDP协议是发送端和接收端之间的通信协议,而TCP协议则理解为客户端和服务器端的交互。这两种协议的具体区别如下:
UDP协议:该协议不需要建立连接通道,数据是以数据包的形式发送的,是一种不可靠协议,执行效率高,但是发送数据的大小有限制。
TCP协议:该协议需要建立连接通道,数据是以流的形式发送的,是一种可靠的协议,执行效率低,发送的文件大小无限制。
下面分别给出这两种协议的编程实例,然后再具体分析:
1、UDP协议实例:
发送端:
package org.westos_02;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendDemo {
public static void main(String[] args) throws Exception {
//使用UDP协议创建Socket对象不是Socket类对象,(客户端的套接字)
//DatagramSocket:用来发送和接收数据报包的套接字。
//public DatagramSocket() throws SocketException
DatagramSocket ds = new DatagramSocket() ;//创建了UDP协议的Socket对象
//发送一句话
String str = "hello,udp,i'm coming" ;
//2)创建数据报包对象
byte[] bys = str.getBytes() ;
//当前字节数组的实际长度
int len = bys.length ;
//创建InetAddress对象,Ip地址对象
InetAddress address = InetAddress.getByName("192.168.10.101") ;
//指定端口号
int port = 10086 ;
DatagramPacket dp = new DatagramPacket(bys, len, address, port) ;
//3)调用UDP协议DataScoket类里面发送的方法
ds.send(dp) ;
//4)关闭资源
ds.close() ;
}
}
这是一个UDP协议的发送端,主要步骤可以归结于下
步骤:
1)创建UDP协议发送端的Socket对象
2)创建数据报包:通过这个数据包将数据发送到接收端
3)调用UDP协议发送端发送的方法
4)关闭资源
Socket指的是套接字,可以理解为两台机器间通信的端点。以为UDP协议是以数据报包的形式发送的,所以,需要将数据封装到一个数据包里,然后发送数据。DatagramSocket()是DatagramSocket:用来发送和接收数据报包的套接字,用此来创建UDP协议的Socket对象,InetAddress类是表示互联网协议地址(IP地址),可以通过此类得到ip地址或者计算机名。
UDP协议的接收端:
package org.westos_02;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
//创建UDP协议接收端的scoket对象
DatagramSocket ds = new DatagramSocket(10086) ;
//创建数据报包:DatagramPacket,来接收发送端发送来的数据
byte[] bys = new byte[1024] ;
DatagramPacket dp = new DatagramPacket(bys, bys.length) ;
//3)调用DataScoket里面接收的方法
ds.receive(dp) ;// 阻塞式方法(等待发送端发送数据,只要没有数据,就一直等待,有数据的话将数据显示控制)
//4))解析数据报包里面的实际数据,显示在控制台上
InetAddress address = dp.getAddress() ;
String ip = address.getHostAddress() ;
//解析发送端发送来的实际数据
byte[] dataBys = dp.getData() ;
//获取数据缓存区中的实际长度
int len = dp.getLength() ;
//将字符串显示出来
String str = new String(dataBys,0,len) ;
//输出到控制台
System.out.println(ip+":给你发送了:"+str);
}
}
UDP协议的接收端的步骤可以总结为一下几点:
1)创建接收端的Socket对象
2)创建一个数据报包接收发送端发送来的数据报包(接收容器)
3)接收数据,调用DataScoket类中的接收的方法来接收数据包
4)解析数据报包里面的实际数据,显示在控制台上
5)关闭资源
需要注意的是,如果 多次运行接收端,就会出现一处:BindException:绑定异常。这是因为接收端运行一次之后,端口已经被占用,不能再继续使用此端口了。接收端一直等待发送端发送数据,只要没有数据,就一直等待,有数据的话将数据显示控制。
以上就是UDP协议传输的一个简单的过程,可以看出,它们之间是没有通道连接的,传输的时候,可以先运行发送端也可以先运行接收端,都不会有什么问题,只是如果是先运行了发送端,那么接收端不能接收到数据。
下面是TCP协议的实例:
客户端:
package org.westos_06;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args) throws IOException {
//创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
Socket s = new Socket("192.168.10.101", 10010) ;
//2) 获取通道的内流(输出流)
OutputStream out = s.getOutputStream() ;
//3)客户端通道内的流给服务器写数据
out.write("hello,TCP,我来了...".getBytes()) ;
//4)关闭客户端socket
s.close() ;
}
}
TCP协议是以流的方式进行传输的,所以要获取通道中的流,其主要步骤如下:
客户端步骤:
1)创建客户端的socket对象 (客户端套接字流的形式)
2)获取通道的内流(输出流)
3)使用输出流对象写数据
4)关闭客户端的Socket对象
服务器端:
package org.westos_06;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws IOException {
//实现服务器套接字。服务器套接字等待请求通过网络传入
ServerSocket ss = new ServerSocket(10010) ;
System.out.println("等待客户端连接...");
//2)监听客户端的连接:请求等待介入
Socket s = ss.accept() ;//一旦客户端那边也是端口,阻塞式方法就会结束
System.out.println("客户端已经连接...");
//3)获取通道内的输入流对象
//public InputStream getInputStream()
InputStream in = s.getInputStream() ;
//4)将客户端发送的数据显示到控制台上
//定义一个缓冲数组
byte[] bys = new byte[1024] ;
int len = in.read(bys) ;//获取到实际的字节数 (阻塞式)
String str = new String(bys, 0, len) ;
//获取IP地址的文本形式
// public InetAddress getInetAddress()返回套接字连接的地址。
InetAddress address = s.getInetAddress() ;
//在通过ip地址对象getHostName();
String ip = address.getHostAddress() ;
//输出显示到控制台
System.out.println(ip+"传递的数据是:"+str);
//关闭服务器端socket
s.close() ;
}
}
TCP协议的服务器端的主要步骤如下:
1)创建服务器端的socket对象,指定端口
2)服务器端需要监听客户端的连接
3)获取通道内的输入流
4)将数据获取到并显示到控制台
5)关闭服务器端的socket资源
对于TCP协议来说:客户端和服务器端是需要建立连接通道的,如果没有启动服务器端,先启动客户端就会报常:java.net.ConnectException Connection refused: connect :连接被拒绝!
这就是网络编程中的UDP协议和TCP协议的编程简单实例,可以实现数据传输。