黑马程序员----java基础--网络编程(1)(2)
二、UDP协议-发送端和接收端
Socket:套接字,通信的端点。就是为网络服务提供的一种机制,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。
1、DatagramSocket和DatagramPacket对象
(1)、DatagramSocket类常用方法
此类表示用来发送和接收数据报包的套接字。
1、构造方法
1 new DatagramSocket();//构造数据报套接字并绑定到本地主机任何端口上,发送端
2 new DatagramSocket(int port);//创建数据报套接字并绑定到本地主机上的指定端口,接收端
2、一般方法
1 void connect(InetAddress address,int port);//将套接字连接到此套接字的远程地址上
2 void send(DatagramPacket p);//从此套接字发送数据包
3 void receive(DatagramPacket p);//从此套接字接收数据包
4 InetAddress getInetAddress();//返回此套接字连接的地址
5 int getPort();//返回此套接字的端口
(2)、DatagramPacket类常用方法
此类表示数据报包
1、构造方法
1 new DatagramPacket(byte[] buf,int length,InetAddress address,int port);//构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号
2 newDatatgramPacket(byte[] buf,int length);//构造 DatagramPacket
,用来接收长度为 length
的数据包
2、一般方法
1 InetAddress getAddress();//获取某台主机的ip地址
2 byte[] getData();//获取数据缓冲区的内容
3 int getLength();//获取将要发送或者接收到的数据的长度
4 int getPort();//获取某台主机的端口号
2、UDP传输发送和获取数据的步骤
UDP发送端步骤:
1)、建立UDPSocket服务
2)、提供数据,并将数据封装到数据包中
3)、通过Socket服务的send方法,将数据包发送出去
4)、关闭资源
UDP接收端步骤:
1)、定义UDPSocket服务。通常会监听一个端口号。其实就是给这个接收网络应用程序定义数字标识,方便于明确哪些数据过来哪个应该程序可以处理
2)、定义一个数据包。因为要存储接收到的字节数据。因为数据包对象中有更多功能可以提取字节数据中的不同数据信息
3)、通过Sockt服务的receive方法将接收到的数据存入已经定义好的数据包中
4)、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
5)、关闭资源
需求:聊天程序双窗口模式)代码演示:
- import java.io.*;
- import java.net.*;
- class UDPSend
- {
- public static void main(String[] args)
- {
- DatagramSocket ds=null;
- BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
- try
- {
- //1,创建udp服务。通过DatagramSocket对象。
- ds=new DatagramSocket();
- String line=null;
- while ((line=br.readLine())!=null)
- {
- byte[] buf=line.getBytes();
- //2,确定数据,并封装成数据包。DatagramPacket(byte[] buf,int length, InetAddress address, int port)
- DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.104"),55128);
- //3,通过socket服务,将已有的数据包发送出去。通过send方法 。
- ds.send(dp);
- if("over".equals(line))
- break;
- }
- }
- catch (Exception e)
- {
- System.out.println(e);
- }
- finally
- {
- if(ds!=null)
- try
- {
- //4,关闭资源。
- ds.close();
- }
- catch (Exception e)
- {
- System.out.println("发送端关闭失败");
- }
- }
- }
- }
- class UDPReceive
- {
- public static void main(String[] args){
- DatagramSocket ds=null;
- DatagramPacket dp=null;
- try{
- //1,创建udp socket,建立端点。
- ds=new DatagramSocket(55128);
- while (true)
- { //2,定义数据包。用于存储数据。
- byte[] buf=new byte[1024];
- dp=new DatagramPacket(buf,buf.length);
- //3,通过服务的receive方法将收到数据存入数据包中。
- ds.receive(dp);//阻塞式方法。
- //4,通过数据包的方法获取其中的数据。
- String ip=dp.getAddress().getHostAddress();
- String data=new String(dp.getData(),0,dp.getLength());
- System.out.println(ip+"......"+data);
- if(data.equals("over"))
- break;
- }
- }
- catch (Exception e)
- {
- System.out.println(e);
- }
- finally
- {
- if(ds!=null)
- try
- {
- //5,关闭资源
- ds.close();
- }
- catch (Exception e)
- {
- System.out.println("接收端关闭失败");
- }
- }
- }
- }
需求:聊天程序单窗口模式-群聊)代码演示:
收数据的部分,和发数据的这两部分需要同时执行。那就需要用到多线程技术。一个线程控制收,一个线程控制发。因为收和发动作是不一致的,所以要定义两个run方法。而且这两个方法要封装到不同的类中。
- import java.io.*;
- import java.net.*;
- class UDPSend implements Runnable
- {
- private DatagramSocket ds;
- UDPSend(DatagramSocket ds){
- this.ds=ds;
- }
- public void run(){
- try
- {
- //读取键盘录入
- BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
- String line=null;
- while ((line=br.readLine())!=null)
- {
- byte[] buf=line.getBytes();
- //定义数据包,用来存放数据
- DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.104"),5556);
- //通过send方法把数据发送给接收端
- ds.send(dp);
- if("over".equals(line))
- break;
- }
- ds.close();
- }
- catch (Exception e)
- {
- System.out.println("发送失败");
- }
- }
- }
- class UDPReceive implements Runnable
- {
- private DatagramSocket ds;
- UDPReceive(DatagramSocket ds){
- this.ds=ds;
- }
- public void run(){//复写run方法
- try
- {
- while (true)
- {
- byte[] buf=new byte[1024];
- //定义数据包用来接收发送端发过来的数据信息
- DatagramPacket dp=new DatagramPacket(buf,buf.length);
- //接收数据
- ds.receive(dp);
- //对接收过来的数据进行ip地址等信息的解析
- String ip=dp.getAddress().getHostAddress();
- String data=new String(dp.getData(),0,dp.getLength());
- System.out.println(ip+"......."+data);
- if("over".equals(data))
- break;
- }
- ds.close();
- }
- catch (Exception e)
- {
- System.out.println("接收端接受失败");
- }
- }
- }
- class ChatRoom
- {
- public static void main(String[] args)throws Exception{
- //定义两个DatagramSocket服务
- DatagramSocket send=new DatagramSocket();
- DatagramSocket receive=new DatagramSocket(5556);
- //开启两个线程
- new Thread(new UDPSend(send)).start();
- new Thread(new UDPReceive(receive)).start();
- }
- }

用户点评