黑马程序员——java网络编程中的传输协议:UDP和TCP

时间:2023-02-17 08:38:46


---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

1.      Java 在网络编程中的应用:

Internet被广泛使用的今天,网络编程日益重要。Java语言在网络应用中取得了很大成功,已经成为Internet上最流行的一种编程语言。Java语言的网络编程功能非常强大,其相应类库不仅可以开发Internet应用层程序,还可以实现网络底层的通信。

2.      网络传输协议:UDP TCP

网络通信协议是计算机间进行通信所要遵循的各种规则的集合。Internet的主要协议有:网络层的IP协议,传输层的TCPUDP协议,应用层的FTPHTTPSMTP等协议。

UDPTCP的区别:

UDP (User Datagram Protocol):

面向无连接, 数据、源、目的封装在数据包中;

每个数据包的大小限制在64K以内;

是不可靠协议,容易丢包;

由于不需要建立连接,所以速度较快;

TCP (Transmission Control Protocol):

数据传输前需先建立连接,作为数据传输的通道;

通过“三次握手”完成连接,是可靠协议;

连接后,可进行大数据量传输;

由于需要建立连接,效率稍低;

3.       IP port(通信端口):

IP 地址是一个由32个二进制位构成的整数,用于标识连接到TCP/IP网络中的每台计算机。

端口是一种软件抽象,并不是物理上存在的实体。端口号的取值范围为:0~65535,系统服务保留了使用端口1到端口1024 的权力。

IP地址和端口组成了所谓的SocketSocket是程序之间双向通信的终结点,是TCPUDP的基础。

4.       通过 UDP协议编程实现通信:

此类程序需要使用Java类库中的DatagramSocket类和DatagramPacket类。

a)      DatagramSocket:是用来发送数据报的Socket,它的构造方法有两种:

DatagramSocket():构造一个用于发送的DatagramSocket类,用于发送端。

DatagramSocket(port):构造一个用于接收的DatagramSocket类,参数port是要监听的端口,用于接收端;

发送端:需要创建DatagramPacket类对象,指定要发送的数据、数据长度、接收主机地址及端口号,然后使用DatagramSocket类对象发送数据报。

接收端:需要创建DatagramPacket类对象,用于将接受到的数据进行缓存。通过该DatagramPacket对象可以获得发送方发送的数据以及发送方的主机地址和端口。

b)      DatagramPacket:它是进行数据报通信的基本单位,它包含了需要传送的数据、数据报的长度、IP地址和端口等。它的构造方法有两种:

DatagramPacket(byte [], length):创建一个用于接收数据报的DatagramPacket类对象。byte []是接收数据报的缓冲,length是接收的字节数。

DatagramPacket(byte [], length,InetAddress, port):构造一个用于发送数据的DatagramPackte类对象。byte []是发送数据的缓冲区,length是发送的字节数,InetAddress是接收机器的Internet地址,最后一个参数是接收端的端口号。

c)      下面是通过 UDP协议编程实现简易通信的小程序:

发送端:通过键盘录入发出信息,输入“over”结束通信,代码如下:

importjava.io.*;

importjava.net.*;

 

public classUDPSend {

       public static void main(String[] args)throws IOException {

              DatagramSocket sendS =newDatagramSocket(10000);//创建发送端的Socket;

              BufferedReader bur=newBufferedReader(new InputStreamReader(System.in));//键盘录入;

              String line=null;

              while((line=bur.readLine())!=null){

                     if(line.equals("over"))   //通信结束标志;

                            break;

                     byte[] bts=line.getBytes();

                     DatagramPacket dp=newDatagramPacket(  //创建DatagramPacket类对象;

                                   bts,bts.length,InetAddress.getByName("192.168.26.200"),10000);

                     sendS.send(dp);   //发送数据;

              }

              sendS.close();

       }

}

接受端:将发送端发出的信息,打印在控制台上,代码如下:

import java.io.IOException;

importjava.net.DatagramPacket;

importjava.net.DatagramSocket;

 

public classUDPRecieve {

       public static void main(String[] args)throws IOException {

              DatagramSocket recieveS=newDatagramSocket(10000);//创建接收端Socket,监听10000端口;

              byte[] bts=new byte[1024];

              DatagramPacket dp=newDatagramPacket(bts,bts.length); //创建DatagramPacket对象,以便缓冲发送端数据;

              while (true){

                     recieveS.receive(dp);

                     String mes=newString(dp.getData(),0,dp.getLength());//获取数据报中的信息;

                     StringsrcHostName=dp.getAddress().getHostName(); //获取发送端的主机名;

                     StringsrcHostAddress=dp.getAddress().getHostAddress(); //获取发送端的IP地址;

                     StringsrcPort=dp.getPort()+"";  //获取发送端口

                     System.out.println(mes+"...."+srcHostName+"-"+srcHostAddress+"-"+srcPort);

              }

       }

}

5.       通过 TCP协议编程实现通信:

TCP编程主要通过ServerSocket类和Socket类实现的;

a)      Socket类:用于客户端,通过构造函数Socket(InetAddress, port)建立到服务器端的连接,参数中InetAddress 为服务器端的地址,port为服务器端的监听端口;

b)      ServerSocket:用于服务器端,通过构造函数ServerSocket(port)指定监听端口,并通过Socket获取客户端的Socket类对象,并提取输入流和输出流,从而实现和客户端的交互;

c)      下面是通过 UDP协议编程实现简易通信的小程序:

客户端:向服务器端发送消息,等待并接受服务器端的反馈信息,代码如下:

importjava.io.*;

importjava.net.*;

 

public classTcpClient {

       public static void main(String[] args)throws UnknownHostException, IOException {

              Socket client=newSocket("192.168.26.102",2000);//创建于服务器端的连接;

              OutputStreamout=client.getOutputStream(); //获取输出流;

              InputStreamin=client.getInputStream();  //获取输入流;

              out.write("你好,客户端".getBytes());  //向服务器端发送信息;

              byte[] bts=new byte[1024];

              int len=in.read(bts);     //结束来自服务器端的信息;

              System.out.println(new String(bts,0,len));

              client.close();

       }

}

服务器端:监听某一端口,等待客户端连接。收到客户端信息后向客户端发送消息做出反馈,代码如下:

importjava.io.*;

importjava.net.*;

 

public classTcpServer {

       public static void main(String[] args)throws IOException {

              ServerSocket server=newServerSocket(2000);//监听2000端口;

              Socket s=server.accept();   //获取客户端的Socket对象;

              OutputStreamout=s.getOutputStream(); //获取输出流;

              InputStreamin=s.getInputStream();  //获取输入流;

              byte[] bts=new byte[1024];

              int len=in.read(bts);   //读取客户端发送的信息;

              System.out.println(new String(bts,0,len));

              out.write("收到,你也好".getBytes()); //向客户端做出反馈;

              s.close();

       }

 

}

通过 TCP 协议编程的步骤总结:

客户端:

a)      建立网络连接

客户端网络编程的第一步都是建立网络连接。在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。

b)      交换数据

连接建立以后,就可以通过这个连接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。

c)      关闭网络连接

在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。

服务器端:

a)      监听端口

服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。

b)      获得连接

当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换。

c)      交换数据

服务器端通过获得的连接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。

d)      关闭连接

重点:TCP协议是面向连接的可靠通讯协议,是安全的,UDP是非连接的不可靠的通讯协议,它的特点是传输的速度快。而这两个协议位于TCP/IP模型的传输层。

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

详细请查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>