Java学习——new网络编程
网络传输的三个基本要素:IP地址、端口、传输协议。
网络的参考模型:
QSI参考模型 | TCP/IP参考模型 |
应用层 | 应用层 |
表示层 | |
会话层 | |
传输层 | 传输层 |
网络层 | 网络层 |
数据链路层 | 主机层 |
物理层 |
UDP和TCP :
UDP的特点:
1、将数据及源和目地封装成数据包,不需要建立连接;(面向无连接)。
2、每个数据包的大小都限制在64k内;(数据会被封包)。
3、因无连接,是不可靠的协议;(不可靠,安全性不高)。
4、不需要建立连接,速度快;(数据传输速度快)。
TCP的特点:
1、建立连接,形成传输数据的通道。
2、通过三次握手完成连接,是可靠的协议。
3、必须建立连接,效率会稍低。
UDP发送端和接收端创建步骤:
发送端:
第一步:创建UDP Socket服务,通过DatagramSocket对象创建。
第二步:确定数据,并封装成数据包,通过DatagramPacket对象创建。
第三步:通过UDP服务,将已有的数据包发送出去,使用send方法。
第四步:关闭资源,通过DatagramSocket的close方法。
UDP发送端示例:
class UDPsend
{
public static void main(String[] args)
{
//创建UDP 服务。
DatagramSocket ds = new DatagramSocket();
//确定数据,并封装成数据包。
byte[] buf = “UDP发送端”.getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName(“127.0.0.1”),10000);
//通过UDP Socket服务的send()方法,将数据包发送出去。
ds.send(dp);
//关闭资源。
ds.close();
}
}
接收端:
第一步:创建UDP Socket服务,通过DatagramSocket对象创建,并指定一个监听端口。
第二步:定义一个数据包,通过DatagramPacket来创建,同时让该数据包接收一个字节数组,让该数组作为数据包中的缓冲区,用来存放接收到的数据;而且数据包对象中有更多功能,可以很方便的提取字节数据中的不同数据信息。
第三步:通过UDP服务的receive方法将收到的数据存入到已定义好的数据包中。
第四步:通过数据包对象的特有功能,将这些不同的数据取出。
第五步:关闭资源。
UDP接收端示例:
class UDPreceive
{
public static void main(String[] args)
{
//创建UDP Socket服务,并指定端口,建立端点。
DatagramSocket ds = new DatagramSocket(10000);
//定义数据包,用于存放接收到的数据。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//通过UDP Socket服务的receive方法,将接收到的数据存入数据包缓冲中。
ds.receive(dp);//该方法是阻塞式的。
//通过数据包的方法,获取其中的数据。
String ip = dp.getAddress().getHostAddress(); //获取发送端ip地址。
String data = new String(dp.getData(),0,dp.getLength()); //获取发送端发出的数据。
int port = dp.getPort(); //获取端口。
System.out.println(ip+”:”+data+”:”+port);
//关闭资源。
ds.close();
}
}
TCP客户端和服务端创建步骤:
客户端:
第一步:创建客户端的Socket服务,并指定目的主机和端口。
第二步:获取Socket服务的输出流,为发送数据而做的准备。
第三步:向服务器发送数据,并将数据转换成字节数组后在发送。
第四步:关闭客户端;(数据发送完后,要断开与服务器的连接,来释放服务器的资源)。
TCP客户端示例:
class TCPClinet
{
public static void main(String[] args)
{
//创建客户端的Socket服务,并指定目的主机和端口。
Socket s = new Socket(“127.0.0.1”,10000);
//获取Socket服务中的输出流。
OutputStream out = s.getOutputStream();
//向服务器发送数据,并将数据转换成字节数组后在发送。
out .write(“TCP客户端”.getByte());
//关闭客户端
s.close();
}
}
服务端:
第一步:建立服务端的ServerSocket服务,并指定一个监听端口。
第二步:获取连接过来的客户端对象,通过accept方法;(该方法是阻塞式的方法)。
第三步:获取客户端的读取流来读取客户端发送过来的数据。
第四步:关闭客户端(数据发送完后,要断开与服务器的连接,来释放服务器的资源)。
关闭服务端(是个可选项,因为在实际网络应用中,服务器通常是全天候运行的)。
TCP服务端示例:
class TCPServer
{
public static void main(String[] args)
{
//创建服务端的ServerSocket服务,并监听一个端口。
ServerSocket ss = new ServerSocket(10000);
//通过accept方法获取连接过来的客户端对象。
Socket s = ss.accept(); //该方法是阻塞式的。
String ip = s.getInetAddress().getHostAddress(); //获取连接过来的客户端ip地址。
System.out.println(“ip为:”ip+“:的客户端已连接”);
//获取客户端的读取流来读取客户端发送过来的数据。
InputStream in = s.getInputStream();
定义一个字节数组作为容器,将读取到的数据存入字节数组中。
byte[] buf = new byte[1024];
int len = in.read(buf); //read也是个阻塞式方法。
System.out.println(new String(buf,0,len));
//关闭客户端,断开与服务器的连接。释放服务器的资源。
s.close();
//关闭服务,(可选操作,通常情况下不使用)。
ss.close();
}
}