Java网络编程之UDP通信与TCP通信交互代码实现

​import java.net.InetAddress;
import java.io.IOException;
class Main {
    public static void main(String[] args) {
        try {
InetAddress localAddress = InetAddress.getLocalHost();
//获得本地主机
InetAddress remoteAddress =
 InetAddress.getByName("www.itcast.cn");//由主机名获得IP地址
System.out.println("本机主机名"+localAddress.getHostName()+
"本机IP地址: " + localAddress.getHostAddress() +
 ",www.itcast.cn的IP地址: " + remoteAddress.getHostAddress() 
 + ",3秒是否可以到达主机名为www.itcast的IP地址: " +
  remoteAddress.isReachable(3000));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

e8d3161de517093c1a8f96ea332ea456.png

URL编程

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        try {
            URL url=new URL(https://www.baidu.com");// 注意URL地址需要包含协议部分            
            InputStream input = url.openStream(); // 注意正确的方法为openStream(),
            //openStream()方法会抛出IOException,类型为InputStream
            Scanner scan = new Scanner(input);//实例化Scanner对象
            scan.useDelimiter("\n");//读取分隔符
            while (scan.hasNext()) {
                System.out.println(scan.next());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

如下所示,读取了网页HTML文件。将其复制然后加到新建的HTML文档,运行可见网页。

 

86cdd2b190446665d22955ac7351868e.png

 

fba3ed3751f6ad7ab9ab4216652dd03f.png

 

TCP通信

ServerSocket服务器端,用于连接客户端请求。

Socket客户端,向服务器发出连接请求。

1对1的TCP通信

服务器端程序

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
    public static void main(String[] args) {
        Socket client = null;
        OutputStream os = null;//输出流对象声明
        try {
            ServerSocket serverSocket = new ServerSocket(7788);//创建端口号为7788的SerSocket对象
            System.out.println("等待建立连接");
            client = serverSocket.accept();//服务端等待客户端连接
            os = client.getOutputStream();//获得客户端输出流
            System.out.println("开始连接");
            os.write("北京欢迎你".getBytes());//使用输出流输出数据
            Thread.sleep(5000);//线程休眠一段时间
            System.out.println("结束通信");
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                if (os != null) {
                    os.close();
                }
                if (client != null) {
                    client.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

 

c93d5740501bacafb516c1f7aecbbcc9.png

 

客户端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
​
class Main{
    public static void main(String[] args) throws  Exception{
        Socket client = null;//声明客户端对象
        BufferedReader buf = null;//声明BufferedReadered对象,用于接收信息
        try {
            client = new Socket("BF-201911291316",7788);//以指定主机名与端口号创建对象
            buf = new BufferedReader(new InputStreamReader(client.getInputStream()));//创建一个BufferedReader对象用于接收客户端输入流信息
            String str = buf.readLine();//读取该信息
            System.out.println("服务器输出内容:" + str);//输出
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (buf != null) {
                    buf.close();//关闭输入流
                }
                if (client != null) {
                    client.close();//关闭Socket对象
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
 

 

3571043ec8951505edf12b3eca3c1254.png

 

执行程序时,先启动服务器端,再启动客户端

多线程TCP网络程序

服务器端允许多个客户端程序同时访问

(1)TCPClient客户端程序1

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
​
public class TCPClient {
    public static void main(String[] args) throws  Exception{
​
        Socket client = null;
        BufferedReader buf = null;
        try {
            client = new Socket("BF-201911291316",7798);//客户端指派主机名和端口号
            buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
            String str = buf.readLine();
            System.out.println("服务器输出内容:" + str);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (buf != null) {
                    buf.close();
                }
                if (client != null) {
                    client.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

(2)Client客户端程序2

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
​
public class Client {
    public static void main(String[] args) throws  Exception{
​
        Socket client = null;
        BufferedReader buf = null;
        try {
            client = new Socket("BF-201911291316",7798);
            buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
            String str = buf.readLine();
            System.out.println("服务器输出内容:" + str);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (buf != null) {
                    buf.close();
                }
                if (client != null) {
                    client.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

TCPserver服务端程序

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
        public static void main(String[] args) {
            try (ServerSocket serverSocket = new ServerSocket(7798)) {
                while (true) {
                    Socket client;
                    try {
                        client = serverSocket.accept();
                        int port = client.getPort();
                        System.out.println("与端口号为" + port + "的客户端连接成功");
​
                        new Thread(() -> {
                            try (OutputStream os = client.getOutputStream()) {
                                System.out.println("开始交换数据");
                                os.write("北京欢迎你".getBytes());
                                Thread.sleep(5000);
                                System.out.println("交换数据结束");
                            } catch (IOException | InterruptedException e) {
                                e.printStackTrace();
                            } finally {
                                try {
                                    if (client != null && !client.isClosed()) {
                                        client.close();
                                    }
                                } catch (IOException ex) {
                                    ex.printStackTrace();
                                }
                            }
                        }).start();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
​

 

依次启动三个程序,可以看到两个客户端与服务器端交互情况。

 

fe2e2592e28de091984d2d95cde8926d.png

 

dacff7377c512589d380c70f66c89e51.png

 

f74f9ae76794c7b5e91465f8d4e2a941.png

 

UDP通信

(1)DatagramPacket类,即数据报对象,包含数据以及数据报长度,IP地址和端口号等信息。接收端用一个字符数组作为参数存储接收的信息,发送端不但要存放发送信息的字符数组,还要指明端口号和IP地址。

(2)DatagramSocket类,用于发送主机中建立数据报通信方式。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
​
public class Receiver {
    public static void main(String[] args) {
        try {
            byte[] buffer = new byte[1024];
            DatagramSocket ds = new DatagramSocket(8954);
            DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
            System.out.println("等待接收数据");
          try{ 
           ds.receive(dp);}
          catch(IOException e){
              System.out.println(e);
          }
            String S = new String(dp.getData(), 0, dp.getLength()) + "from" + dp.getAddress().getHostAddress() + ":"
                    + dp.getPort();
            System.out.println(S);
            ds.close();
        }
        catch (     SocketException e) {
            e.printStackTrace();
        }
    }
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
​
public class Sender {
    public static void main(String[] args) {
        try {
            DatagramSocket ds = new DatagramSocket(3000);
​
            String S = "hello world";
            byte[] b = S.getBytes();
            DatagramPacket dp = new DatagramPacket(b, b.length, InetAddress.getByName("BF-201911291316"), 8954);
            System.out.println("发送信息");
            ds.send(dp);
            ds.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

 

7d120cf5012e1d192998d0e5faa9a1f9.png

 

ee3c12bbe3209b80b263619189a70090.png

 

多线程UDP网络程序

 

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
​
public class TT{
    public static void main(String[] args) {
        new Receive().start();
        new Send().start();
    }
}
class Receive extends Thread{
    public void run(){
        try {
            DatagramSocket socket=new DatagramSocket(6666);
            DatagramPacket packet=new DatagramPacket(new byte[1024], 1024);
​
            while(true){
                socket.receive(packet);
                byte[] arr=packet.getData();
            int len=packet.getLength();
            String ip=packet.getAddress().getHostAddress();
                System.out.println(ip+":"+new String(arr,0,len));
​
​
            }
​
        }catch(IOException e){
            e.printStackTrace();
​
        }
    }
}
class Send extends Thread{
    public void run(){
        try {
            DatagramSocket socket=new DatagramSocket();
            Scanner sc=new Scanner(System.in);
            while(true){
                String ip=sc.nextLine();
                if("quiet".equals(ip)){
                    break;
                }
                DatagramPacket packet=new DatagramPacket(ip.getBytes(),ip.getBytes().length, InetAddress.getByName("BF-201911291316"),6666);
           socket.send(packet);
                socket.close();
            }
        }catch (IOException e
        ){
            System.out.println(e);
        }
​
    }
}

 

e678d5f21a279c5737ed42f78b94665f.png

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/743725.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

非强化学习的对齐方法

在文章《LLM对齐“3H原则”》和《深入理解RLHF技术》中,我们介绍了大语言模型与人类对齐的“3H原则”,以及基于人类反馈的强化学习方法(RLHF),本文将继续介绍另外一种非强化学习的对齐方法:直接偏好优化&am…

【Java】解决Java报错:IllegalMonitorStateException in Synchronization

文章目录 引言一、IllegalMonitorStateException的定义与概述1. 什么是IllegalMonitorStateException?2. IllegalMonitorStateException的常见触发场景3. 示例代码 二、解决方案1. 确保在同步代码块或方法中调用wait()、notify()和notifyAll()2. 使用同步方法3. 使用…

鸿蒙开发系统基础能力:【@ohos.inputMethod (输入法框架)】

输入法框架 说明: 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import inputMethod from ohos.inputMethod;inputMethod8 常量值。 系统能力:以下各项对应的系统能力均为Sy…

NetSuite Account Merge 科目合并功能分析

最近项目中,客户有提到过能否将不用的Account与新建的Account进行合并,即我们所说的Merge功能~可以,但是该功能有使用的限制,比如最直接的一点需要注意,不同类型的Account是不可以使用Merge功能的&#xff…

Linux系统学习——指令三

Linux系统学习——指令三 Linux系统学习——指令三chmod — 文件执行权限添加文件执行权限去除文件执行权限 查找文件中特定关键字使用vi编辑文件并查找特定关键字文本文件查找特定关键字1: 使用 grep 命令2: 使用 find 命令3: 使用 awk 命令4: 使用 sed 命令5: 使用 ag 命令&a…

一文2000字记录基于jmeter+perfmon的稳定性测试

01、任务情况 1、任务总览 本次平台稳定性测试的目的在于:在服务器压力处于较饱和(达到80%系统最大TPS)压力之下,在较长时间(>8小时)之内观测服务器稳定性问题,以及资源使用情况和异常。 …

uniapp或安卓对接扫码枪

背景介绍 最近老板又随便丢过来一个扫码枪让我研究快速上线,我心想着又是什么串口通信吗,结果发现是usb的,我想着是不是有什么协议,结果直接插上电脑或者手机 均可在输入框直接输入,不用任何的代码编写 但结合了一下…

MFC案例:自制工具条(Toolbar)按钮的小程序

程序目标:在基于对话框的MFC项目中,自制三个 Toolbar 按钮(用颜色区分,分别为红、绿、蓝);程序运行时,单击红色按钮显示一个红色的填充椭圆;再单击绿色按钮则进行清屏;最…

基于AT89C52单片机的超声波测距设计—数码管显示

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/89456475?spm=1001.2014.3001.5503 C 源码+仿真图+毕业设计+实物制作步骤+10 在这里插入图片描述 题 目: 基于52的超声波测距汽车防撞系统 学生姓名 [姓名] 学 号 [学号…

力扣921. 使括号有效的最少添加

Problem: 921. 使括号有效的最少添加 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.定义int变量res、need分别记录需要插入的左括号数和所需与左括号配对的右括号数; 2.遍历字符串: 2.1.若当为左括号,则need,表示…

QT拖放事件之八:通过全局剪切板中的接口QClipboard::mimeData()来获取MIME类型数据

1、演示效果 首先向剪切板写入数据,然后点击paste按钮进行从全局剪切板中 获取 MIME数据。。。 2、核心代码 void Widget::on_pasteBtn_clicked() {const QClipboard* clipBoard = QGuiApplication::clipboard()

win10修改远程桌面端口,Windows 10下修改远程桌面端口及服务器关闭445端口的操作指南

Windows 10下修改远程桌面端口及服务器关闭445端口的操作指南 一、修改Windows 10远程桌面端口 在Windows 10系统中,远程桌面连接默认使用3389端口。为了安全起见,建议修改此端口以减少潜在的安全风险。以下是修改远程桌面端口的步骤: 1. 打…

qt 简单实验 一个可以向右侧拖拽缩放的矩形

1.概要 目的是设置一个可以拖拽缩放的矩形,这里仅用右侧的一个边模拟这个过程。就是为了抓住核心,这个便解决了,其他的边也是一样的。而这个更能体现原理。 2.代码 2.1 resizablerectangle.h #ifndef RESIZABLERECTANGLE_H #define RESIZ…

瞄准Windows的新兴僵尸网络:Kraken

2021 年 10 月,ZeroFox Intelligence 披露了名为 Kraken 的僵尸网络。Kraken 通过 SmokeLoader 进行传播,每次更新攻击基础设施时都会扩大规模。尽管与 2008 年发现的 Kraken 僵尸网络同名,但二者并没有其他共同点。 功能 自从 2021 年 10 …

Redis 集群 - 数据分片算法

前言 广义的集群:只要是多个机器构成了一个分布式系统,都可以被称为集群。 狭义的集群:redis 的集群模式,这个集群模式下,主要是解决存储空间不足的问题。 Redis 集群 redis 采用主从结构,可以提高系统的可…

【FFmpeg】avformat_open_input函数

【FFmpeg】avformat_open_input函数 1.avformat_open_input1.1 初始化输入格式(init_input)1.1.1 文件路径判断格式(av_probe_input_format2)1.1.1.1 格式探测(read_probe)1.1.1.2 扩展匹配检查&#xff08…

【链表经典算法OJ题】(2)

4.链表的中间节点 单链表相关经典算法OJ题4: 链表的中间结点 . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problem…

mmpose姿态估计

OpenMMLab GitHubOpenMMLab has 49 repositories available. Follow their code on GitHub.https://github.com/open-mmlab Installation — MMPose 1.3.1 documentationhttps://mmpose.readthedocs.io/en/latest/installation.html Body 3D Keypoint — MMPose 1.3.1 docume…

Linux_应用篇(27) CMake 入门与进阶

在前面章节内容中,我们编写了很多示例程序,但这些示例程序都只有一个.c 源文件,非常简单。 所以,编译这些示例代码其实都非常简单,直接使用 GCC 编译器编译即可,连 Makefile 都不需要。但是,在实…

关于导入springcloud项目一些jar加载不进去的问题处理

IntelliJ IDEA的Maven项目有时候通过右边Maven Projects面板的package或者install命令打包的时候,会报错导致打包失败,这是由于这两个命令打包前默认会运行tests测试,若测试失败则打包失败。但是有时候我们打包的时候一些项目配置是针对生产环…