黑马程序员---网络编程(简介、UDP传输)

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

网络编程简介
网络编程通过使用套接字来达到进程间通信目的的编程就是网络编程,从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用,编程人员可以不用考虑
网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的!中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理!

网络模型:OSI参考模型、TCP/IP参考模型
网络通讯要素:IP地址、端口号、传输协议
IP地址(InetAddress):网络中设备的标识;不易记忆,可用主机名;本机回环地址 124.0.0.1,主机名 localhost
端口号(数字):用于标记进程的逻辑地址,有效端口0~65535,其中0~1024是系统使用或保留端口
传输协议:通讯的规则,常见协议 TCP、UDP
UDP特点:
将数据及源和目的封装在数据包中,不需要建立连接
每个数据包的大小限制在64k内
因为无连接,所以是不可靠协议
因为不需要建立连接,速度快
TCP特点:
建立连接,形成传输数据的通道
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低

两个客户端能够通信的原理:
1、找到对方IP地址
2、数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都进行数字标识,为了方便称呼这个数字,把它命名为端口,即逻辑端口
3、定义通信规则,这个规则称为协议,国际组织定义了通用协议TCP/IP

这里写图片描述
网络编程在网际层和传输层

Socket
Socket就是为网络服务提供的一种机制,通信的两端都要有Socket,网络通信其实就是Socket间的通信,
数据在两个Socket间通过IO传输

UDP传输
DatagramSocket与DatagramPacket
建立发送端,接受端
建立数据包
调用Socket的发送接受方式
关闭Socket

发送端与接收端是两个独立的运行程序
接收端:

package fourth;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 *需求:定义一个应用程序,用于结束UDP协议传输的数据并处理
 *1.定义UDP的Socket服务,通常会监听一个端口,其实就是黑这个接收网络应用程序定义数字标识,方便于明确
 *2.定义一个数据包,要存储接收到的自己数据,因为数据包对象可以提取数据包中的信息
 *3.通过Socket服务的receive方法将收到的数据存入已定义好的数据包中
 *4.通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
 *5.关闭资源
 */
public class UDPReceive {
    public static void main(String[] args) {
        try {
            //定义UDPSocket,建立端点
            DatagramSocket ds=new DatagramSocket(10000);
            //定义数据包,用于存储数据
            byte [] b=new byte[1024];
            DatagramPacket dp=new DatagramPacket(b,b.length);
            //通过receive方法将收到的数据存入数据包中
            ds.receive(dp);
            //通过数据包的方法,获取其中的数据
            String ip=dp.getAddress().getHostAddress();
            String data=new String(dp.getData(),0,dp.getLength());
            int port=dp.getPort();
            System.out.println(ip+"::"+data+"::"+port);
            //关闭资源
            ds.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

发送端:

package fourth;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

/**
 * 通过UDP传输方式将一段文字数据发送出去
 * 1.建立UDP的Socket服务
 * 2.提供数据,并将数据封装到数据包中
 * 3.通过Socket服务发送功能,将数据包发送出去
 * 4.关闭资源
 *
 */
public class UDPSend {
    public static void main(String[] args) {
        try {
            //1.创建UDP服务,通过DatagramSocket
            DatagramSocket ds=new DatagramSocket(8888);
            //2.确定数据,并封装成数据包 DatagramPacket(byte[] buf, int length, InetAddress address, int port) 
            byte[]b="UDP come on".getBytes();
            DatagramPacket dp=new DatagramPacket(b,8, InetAddress.getLocalHost(), 10000) ;
            //3.通过Socket服务,将已有的数据包发送出去
            ds.send(dp);
            //4.关闭资源
            ds.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注:为了更好看到效果,要先运行接收端,如果发送端先开,由于传输的不可靠性,数据会丢失

下面我们做个联系,聊天,用线程来实现

package fourth;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/**
 *编一个聊天程序,有收数据和发数据的部分,这两个部分同时执行
 */
public class ChatDemo {
    public static void main(String[] args) {
        try {
            DatagramSocket sendDs=new DatagramSocket();
            DatagramSocket receiveDs=new DatagramSocket(10002);

            new Thread(new SendMsg(sendDs)).start();
            new Thread(new ReceiveMsg(receiveDs)).start();

        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
}
class SendMsg implements Runnable{
    DatagramSocket ds;
    public SendMsg(DatagramSocket ds) {
        this.ds=ds;
    }
    @Override
    public void run() {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        String line=null;
        try {
            while((line=br.readLine())!=null){
                byte[] b=line.getBytes();
                DatagramPacket dp=new DatagramPacket(
                        b, b.length, InetAddress.getLocalHost(), 10002);
                ds.send(dp);
                if (line.equals("886")) {
                    ds.close();
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
class ReceiveMsg implements Runnable{
    DatagramSocket ds;
    public ReceiveMsg(DatagramSocket ds) {
        this.ds=ds;
    }
    @Override
    public void run() {
        while(true){
            byte[]b=new byte[1024];
            DatagramPacket dp=new DatagramPacket(b, b.length);
            try {
                ds.receive(dp);
                String ip=dp.getAddress().getHostAddress();
                String data=new String(dp.getData(), 0,dp.getLength());
                System.out.println(ip+" :: "+data);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

注:这里只需要一个客户端,即是发送端,又是接受端,当然如果想实现像QQ一样的两个客户端聊天,只需要拷贝代码,修改其中的IP地址的对应的端口号即可,这套代码也可以给加上图形化界面,那样就更美观了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值