首页 > 编程语言 >网路编程

网路编程

时间:2024-10-19 15:09:42浏览次数:1  
标签:socket 编程 bytes System length new 网路 String

UDP
将数据源和目的封装成数据包中,不需要建立连接;
每个数据报包的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快

UDP传输发送端思路

1:建立udp的socket服务
2:将要发送的数据封装成数据包
3:通过udp的socket服务,将数据包发送出
4:关闭资源
点击查看代码
public class SendDemo1 {
    public static void main(String[] args) throws Exception {
        // 1:建立udp的socket服务
        // DatagramSocket
        //DatagramSocket()
        //构造数据报套接字并将其绑定到本地主机上的任何可用端口。
//        1:建立udp的socket服务
        DatagramSocket socket = new DatagramSocket();
//      2:将要发送的数据封装成数据包 DatagramPacket
       //DatagramPacket(byte[] buf, int length, InetAddress address, int port)
        //构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。
        byte[] bytes = "他见到我,跑着过来了".getBytes();
        int length = bytes.length;
        InetAddress address = InetAddress.getByName("192.168.22.25");
        DatagramPacket packet = new DatagramPacket(bytes, length, address, 10086);//10086是自己给定的端口号
        // 3:通过udp的socket服务,将数据包发送出
        //public void send(DatagramPacket p)
        socket.send(packet);
        //    4:关闭资源
        socket.close();


    }
}

UDP传输接收端思路

   1:建立udp的socket服务.
    2:通过receive方法接收数据
    3:将收到的数据存储到数据包对象中
    4:通过数据包对象的功能来完成对接收到数据进行解析.
    5:可以对资源进行关闭
点击查看代码
public class ReceiveDemo1 {
    public static void main(String[] args) throws Exception {
//        1:建立udp的socket服务.
        //
        DatagramSocket socket = new DatagramSocket(10086);//发送端和接收端的端口号要保持一致
//        2:通过receive方法接收数据
//        3:将收到的数据存储到数据包对象中
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
        socket.receive(packet);
//        4:通过数据包对象的功能来完成对接收到数据进行解析

        byte[] data = packet.getData();
        int length = packet.getLength();
        String s = new String(data, 0, length);
        System.out.println("收到的数据:" + s);

    }
}

InetAddress: java提供的类,用于表示ip地址

点击查看代码
public class InetAddressDemo1 {
    public static void main(String[] args) throws  Exception{
        // static InetAddress getLocalHost()
        //返回本地主机的地址。
        InetAddress ip1 = InetAddress.getLocalHost();
        System.out.println(ip1);

        // String getHostName()
        //获取此IP地址的主机名。
        String hostName = ip1.getHostName();
        //String getHostAddress()
        //获取此IP地址
        String address = ip1.getHostAddress();

        System.out.println("主机名:"+hostName+",ip地址:"+ address);
    }
}

实现聊天室

发送端

点击查看代码
public class SendDemo1 {
    public static void main(String[] args) throws Exception{
//    1:建立udp的socket服务
        DatagramSocket socket = new DatagramSocket();
        Scanner sc = new Scanner(System.in);
while(true){
    //    2:将要发送的数据封装成数据包
    System.out.println("请输入发送内容:");
    String data = sc.nextLine();
    
    byte[] bytes = data.getBytes();
    int length = bytes.length;
    InetAddress address = InetAddress.getByName("192.168.22.25");
    DatagramPacket packet = new DatagramPacket(bytes, length, address, 10000);
    //    3:通过udp的socket服务,将数据包发送出
    socket.send(packet);
    if("886".equals(data)){
        System.out.println("用户已经离开");
        break;
    }

}

        //    4:关闭资源
socket.close();

    }
}

接收端

