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

news2024/12/24 10:20:16
​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

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【宠粉赠书】SQLServer2022:从入门到精通

为了回馈粉丝们的厚爱,今天小智给大家送上一套数据库学习的必备书籍——《SQL Server 2022从入门到精通》。下面我会详细给大家介绍这套图书,文末留有领取方式。 图书介绍 《SQL Server 2022从入门到精通》系统全面地介绍SQL Server 2022数据库应用与开…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验3 总线型以太网的特性(广播,竞争总线,冲突)

一、实验目的 1.验证总线型以太网的特性; 2.验证广播特性; 3.验证各主机对总线的竞争使用以及可能产生的碰撞。 二、实验要求 1.使用Cisco Packet Tracer仿真平台; 2.观看B站湖科大教书匠仿真实验视频,完成对应实验。 三、实验内容…

LED显示屏中什么是静态驱动?什么是扫描驱动?两者的区别是什么?

随着科技的飞速发展,LED显示屏作为现代信息显示技术的重要组成部分,正以其独特的优势引领着显示行业的革新。近日,LED显示屏市场呈现出蓬勃的发展态势,技术创新不断推动行业向前发展,让LED显示屏无论是在商场的广告牌、…

<Linux> 缓冲区谁维护?

缓冲区是谁提供的&#xff1f; 来看一段代码 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> int main() {const char *str1 "a";printf("%s", str1);const char *str2 "b";writ…

Younger 数据集:人工智能生成神经网络

设计和优化神经网络架构通常需要广泛的专业知识&#xff0c;从手工设计开始&#xff0c;然后进行手动或自动化的精细化改进。这种依赖性成为快速创新的重要障碍。认识到从头开始自动生成神经网络架构的复杂性&#xff0c;本文引入了Younger&#xff0c;这是一个开创性的数据集&…

使用Birdeye访问Sui上加密市场数据

是一个链上加密交易数据聚合器&#xff0c;于2024年4月开始整合Sui数据。 个人DeFi用户可以在Birdeye的首页找到丰富的数据&#xff0c;包括关于主流区块链上的tokens、交易和交易者钱包的详细信息。 Birdeye提供API和WebSockets数据服务&#xff0c;涵盖token价格和其他DeFi…

类和对象(封装、继承、多态、友元)

c面相对象的三大特性为&#xff1a;封装、集成、多态 c 认为万事万物都皆为对象&#xff0c;对象上有其属性和行为 一、类和对象&#xff08;封装&#xff09; &#xff08;一&#xff09;封装的意义 封装是c面相对象的三大特性之一 封装的意义&#xff1a; 将属性和行为…

HarmonyOS NEXT:华为开启全新操作系统时代

在全球科技浪潮的汹涌澎湃中&#xff0c;华为再次以创新者的姿态&#xff0c;引领了一场关于操作系统的革命。HarmonyOS NEXT&#xff0c;这一由华为倾力打造的分布式操作系统&#xff0c;不仅是对现有技术的一次大胆突破&#xff0c;更是对未来智能生活的一次深邃展望。 Harmo…

AU音频重新混合音频,在 Adobe Audition 中无缝延长背景音乐,无缝缩短BGM

导入音频&#xff0c;选中音频&#xff0c;并且点 New Multitrack Session 的图标 设计文件名和存储路径&#xff0c;然后点 OK 点 Essential Sound 面板点 Music &#xff08;如果没有这个面板 点菜单栏 Windows > Essential Sound 调出来&#xff09; 点 Duration 展…

实战案例:如何用ChatGPT生成适合不同领域的高质量文章

随着人工智能技术的飞速发展&#xff0c;生成高质量文章已经不再是难题。特别是OpenAI开发的ChatGPT&#xff0c;更是为写作工作带来了极大的便利。那么&#xff0c;如何用ChatGPT生成适合不同领域的高质量文章呢&#xff1f;本文将通过实战案例&#xff0c;为大家详细讲解这一…

耐盐雾抗腐蚀航空插头插座

