Java高编 、 网络(tcp与udp)

概念

  1. IP地址:所有主机都会分配一个IP地址( 不重复) ipv4 4位组成0-255,网关,子掩码。
  2. 端口(port):为了确定主机上的应用程序。0-65535 能是用的端口1024-65535
  3. 域名:在万维网上注册的网站名称。通过域名解析变成IP地址

TCP和UDP
1.TCP:面向连接(需要建立连接,打电话),可靠的(不会丢失,有顺序),没有大小限制
2.UDP:面向无连接(不需要建立连接,发短信),不可靠的(可能丢失,可能无序),一个包64KB

特殊IP
127.0.0.1 : 本机
192.168.1.1: 网关
192.168.1.255: 广播地址

UDP
DatagramSocket:用来接收和发送scoket
DatagramPacket:数据报

广播-》对所有机器发送
单播-》对一台机器发送
组播-》对一组机器发送
BindException:端口已经被占用(系统端口或者程序未关闭)

udp发包
//建立一个监听7777端口上的数据报的scoket
DatagramScoket scoket = new DatagramScoket();
//发送的信息
String msg = “发送信息”;
//发送的地址
InetSocketAddress address = new InetScoketAddress(“192.168.18.249”,7777);
//封装的数据报,必须给地址,才能发送出去
DatagramPacket datagramPacket = new DatagramPacket(msg.getByte( ), msg.getByte( ).length, address)
//怎么去发一个数据包
//已经发送出去
socket.send(datagramPacket);

udp收包
DatagramScoket socket = new DatagramScoket(7777);
//一个包的最大长度
byte[ ] buf = new byte[128];
//创建用于接收的数据报
DatagramPacket packet = new DatagramPacket( buf, buf.length);
System.out.println(“等待接收报”);
Scoket.receive(packet); //阻塞式方法
//程序走到了这一步,代表接收到信息
System.out.println(“信息收到了”);
//消除空格
String msg = new String(packet.getData(),0,packet.getLength);

工具类
1.package udp_Demo1;

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

public class UdpUtils extends Thread {
// DatagramSocket用于在程序之间建立传送数据报的通信连接
DatagramSocket socket;

// 网络上的两个程序通过一个双向的通信连接实现数据的交换,
// 这个连接的一端称为一个socket
// port(计算机的)端口
/**
 * shift+alt+z 快捷鍵while循環
 * 
 * @param port
 *            监听的端口 Berlin 2017.07.11
 */
public UdpUtils(int port) {
    try {
        socket = new DatagramSocket(port);
    } catch (SocketException e) {

        e.printStackTrace();
    }
}

// 接报 因为接收包是阻塞式方法,所以去开启新的线程去等待,否则线程就终止了
@Override
public void run() {
    byte[] buf = new byte[1024];
    DatagramPacket packet = new DatagramPacket(buf, 1024);
    while (true) {
        // 接收包工作
        try {
            // 每次收完包,程序又会回到这里,继续监听下一个包
            socket.receive(packet);
            System.out.println(new String(packet.getData(), 0, packet
                    .getLength()));
        } catch (IOException e) {

            e.printStackTrace();
        }
    }

}

// 发报
public void send(String content, String ip, int port) {
    InetSocketAddress address = new InetSocketAddress(ip, port);
    DatagramPacket packet = new DatagramPacket(content.getBytes(),
            content.getBytes().length, address);

    try {
        socket.send(packet);
    } catch (IOException e) {

        e.printStackTrace();
    }
}

}

test1

  1. package udp_Demo1;

public class Test1 {

public static void main(String[] args) {
    UdpUtils udpUtils = new UdpUtils(7777);
    //线程开始工作
    udpUtils.start();

    for (int i = 0; i < 100; i++) {
        udpUtils.send("数据"+i, "127.0.01", 7777);

        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值