点击查看代码
public class ReceiveDemo1 {
    public static void main(String[] args) throws Exception{
//        1:建立udp的socket服务.
        DatagramSocket socket = new DatagramSocket(10000);
//        2:通过receive方法接收数据
//        3:将收到的数据存储到数据包对象中
        System.out.println("==============欢迎来到聊天室=================");

while(true){
    byte[] bytes = new byte[1024];
    int length = bytes.length;
    DatagramPacket packet = new DatagramPacket(bytes, length);
    socket.receive(packet);
//        4:通过数据包对象的功能来完成对接收到数据进行解析.

    byte[] data = packet.getData();
    int length1 = packet.getLength();
    String s = new String(data, 0, length1);
    InetAddress address = packet.getAddress();
    String hostName = address.getHostName();
    BufferedWriter bw = new BufferedWriter(new FileWriter("src/com/shujia/day19/recode/" + hostName + ".txt",true));//将用户的聊天内容打包写入
    if("886".equals(s)){
        System.out.println("=====================");
        System.out.println("用户已经下线");
        System.out.println("=====================");

    }else{
        String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a").format(new Date());
        System.out.println(time);
        System.out.println(hostName+":"+s);
        bw.write(time);
        bw.newLine();
        bw.write(s);
        bw.newLine();
        bw.flush();

    }
}
    }
}

TCP
  建立连接,形成传输数据的通道;在连接中进行大数据量传输;
通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低

TCP传输

    1:建立客户端的Socket服务,并明确要连接的服务器。
    2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.
    3:通过Socket对象的方法,可以获取这两个流
    4:通过流的对象可以对数据进行传输
    5:如果传输数据完毕,关闭资源
TCP传输-客户端代码
    1:建立客户端的Socket服务,并明确要连接的服务器。
    2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.
    3:通过Socket对象+的方法,可以获取这两个流
    4:通过流的对象可以对数据进行传输
    5:如果传输数据完毕,关闭资源
点击查看代码
public class ClientDemo1 {
    public static void main(String[] args) throws Exception{
        // 1:建立客户端的Socket服务,并明确要连接的服务器。
        //Socket(String host, int port)
        //创建流套接字并将其连接到指定主机上的指定端口号。
        Socket socket = new Socket("192.168.22.15", 12345);
        Scanner sc = new Scanner(System.in);

        // 3:通过Socket对象的方法,可以获取这两个流
        //获取通道中的输出流,将数据发送给服务端
        OutputStream outputStream = socket.getOutputStream();
        //获取通道中的输入流
        InputStream inputStream = socket.getInputStream();

        while (true){
            System.out.print("请输入要发送的内容:");
            String info = sc.nextLine();
            if("886".equals(info)){
                break;
            }

            // 4:通过流的对象可以对数据进行传输
            outputStream.write(info.getBytes());
            outputStream.flush(); // 来自于通道中的类


            byte[] bytes = new byte[1024];
            int length = inputStream.read(bytes);
            String s = new String(bytes, 0, length);
            System.out.println(s);
        }


        // 5:如果传输数据完毕,关闭资源
//        outputStream.close();
        socket.close();

    }
}

TCP传输-服务器端代码

    1:建立服务器端的socket服务,需要一个端口
    2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
    3:通过客户端的获取流对象的方法,读取数据或者写入数据
    4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的
点击查看代码
public class ServerDemo1 {
    public static void main(String[] args){
        try {
            // 1:建立服务器端的socket服务,需要一个端口
            //ServerSocket(int port)
            //创建绑定到指定端口的服务器套接字。
            ServerSocket ss = new ServerSocket(12345);

            // 2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
            Socket socket = ss.accept();

            while (true){
                InetAddress inetAddress = socket.getInetAddress();
                String hostName = inetAddress.getHostName();

                // 3:通过客户端的获取流对象的方法,读取数据或者写入数据
                // 获取通道中的输入流
                InputStream inputStream = socket.getInputStream();
                byte[] bytes = new byte[1024];
                int length = inputStream.read(bytes);
                String s = new String(bytes, 0, length);
                System.out.println(hostName+": "+s);

                // 获取通道中的输出流
                OutputStream outputStream = socket.getOutputStream();
                outputStream.write("服务器已接收!".getBytes());
                outputStream.flush();
            }
        }catch (Exception e){
            System.out.println("用户已退出。。。");
        }


    }
}

标签:socket,编程,bytes,System,length,new,网路,String
From: https://www.cnblogs.com/wangxiaojian-lina/p/18475926

