18.网络编程

网络编程

又称为Socket编程。

Java中网络编程主要是以Java语言完成信息数据在网络上的传输。

网络

计算机网络,指的是将不同地理位置的多台计算机连接起来,可以实现信息共享和信息传输。

Java是Internet上的语言,提供了对网络应用程序的支持,所以,我们使用Java开发一些常见的网络应用。

网络通信怎么完成?

1.通过网络地址(IP地址)+端口 确定计算机以及具体的应用。

2.确定了计算机之后,完成传输(TCP/UDP)

Java实现网络编程的要素

1.IP地址类:InetAddress

2.端口:int 值;

3.TCP/UDP操作相关类:Socket

IP地址 InetAddress:

32位二进制数值以点分的形式表示,分成4份

0.0.0.0 ~ 255.255.255.255

本地回环地址:127.0.0.1

本地主机名:localhost

package com.day18.socket;import java.net.InetAddress;
import java.net.UnknownHostException;public class InetAddressDemo {public static void main(String[] args) throws UnknownHostException {//获取InetAddress对象的方法,传主机名,返回主机名和IP地址InetAddress address = InetAddress.getByName("localhost");System.out.println(address);//传IP地址,返回的只有IP地址InetAddress address1 = InetAddress.getByName("127.0.0.1");System.out.println(address1);System.out.println(address.getHostName());//主机名System.out.println(address.getHostAddress());//主机地址//获取本地主机实际的IP地址+主机名的InetAddress对象InetAddress address2 = InetAddress.getLocalHost();System.out.println(address2);//传入网站的信息,获取对象InetAddress address3 = InetAddress.getByName("www.baidu.com");System.out.println(address3);}
}

端口号

端口号是确定应用的唯一标识,端口号是一个16位的整数,

范围是0-65535,TCP和UDP各有65535个端口,单个协议下的端口号不能冲突。

公认端口:0-1023 被预先定义的服务占用端口

http:80

https:443

注册端口:

tomcat:8080

mysql:3366

oracle:1521

查看端口是否被占用:netstat-ano

InetSocketAddress 该类实现IP套接字地址(IP地址+端口号)

InetSocketAddress(InetAddress addr, int port)

从IP地址和端口号创建套接字地址。

Socket 该类实现客户端套接字(也称为“套接字”)。

Socket(InetAddress address, int port)

创建流套接字并将其连接到指定IP地址的指定端口号。

ServerSocket 这个类实现了服务器套接字

ServerSocket(int port)

创建绑定到指定端口的服务器套接字。

网络传输的协议

满足IP地址+端口的使用后,需要选定一个传输方式,来实现数据的传输

传输协议都定义在传输层,分为TCP协议和UDP协议

TCP协议:

使用之前,先要建立TCP连接,形成传输通道,采用3次握手,点对点的通信,是一种安全的传输协议。

TCP通信中,必须要有的应用进程:客户端、服务端

TCP协议可以传送大量的数据,传输完毕,需要释放连接,效率比较低。

UDP协议:

将数据、源地址、目标地址封装在数据包中,直接将数据包发送就行,

发送的时候,不需要建立连接,也不会去管对方是否能收到数据,接收方如果接受到了,也不会做出回应

是一种不安全的传输协议。

每个数据大小限制在64kb以内,发送完不需要是否,开销小、速度快。

分别使用TCP和UDP实现信息传输

TCP实现消息发送

客户端发送消息到服务端,服务端接收到数据把数据显示在控制台

package com.day18.tcp1;import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;public class TCPClient {public static void main(String[] args) {try {//实现步骤//1.连接服务器的Socket//创建SocketInetAddress address = InetAddress.getByName("127.0.0.1");int port=8999;Socket socket = new Socket(address, port);//2.发送消息//通过socket,获取输出流对象,向服务器写内容OutputStream os = socket.getOutputStream();os.write("你好,我现在在使用TCP编程发送消息".getBytes());//3.关闭资源os.close();socket.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
package com.day18.tcp1;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class TCPServer {public static void main(String[] args) {try {//1.建立服务端ServerSocketServerSocket serverSocket = new ServerSocket(8999);//等待用户连接while (true){//调用accept()方法,侦听到连接此服务器的Socket并返回Socket accept = serverSocket.accept();//通过返回的socket对象获取输入流InputStream is = accept.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();int len;byte[] bytes = new byte[1024];//3.接受用户消息,读取消息while ((len = is.read(bytes)) != -1){baos.write(bytes,0,len);}System.out.println(baos.toString());}} catch (IOException e) {e.printStackTrace();}}
}
UDP 实现消息发送

使用的类:

DatagramPacket 该类表示数据报包。

DatagramPacket(byte[] buf, int length, InetAddress address, int port)

构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。

DatagramSocket 此类表示用于发送和接收数据报数据包的套接字。

DatagramSocket(int port)

构造数据报套接字并将其绑定到本地主机上的指定端口。

package com.day18.udp1;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;//发送方
public class UDPClient {public static void main(String[] args) throws IOException {//创建数据报包对象//定义数据String data = "你好,我在使用UDP编程发送数据";byte[] bytes = data.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port=9999;DatagramPacket packet =new DatagramPacket(bytes, 0, bytes.length, address, port);//创建DatagramSocket对象DatagramSocket socket = new DatagramSocket();//发送数据socket.send(packet);System.out.println("数据发送完毕");socket.close();}
}
package com.day18.udp1;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;//接收方
public class UDPServer {public static void main(String[] args) throws IOException {//创建DatagramSocket对象,接收对象DatagramSocket socket = new DatagramSocket(9999);//创建一个数据包对象,用来接收数据byte[] bytes = new byte[1024];DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length);//接收数据放入到数据包中socket.receive(packet);//从数据包中拿去数据,拿出来是字节数组byte[] data = packet.getData();//字节数组转字符串String s = new String(data, 0, data.length);System.out.println(s.trim());}
}
UDP+多线程实现聊天
package com.day18.udp2;import java.io.BufferedReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;//发送方
public class TalkSend implements Runnable{//创建需要的对象private DatagramSocket socket;private String toIP;//目标IP地址private int toPort;//目标端口private int fromPort;//来自端口//    private BufferedReader reader;Scanner scanner = new Scanner(System.in);public TalkSend(String toIP, int toPort, int fromPort) {this.toIP = toIP;this.toPort = toPort;this.fromPort = fromPort;try {//创建对象的同时,把socket赋值socket = new DatagramSocket(fromPort);} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {try {while (true){//读取输入信息String s = scanner.next();byte[] bytes = s.getBytes();InetAddress address = InetAddress.getByName(toIP);//将写入的数据,封装到数据包中DatagramPacket packet =new DatagramPacket(bytes, 0, bytes.length, address, toPort);//发送socket.send(packet);//如果不准备聊天了,发送bye作为结束if ("bye".equals(s)){break;}}} catch (IOException e) {e.printStackTrace();}socket.close();}
}
package com.day18.udp2;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class TalkReceive implements Runnable{private DatagramSocket socket;private String messageFrom;private int port;public TalkReceive(String messageFrom, int port) {this.messageFrom = messageFrom;this.port = port;//开发端口号,创建DatagramSocket对象try {socket = new DatagramSocket(port);} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {try {while (true){//接收消息byte[] bytes = new byte[1024];DatagramPacket packet =new DatagramPacket(bytes, 0, bytes.length);//接收数据,存入packetsocket.receive(packet);//把数据输出byte[] data = packet.getData();String s = new String(data,0,data.length);System.out.println(messageFrom+":"+s.trim());//退出判断,如果发过来的数据是bye,则结束循环if ("bye".equals(s)){break;}}} catch (IOException e) {e.printStackTrace();}socket.close();}
}
package com.day18.udp2;
//小红发给小明
public class TalkTest1 {public static void main(String[] args) {new Thread(new TalkSend("localhost", 9999, 7777)).start();new Thread(new TalkReceive("小明", 8888)).start();}
}
package com.day18.udp2;
//小明发给小红
public class TalkTest2 {public static void main(String[] args) {new Thread(new TalkSend("localhost", 8888, 6666)).start();new Thread(new TalkReceive("小红", 9999)).start();}
}
使用 TCP 完成图片上传
package com.day18.tcp2;import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;//图片上传的客户端
public class ClientDemo {public static void main(String[] args) throws Exception {//创建Socket对象Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9090);//获取输出流OutputStream os = socket.getOutputStream();//把文件读进内存,输出流将文件写出FileInputStream fis = new FileInputStream("D://hello//java//No1.jpg");byte[] bytes = new byte[1024];int len;while ((len = fis.read(bytes) )!= -1){os.write(bytes,0,len);}//需要调用方法将之前的上传操作结束socket.shutdownOutput();//拿到服务端返回的消息,通过socket对象,获取输入流InputStream is = socket.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();int len1;byte[] bytes1 = new byte[1024];//接受用户消息,读取消息while ((len1 = is.read(bytes1)) != -1){baos.write(bytes1,0,len1);}System.out.println(baos.toString());fis.close();os.close();socket.close();}
}
package com.day18.tcp2;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;//接受图片的服务端
public class ServerDemo {public static void main(String[] args) throws IOException {//创建ServerSocketServerSocket serverSocket = new ServerSocket(9090);//等待客户端连接,获取客户端的socketSocket accept = serverSocket.accept();//获取socket中的输入流InputStream is = accept.getInputStream();//拿到输入流中的内容,再把内容写入服务器中FileOutputStream fos = new FileOutputStream("receive.jpg");byte[] bytes = new byte[1024];int len;//读内容,读的同时往socket中的输出流写内容while ((len = is.read(bytes) )!= -1){fos.write(bytes,0,len);}//把图片上传成功的信息返回给客户端OutputStream os = accept.getOutputStream();os.write("图片上传成功".getBytes());is.close();fos.close();os.close();accept.close();serverSocket.close();}
}

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

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

相关文章

笔记 | 《css权威指南》

网络安全色 URL text-indent line-height & vertical-align 字体 font-weight 400 normal 700 bold background-attachment

SpringBoot项目集成JetCache缓存框架步骤

JetCache是阿里开源的基于java开发的缓存框架&#xff0c;支持多种缓存类型&#xff1a;本地缓存、分布式缓存、多级缓存。能够满足不同业务场景的缓存需求。 1.导入依赖 <!--jetcache缓存 --> <dependency><groupId>com.alicp.jetcache</groupId>&l…

【调试笔记-20240516-Windows-使用VS2019编译edk2(上)】

调试笔记-系列文章目录 调试笔记-20240516-Windows-使用VS2019编译edk2&#xff08;上&#xff09; 文章目录 调试笔记-系列文章目录调试笔记-20240516-Windows-使用VS2019编译edk2&#xff08;上&#xff09; 前言一、安装开发工具1. 安装 VS20192. 安装 Python 3.103. 安装 …

pdf加水印怎么加?3种添加水印方法分享

pdf加水印怎么加&#xff1f;PDF加水印不仅是为了保护文档内容&#xff0c;确保信息的安全性和完整性&#xff0c;更是一种有效的版权保护措施。通过添加水印&#xff0c;您可以在文档中嵌入公司名称、日期、编号等信息&#xff0c;以明确文档的归属权和使用限制。此外&#xf…

小而美:两步完成从源码到应用的极简交付

作者&#xff1a;花三&#xff08;王俊&#xff09; Serverless 应用引擎 SAE 是阿里云推出的一款零代码改造、极简易用、自适应弹性的容器化应用托管平台&#xff0c;面市以来为几万家企业客户提供服务&#xff0c;运行稳定&#xff0c;广受好评。 SAE 的出现解决了众多企业…

Python库之lxml的简介、安装、使用方法详细攻略

Python库之lxml的简介、安装、使用方法详细攻略 简介 lxml是一个用于处理XML和HTML文档的Python库&#xff0c;它提供了简单易用的API来解析和生成这些文档。lxml以其性能和易用性而受到广泛欢迎&#xff0c;特别适合于需要处理大量数据或需要高性能解析的场景。 安装 安装…

运行时异常和编译时异常的区别

Java中的异常被分为两大类&#xff1a;编译时异常和运行时异常。 都是RuntimeException类及其子类异常&#xff0c;如NullPointerException、IndexOutOfBoundsException。这些异常是不检查异常&#xff0c;运行时异常的特点是Java编译器不会检查它&#xff0c;程序中可以选择捕…

纯代码如何实现WordPress搜索包含评论内容?

WordPress自带的搜索默认情况下是不包含评论内容的&#xff0c;不过有些WordPress网站评论内容比较多&#xff0c;而且也比较有用&#xff0c;所以想要让用户在搜索时也能够同时搜索到评论内容&#xff0c;那么应该怎么做呢&#xff1f; 网络上很多教程都是推荐安装SearchWP插…

RK3588 Android13 预安装自己的apk应用及把这个应用设置为默认桌面

1、cp -rf device/rockchip/rk3588/rk3588m_s/preinstall device/rockchip/rk3588/rk3588_t/ 2、给device/rockchip/rk3588/rk3588_t/preinstall/的存放app的文件夹改名为app-imms2&#xff0c;在app-imms2放入app-imms2.apk,编译安卓源码即可&#xff0c; 3、编译完会在out/…

android sp指针的cast

sp<Base> b; sp<Derived> d; b static_cast<Base*>(d.get()); 对于c原生的智能指针&#xff0c;有static_pointer_cast之类的操作方法。可以看cppreference。

Spring Web MVC介绍及详细教程

目录 1.什么是Spring Web MVC&#xff1f; 1.1 MVC定义 1.2 Spring MVC与MVC关系 2.为什么要学习Spring MVC 3.项目创建 4.Spring MVC连接 4.1 RequestMapping 4.2 PostMapping和GetMapping 5.Spring MVC参数获取 5.1 获取单个参数 5.2 获取多个参数 5.3 获取普通对…

通用代码生成器应用场景一,项目前期

通用代码生成器是一种自动化编程软件&#xff0c;是一种先进的编译系统。它具有表级抽象。把系统抽象为域对象&#xff0c;枚举&#xff0c;弹性登录模块&#xff0c;复杂版面和图形报表。使用通用代码生成器完成项目前期&#xff0c;比直接使用对应的高级语言快的多&#xff0…

element Notification 消息过多需要折叠

Notification 消息过多太长 希望能折叠 如图下效果 element-plus 可以将dom 插入到具体的元素 结合css :nth-child 来控制样式达到效果 element dom 只能插入到body中 所以无法使用:nth-child 1.Notification需要消息提示时设置class let eleNum 0 // 弹窗的序号 function…

vue+canvas实现逐字手写效果

在pc端进行逐字手写的功能。用户可以在一个 inputCanvas 上书写单个字&#xff0c;然后在特定时间后将这个字添加到 outputCanvas 上&#xff0c;形成一个逐字的手写效果。用户还可以保存整幅图像或者撤销上一个添加的字。 <template><div class"container"…

小红书-社区搜索部 (NLP、CV算法实习生) 一面面经

&#x1f604; 整个流程按如下问题展开&#xff0c;用时60min左右面试官人挺好&#xff0c;前半部分问问题&#xff0c;后半部分coding一道题。 各位有什么问题可以直接评论区留言&#xff0c;24小时内必回信息&#xff0c;放心~ 文章目录 1、自我介绍2、介绍下项目&#xff…

金额计算导致的错误问题汇总解决

在日常的开发中&#xff0c;前端计算金额是非常常见&#xff0c;如果不够仔细&#xff0c;考虑不够周全的话&#xff0c;很容易犯错的&#xff0c;金额这个东西一但错了是很严重的&#xff0c;因此总结一些常见的错误&#xff1a; 1.最重要的&#xff0c;涉及到计算的参数一定要…

关于做事方式的小讨论

大家好&#xff0c;我是阿赵。   之前五一劳动节期间&#xff0c;看到了这么一个新闻&#xff1a;某动物园内部收费项目五一期间涨价&#xff0c;喂长颈鹿的树叶&#xff0c;一枝需要30元。然后新闻下面的评论就炸锅了&#xff0c;纷纷的指责动物园太黑心&#xff0c;一枝树叶…

淄博公司商标驳回复审条件及流程

商标是人工审查的&#xff0c;所以不同的人会有不同的想法和意见&#xff0c;导致同一案件的审查结果不同。特别是商标审查周期缩短到5个月&#xff0c;全国平均每个工作日有1万多个商标提交申请&#xff0c;而全国只有一个商标审查单位——国家商标局提交申请。这种情况下&…

从入门到精通:掌握Scrapy框架的关键技巧

在当今信息爆炸的时代&#xff0c;获取并利用网络数据成为了许多行业的核心竞争力之一。而作为一名数据分析师、网络研究者或者是信息工作者&#xff0c;要想获取网络上的大量数据&#xff0c;离不开网络爬虫工具的帮助。而Scrapy框架作为Python语言中最为强大的网络爬虫框架之…

ubuntu当前登录用户IP验证

设置一个白名单列表检查到登录用户IP信息不在白名单&#xff0c;发送信息到指定邮箱 #!/bin/bash# 定义常用IP地址列表文件 KNOWN_IP_FILE"/path/to/known_ips.txt" # 替换为实际路径# 定义邮件接收者 EMAIL_TO"test163.com"# 定义日志文件 LOG_FILE&quo…