Java高编 、 网络(tcp与udp)

来源:互联网 发布:动态规划算法基本要素 编辑:程序博客网 时间:2024/05/16 15:37

概念

  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();    }}// 接报 因为接收包是阻塞式方法,所以去开启新的线程去等待,否则线程就终止了@Overridepublic 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();        }    }}

}