相关文章

  • 5步轻松上手!零基础也能掌握Go语言编程
    你是不是经常听到Go语言(Golang)在技术圈的讨论,却不知道如何开始?Go语言凭借其简洁、高效和并发处理能力,成为越来越多开发者和公司的首选。特别是在高并发场景如微服务、分布式系统中,Go的优势尤为突出。作为一门对初学者友好的语言,即便你没有编程基础,也可以通过以下5个简单步骤......
  • AI编程Arduino单片机点亮WS2812灯带彩虹灯效
    引言随着物联网(IoT)和智能家居的迅速发展,LED灯带因其灵活性和多样的显示效果,广泛应用于装饰、广告、舞台等多个领域。WS2812作为一种智能可控的LED灯带,以其独立控制、丰富的色彩和高亮度,成为众多开发者的首选。而在控制WS2812灯带的过程中,编写高效、稳定的单片机代码至关重要。......
  • XC6SLX25T-2CSG324C,XC6SLX45T-2FGG484I,XC7K70T-3FBG484E4914, XILINX/赛灵思 嵌入式
    Xilinx是一家总部位于美国的半导体公司,成立于1984年。他们的主要产品是可编程逻辑器件(FPGA和SoC)和相关的开发工具。Xilinx的FPGA产品被广泛应用于各种领域,包括通信、数据中心、工业控制、汽车、物联网等。他们的产品具有灵活性高、性能强大和可定制性强等特点。2018年,Xilinx宣......
  • 电子学会代码编程Python等级考试24年9月一级真题和答案解析
    1.下列选项中关于turtle.color('red')语句的作⽤描述正确的是?()A.只设置画笔的颜⾊为红⾊B.只设置填充的颜⾊为红⾊C.设置画笔和填充的颜⾊为红⾊D.设置画笔的颜⾊为红⾊,设置画布背景的颜⾊为红⾊答案解析:C,turtle.color('red')语句会将画笔和填充颜⾊都设......
  • vscode中整合豆包MarsCode编程助手
    豆包MarsCode是字节跳动旗下的一款AI工具,最近在刷帖子时看到已经可以在vscode中通过插件安装MarsCode工具,接下来我们来看下操作流程以及使用效果。第一步:首先需要注册下豆包账号豆包MarsCode--智能编码,一触即发!第二步:打开vscode后,左侧导航栏上点击扩展,搜索MarsCode,找到插件......
  • 关于Python AI 编程助手Fitten Code的应用体验以及Python 修改删除 sys.path 路径以实
    一、关于PythonAI编程助手FittenCode的应用体验        AI现在无孔不入,现在都开始进入到编程中了,有一个能适用多种编译器环境的AI编程插件FittenCode。其适配了ViusalStudio,VSCode(本文使用),JetBrains系列(本文使用)以及Vim等多种编译器环境的插件FittenCo......
  • 嵌入式Linux编程基础 | GCC 静、动态函数库的创建与链接方法
    一、静态库与动态库的区别库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。例如:libhello.so表示一个命名为libhello的动态库,libhello.a则是一个命名为libhello的静态库。当使用静态库时,连接器找出程序所需的函数,并将其拷贝到可执行文件,一旦链接成功,静态程序库......
  • 卡尔曼讲解与各种典型进阶MATLAB编程(专栏目录,持续更新……)
    专栏链接:https://blog.csdn.net/callmeup/category_12574912.html文章目录专栏介绍重点文章卡尔曼滤波的原理卡尔曼滤波的例程进阶MATLAB编程后续更新专栏介绍本专栏旨在深入探讨卡尔曼滤波及其在各类应用中的实现,尤其是通过MATLAB编程进行的典型案例分析。卡尔曼......
  • 【Linux线程】Linux多线程编程:深入理解线程互斥与同步机制
    ......
  • Aubo Robotics 工业机器人系列编程:i10a_Aubo-i10a安全操作规范
    Aubo-i10a安全操作规范1.安全操作的重要性在工业机器人操作中,安全性是最基本也是最重要的要求。Aubo-i10a工业机器人作为一款高精度、高灵活性的机器人,其安全操作规范不仅关系到机器人的正常运行,更关系到操作人员的人身安全。本节将详细介绍Aubo-i10a工业机器人的安全......