JAVA网络编程【基于TCP和UDP协议】超详细!!!

news/2024/12/23 0:44:31/

ip地址:唯一标识主机的地址

端口号:用于标识计算机上某个特定的网络程序

InetAddress类

方法说明
InetAddress InetAddress.getLocalHost()静态方法,获取本机InetAddress对象(主机名+ip地址)
InetAddress InetAddress.getByName("主机名")根据主机名或者域名获取ip地址对象(主机名+ip地址)/(域名+ip地址)
getHostName获取InetAddress对象的主机名
getHostAddress获取InetAddress对象的地址

InetSocketAddress抽象基类,子类SocketAddress

构造方法

java"> public SocketAddress(InetAddress inetAddress,int port){...}  //InetAddress对象+端口号

客户端(socket)

 
java">Socket socket = new Socket(String host,int port);   //IP,端口号OutputStream out = socket.getOutputStream();out.write("hello,Server");out.close();socket.close();

方法

java"> OutputStream getOutputStream()      //获取字节输出流对象IntputStream getInputStream()        //获取字节输入流对象

服务器端(SereverSocket)

java"> SereverSocket serever = new SereverSocket(int port);   //端口号  要求这个端口号没被占用,否则报异常Socket server = serever.accept();   //等待接收客户端的Socket通信连接,连接成功返回Socket对象与客户端建立端到端通信,当没                                      //有客户端连接这个端口会阻塞InputStream in = server.getInputStream();int i = 0;while((i = in.read())!=-1){System.out.print((char)i);}in.close();server.close();

如果要连续通话,在发送完一个数据的时候应该有个结束标记(没结束标记的话客户端或者服务端不知道什么时候发送结束,就会一直等待)

java"> socket.shutDownOutout();    //写信息结束socket.shutDownInput();     //读信息结束

UDP

  • 没有明确的服务端和客户端,演变成数据的发送端和接收端

  • 接收数据和发送数据通过DatagramSocket对象完成

  • 将数据封装到DatagramPacket对象/装包

  • 当接收到DatagramPacket对象,需要进行拆包,取出数据

  • DatagramSocket可以指定在哪个端口接收数据

无连接、面向数据报的特征,即每次都是没有建立连接,一次发送全部数据报一次接受全部数据报。

基于DatagramSocket类来创建数据报套接字,并使用DatagramPacket描述一个发送或接收数据报。(DatagramSocket类描述一个socket对象,本质是一个文件描述符,表示网卡设备的文件,通过读写socket文件的方式操作网卡

客户A(服务器端)

java"> import java.io.IOException;import java.net.*;​public class Server {​public void getServer() throws IOException {​InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",1111);DatagramSocket datagramSocket = new DatagramSocket(1111);byte[] bytes = new byte[1024];DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);datagramSocket.receive(datagramPacket);String message = new String(datagramPacket.getData(),0,datagramPacket.getLength());System.out.println("接收到客户端发送信息:"+message);System.out.println("正在向客户端发送信息。。。。。。。。。");String response = "我是服务器端,能收到";//获取数据包中的ip地址InetAddress address = datagramPacket.getAddress();//获取数据包中的端口号int port = datagramPacket.getPort();DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,address,port);datagramSocket.send(responsePacket);System.out.println("发送成功!!!!!");datagramSocket.close();​}​public static void main(String[] args) throws IOException {Server server = new Server();server.getServer();}​}
 ​

客户B(客户端)

java"> import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetSocketAddress;​public class Client {​public void getClient() throws IOException {InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",1111);DatagramSocket datagramSocket = new DatagramSocket();System.out.println("发送信息。。。。。。。。。。。");String message = "我是客户端,能收到吗";DatagramPacket datagramPacket = new DatagramPacket(message.getBytes(),0,message.getBytes().length,inetSocketAddress);datagramSocket.send(datagramPacket);System.out.println("发送成功!!");​byte[] bytes = new byte[1024];DatagramPacket responsePacket = new DatagramPacket(bytes,0,bytes.length);datagramSocket.receive(responsePacket);String response = new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println("服务器发送信息"+response);​datagramSocket.close();}​public static void main(String[] args) throws IOException {Client client = new Client();client.getClient();}}​


http://www.ppmy.cn/news/1530919.html

相关文章

某动预约抢票脚本

Python脚本使用了多个技术和库来实现一个自动化的网页操作和网络请求发送功能,主要用于自动化抢购或购票场景,下面将详细解释脚本的主要部分和功能: 库和模块 - gevent 和 monkey: 这是用于并发编程的库,monkey.patch_all() 是将标准库中适合的部分做上猴子补丁,使得它们…

C#_结构(Struct)详解

在 C# 中,结构是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构。 结构是用来代表一个记录。假设您想跟踪图书馆中书的动态。您可能想跟踪每本书的以下属性: TitleAuthorSubjectBook ID 定义结构 为了…

顺序表操作

题目: 1、通过C语言的数组,实现一个顺序表,对学生信息进行CRUD操作 2、通过命令行窗口,输入操作指令,对顺序表进行操作 mymain.h (亮点:使用了转移表,避免大量了printf和switch...ca…

给子组件传递dom元素引用实例方案

在实际开发中有一个比较常见的场景是,父组件写了一个el-form组件。然后里面内容很多,所以拆成了子组件。那么子组件中就有调用父组件的form实例方法的需求。到所以这就涉及一个问题,怎么把父组件的form实例传递给子应用。 这里传递后直接调用…

【手机马达共振导致后主摄马达声音异常】

手机马达共振导致后主摄马达声音异常 问题根因解决方案其他易混淆 问题根因 当手机马达的震动频率和摄像头AF马达的一二阶震动频率处于共振频段的时候,手机马达震动时候有很大概率会干扰到后置摄像头的对焦马达正常工作,可能出现的影响有出现滋滋杂音&a…

vue 中如何实现鼠标拖动出发滚动条的跟随移动?

使用场景 在做弹窗、表单或 tab 切换需求的时候,有时候因为内容过长会导致出现滚动条,但是只能拖动滚动条时会导致操作不便,我们会希望实现通过拖动内容区实现滚动条的滑动。这样操作就会简单多了。 实现思路 如果要实现鼠标辅助触发滚动条…

Ubuntu 64系统信息查看

一、查看系统基本信息 uname -a 显示系统内核名称、主机名、内核版本号、发布日期等信息。 Linux ubuntu 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux 内核版本:这是一个基于 Linux 的 Ubuntu 系…

智算中心动环监控:构建高效、安全的数字基础设施@卓振思众

在当今快速发展的数字经济时代,智算中心作为人工智能和大数据技术的核心支撑设施,正日益成为各行业实现智能化转型的重要基石。为了确保这些高性能计算环境的安全与稳定,卓振思众动环监控应运而生,成为智算中心管理的重要组成部分…