Java笔记_基础_网络编程

IP

定位主机

单播(单对单)
组播(单对多): 224.0.1.0 ~ 239.255.255.255
广播(单对全部): 255.255.255.255

端口

1024 ~ 65535
定位主机中的应用

InetAddress

网络协议类

方法返回值说明
InetAddress.getByName(String str)构造方法str可以是主机名,也可以是IP
getHostName()String获取主机名
getHostAddress()String获取IP地址

UDP:

不建立连接的传输协议
只发送 不能确定对方是否收到

DatagramPacket

数据包

方法返回值说明
DatagramPacket(byte[] bs, int i1, InetAddress ia, int i2)构造方法创建发送数据包(发送 bs ,长度为 i1 ,发送到 ia 的 i2 端口号)
DatagramPacket(byte[] bs, int i)构造方法创建接受数据包
getLength()int获取数据长度
getData()byte[]获取数据

DatagramSocket

数据包收发器

方法返回值说明
DatagramSocket()构造方法创建数据收发器,并将其绑定任意可用端口号
DatagramSocket(int i)构造方法创建数据收发器,并将其绑定 i 端口号
send(DatagramPacket d)void发送数据
receive(DatagramPacket d)void等待接收数据(若没接收则一直等待)
close()void关闭数据收发器,释放资源
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Demo {
    public static void main(String[] args) throws Exception {
        new Demo1().start(); //开启接收端线程
        
        InetAddress ia = InetAddress.getByName("192.168.36.122"); //我的IP地址

        byte[] bs = "随风奔跑自由是方向".getBytes("UTF-8");
        DatagramPacket data = new DatagramPacket(bs, bs.length, ia, 8008); //对方用此端口接收

        DatagramSocket ds = new DatagramSocket(8118); //用此端口发送
        ds.send(data);
        Thread.sleep(2000);
        ds.close();
    }
}

class Demo1 extends Thread {
    @Override
    public void run() {
        try {
            byte[] bs = new byte[1024 * 1024];
            DatagramPacket data = new DatagramPacket(bs, bs.length);

            DatagramSocket ds = new DatagramSocket(8008);
            ds.receive(data);
            byte[] bytes = data.getData();
            int length = data.getLength();
            System.out.println(new String(bytes, 0, length, "UTF-8"));
            ds.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

随风奔跑自由是方向

MulticastSocket

组播收发器

方法返回值说明
MulticastSocket()构造方法创建组播数据收发器,并将其绑定任意可用端口号
MulticastSocket(int i)构造方法创建组播数据收发器,并将其绑定 i 端口号
joinGroup(InetAddress ia)void添加到组 ia 中的 IP 需为组播地址
close()void关闭数据收发器,释放资源
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class Demo {
    public static void main(String[] args) throws Exception {
		new Demo1().start();
        new Demo1().start(); //开启接收端线程

        InetAddress ia = InetAddress.getByName("234.234.234.234"); //组播地址

        byte[] bs = "追逐雷和闪电的力量".getBytes("UTF-8");
        DatagramPacket data = new DatagramPacket(bs, bs.length, ia, 8008);

        MulticastSocket ds = new MulticastSocket(8118);
        ds.joinGroup(ia); //加入组

        ds.send(data);
        Thread.sleep(2000);
        ds.close();
    }
}

class Demo1 extends Thread {
    @Override
    public void run() {
        try {
            InetAddress ia = InetAddress.getByName("234.234.234.234");

            byte[] bs = new byte[1024 * 1024];
            DatagramPacket data = new DatagramPacket(bs, bs.length);

            MulticastSocket ms = new MulticastSocket(8008);
            ms.joinGroup(ia); //加入组

            ms.receive(data);
            byte[] bytes = data.getData();
            int length = data.getLength();
            System.out.println(new String(bytes, 0, length, "UTF-8"));
            ms.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果

追逐雷和闪电的力量
追逐雷和闪电的力量

TCP:

三次握手,四次挥手
比较可靠的传输协议

Socket

客户端

方法返回值说明
Socket(String str, int i)构造方法创建一个客户端对象,str:地址,i:端口
getOutputStream()OutputStream创建一个字节输出流
getInputStream()InputStream创建一个字节输入流
shutdownOutput()void仅关闭字节输出流, 若使用 字节流.close() 关闭会导致Socket一起关闭
shutdownInput()void仅关闭字节输入流
close()void关闭数据收发器,释放资源

ServerSocket

服务器端

方法返回值说明
ServerSocket(int)构造方法创建一个服务器端对象,i:端口
accept()Socket等待捕获客户端连接 (未捕获到则等待)
close()void关闭数据收发器,释放资源
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Demo {
    public static void main(String[] args) throws Exception {
        new Demo1().start();
        Socket s = new Socket("192.168.36.122", 8008); //向我的主机 8008端口 获取连接

        OutputStream out = s.getOutputStream();
        InputStream in = s.getInputStream();

        out.write("瓦蓝蓝的天上飞老鹰".getBytes("UTF-8")); //发送信息
        out.flush();

        byte[] bs = new byte[1024 * 1024];
        int a = in.read(bs);
        System.out.println(new String(bs, 0, a, "UTF-8")); //接收信息

        s.close();
    }
}

class Demo1 extends Thread {
    @Override
    public void run() {
        try {
            ServerSocket serverSocket = new ServerSocket(8008);
            Socket s = serverSocket.accept();

            OutputStream out = s.getOutputStream();
            InputStream in = s.getInputStream();

            byte[] bs = new byte[1024 * 1024];
            int a = in.read(bs);
            System.out.println(new String(bs, 0, a, "UTF-8")); //接收信息

            out.write("我在高岗眺望北京".getBytes("UTF-8")); //发送信息
            out.flush();

            s.close();
            serverSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

瓦蓝蓝的天上飞老鹰
我在高岗眺望北京

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值