航空插头插座概述 耐盐雾720小时航空插头插座是一种专门设计用于抵抗盐雾侵蚀的航空用连接器&#xff0c;广泛应用于航空航天、海洋工程和其他需要高防护级别的领域。这类插头插座不仅具备一般的电气连接功能&#xff0c;还能在含盐较高的环境中长时间工作而不被腐蚀&#xff…

OpenAI禁止国区使用:免费国产大模型等你体验!

OpenAI中国停服 国产大模型免费使用 前言 OpenAI不支持中国区域访问 从6月25日开始&#xff0c;OpenAI 宣布了对中国停止提供 API 服务&#xff0c;毫无疑问的说这给国内的开发者带来了很大的不便&#xff0c;之后他们怎么去使用GPT 这类先进大模型方面遇到了难题。不过近期我们…

算法基础精选题单 动态规划(dp)(背包问题)(个人题解)

目录 前言&#xff1a; 正文&#xff1a; 题单&#xff1a;【237题】算法基础精选题单_ACM竞赛_ACM/CSP/ICPC/CCPC/比赛经验/题解/资讯_牛客竞赛OJ_牛客网 (nowcoder.com) 01背包&#xff1a; NC16693 装箱问题&#xff1a; NC16650 [NOIP2005]采药&#xff1a; NC16666 […

LeetCode刷题之HOT100之最小栈

听歌&#xff0c;做题&#xff01; 1、题目描述 2、逻辑分析 拿到题目一脸懵&#xff0c;有点看不懂啥意思&#xff0c;看了题解才知道啥意思。要实现在常数时间内检索到最小元素的栈&#xff0c;需要使用一个辅助栈来每次存入最小值。 使用Deque作为栈的实现是因为它提供了…

【Linux】进程信号_1

文章目录 八、进程信号1.信号 未完待续 八、进程信号 1.信号 信号和信号量之间没有任何关系。信号是Linux系统提供的让用户/进程给其他进程发送异步信息的一种方式。 常见信号&#xff1a; 当信号产生时&#xff0c;可选的处理方式有三种&#xff1a;①忽略此信号。②执行该…

C++ 14新特性个人总结

variable templates 变量模板。这个特性允许模板被用于定义变量&#xff0c;就像之前模板可以用于定义函数或类型一样。变量模板为模板编程带来了新的灵活性&#xff0c;特别是在定义泛化的常量和元编程时非常有用。 变量模板的基本语法 变量模板的声明遵循以下基本语法&am…

【Linux网络(一)初识计算机网络】

一、网络发展 1.发展背景 2.发展类型 二、网络协议 1.认识协议 2.协议分层 3.OSI七层模型 4.TCP/IP协议 三、网络传输 1.协议报头 2.局域网内的两台主机通信 3.跨网络的两台主机通信 四、网络地址 1.IP地址 2.MAC地址 一、网络发展 1.发展背景 计算机网络的发展…

ITIL发展之路:从v3到v4的演变与应用

在当今瞬息万变的技术环境中&#xff0c;IT服务管理&#xff08;ITSM&#xff09;已成为企业运营的关键支柱。ITIL&#xff08;Information Technology Infrastructure Library&#xff0c;信息技术基础设施库&#xff09;作为全球公认的ITSM最佳实践框架&#xff0c;帮助组织在…

AI大模型日报#0625:OpenAI停止不支持国家API、大模型「考上」一本、苹果上新视觉模型4M-21

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE-4.0-8K-latest&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xff01;《AI大模型日报》今日要点&#xf…

打电话时可以变声的软件有吗?变声器免费的直接说话的那种,直播要用!

在直播盛行的当下&#xff0c;变声器成为许多主播增加趣味性和神秘感的重要工具。对于想要在直播中尝试不同声音效果的用户来说&#xff0c;寻找一款既方便又免费的变声器软件显得尤为重要。本文将详细介绍11款可以直接说话的免费变声器软件&#xff0c;助你在直播中大展身手。…