Java学习记录(二十一)网络编程

CS架构和BS架构

这两个架构是现在市面上主流的两个架构,CS架构主要是客户端+服务器,而BS架构主要是网页+服务器。BS架构的优点是方便,所有数据通过服务器传输,缺点也很明显,由于所有数据都是通过网络传输,导致BS架构里面的数据不能过多,否则则会导致用户由于网络问题出现卡顿的情况。而CS架构的优点就是将大量的基础信息例如音乐,图片放入客户端让用户下载到本地中,网络只传送一些数据,就会使用户在使用时不用考虑数据大小的问题,缺点就是需要将客户端下载到本地,不方便。

网络编程的三要素(IP,端口号,协议)

双方各自的IP地址:设备在网络中的地址

使用传输软件的端口号:一个软件对应一个端口号,只有端口号相同才能进行数据传输(也就是双方都只使用一个软件才能进行数据交流,例如都使用微信才能相互交流)

网络传输规则:数据在网络中传递的规则如:TCP,https等

IP以及主机名的获取

通过InetAddress类里面的静态方法getbyName方法能通过传入的主机名或者IP查找到对应的IP地址。

通过InetAddress实例化对象调用getHostName方法能通过传入的IP得到对应的主机名,但是如果传入的IP不在局域网内,则会返回IP而不是主机名。

通过调用InetAddress实例化对象调用getHostAddress方法能得到对应主机的IP地址

上述具体实现如下:

package com.itazhang.Demo1;import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;public class MyIntaddressDemo1 {public static void main(String[] args) throws UnknownHostException {//可以通过主机名和ip地址查找到IpInetAddress address = InetAddress.getByName("192.168.0.100");System.out.println(address);//使用IP地址得打主机名,如果局域网内没有这台电脑就会返回IP地址String name = address.getHostName();System.out.println(name);//查看ipString hostAddress = address.getHostAddress();System.out.println(hostAddress);}
}

端口号

网络通信协议 

UDP协议:UDP协议是面向无连接的传输协议,他在传输数据时不会检查目的地与发送地网络是否联通,会直接将数据发送过去,且一次传输有大小限制,优点为传输快,缺点为数据在传输过程中易丢失,数据不安全

TCP协议:TCP协议是面向连接的通信协议,在传输之前会坚持发送地和目的地的网络是否连接,如果连接,才会将数据发送,且一次传输没有大小限制,优点为数据传输安全,不丢失,缺点为传 输数据的速度慢。

UDP通信协议

UDP的传输数据主要包括以下几个步骤

1、创建用来传输数据的对象

//创建发送数据的对象
DatagramSocket ds = new DatagramSocket();

2、将需要传输的数据打包成字节数组

String str = "我是测试消息";
//将需要发送的数据转化为字节数组
byte[] bytes = str.getBytes();

3、找到自己需要发送的地址

//创建需要发送的地址
InetAddress address = InetAddress.getByName("127.0.0.1");

4、写出发送到对方的端口

//创建发送数据的端口号
int port = 10086;

5、将上述信息传入数据打包的对象,将数据打包

传递参数格式(需要传输的数据转化成的字节数组,需要传输的长度,目的IP,传输的端口号)

//对数据进行打包加工
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);

6、传输数据,释放资源

ds.send(dp);
ds.close();

UDP的接收数据主要包括以下几个步骤

1、创建接收数据的对象,也是DatagramSocket,其中传入接收的端口

//创建接收对象
DatagramSocket ds = new DatagramSocket(10086);

2、创建对象用来接收数据,也是用字节数组的方式接收

byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
ds.receive(dp);

3、解析数据,可以用dp调用各种属性的get方法解析数据,将传递过来的字节数组转化为相应的类型

//解析数据包
InetAddress address = dp.getAddress();
int port = dp.getPort();

4、打印数据,释放资源,是将上述转化类型的代码放到打印方法中的

//打印输出,释放资源
System.out.println("是从地址为"+address+"端口号为"+port+"的电脑发出的数据:"+new String(bytes,0,bytes.length));
ds.close();

一个利用上述传输接收方法实现的简易聊天室

实现一个简易聊天室,输入端输入886结束输入,接收端无限循环接收,最后手动关闭

接收端实现如下:

package com.itazhang.Demo2;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class GetMessageDemo2 {public static void main(String[] args) throws IOException {//创建接收对象DatagramSocket ds =new DatagramSocket(10086);//创建数据包接收数据byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes,bytes.length);while (true){ds.receive(dp);InetAddress address = dp.getAddress();int port = dp.getPort();String s = new String(bytes, 0, bytes.length);//将数据解析并打印System.out.println("这是从地址为"+address+"端口号为"+port+"的数据"+s);}}
}

发送端实现如下:

package com.itazhang.Demo2;import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;public class SendMessageDemo2 {public static void main(String[] args) throws IOException {//创建发送对象DatagramSocket ds = new DatagramSocket();Scanner sc = new Scanner(System.in);while(true){System.out.println("请输入你想要发送的数据:");String s = sc.nextLine();if(s.equals("886")){break;}else {//打包数据byte[] bytes = s.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;//发送数据DatagramPacket dp = new DatagramPacket(bytes, bytes.length,address,port);ds.send(dp);}}//释放资源ds.close();}
}

三种发送方式,单播,组播,广播

TCP通信协议 

tcp通信协议在传输时是通过客户端发送,服务端接收这个特点进行通信的。

客户端发送数据步骤为:创建Socket发送对象,在创建时传入要发送到的IP和端口号,利用Socket对象获取输出流,再通过输出流将数据发出,实现代码如下:

package com.itazhang.Demo3;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;public class Client {public static void main(String[] args) throws IOException {//创建socket对象,并传入需要连接的Ip地址和端口Socket socket = new Socket("127.0.0.1",10086);//通过对象获取到输出流OutputStream os = socket.getOutputStream();//通过输出流的write方法将数据传输os.write("abcabc".getBytes());//释放资源os.close();socket.close();}
}

服务端接收数据步骤如下:创建ServerSocket接收对象,创建该对象的时候传入接收的端口号,然后通过该接收对象调用输入流,再通过输入流的read方法读取到数据,并将数据转化为对应的类型,最后释放资源,实现TCP通信,实现代码如下:

(因为默认中文为三个字节,但下列代码是将字节一个一个的读取并转换,所以如果用下列方法读取中文数据的话会显示乱码,如果要实现对中文的传输以及阅读,需要将下列代码中的字节输入流用转换流转换,即字符输入流,这样就不会出现一个字符一个字符的读取,也就可以传输中文)

package com.itazhang.Demo3;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(10086);Socket socket = ss.accept();InputStream is = socket.getInputStream();int temp;while (true){temp = is.read();if(temp == -1){break;}else{System.out.println((char)temp);}}is.close();ss.close();}
}
TCP通信协议练习

实现一个可以多次发送数据的聊天室,能发中文,且能被接收

客户端(发送),在发送数据时,因为需要接受中文的缘故,所以采用了缓冲输出流的方法,这种方法只会在缓冲区放慢或者关闭缓冲区才会发送数据,所以需要在每次发送数据时调用flush方法刷新缓冲区,让每一次输入数据都直接发送过去

package com.itazhang.TCPDemo4;import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;public class Exercise1Client {public static void main(String[] args) throws IOException {Socket socket = new Socket("127.0.0.1",10086);OutputStream os = socket.getOutputStream();BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));Scanner sc = new Scanner(System.in);while(true){System.out.println("请输入你想传输的话");String s = sc.nextLine();if("886".equals(s)){break;}else{bw.write(s);bw.newLine();bw.flush();}}}
}

服务端(接收)

package com.itazhang.TCPDemo4;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class Exercise1Server {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(10086);Socket socket = ss.accept();BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String s;while(true){s = br.readLine();if(s == null){break;}else{System.out.println(s);}}socket.close();ss.close();}
}

练习(一)

使用TCP进行文本文件传输,文件里可能有中文

分析:先将文件的数据读取出,再将其传输,在客户端先接收数据,再将数据写入文件,因为有可能文件中有中文,所以得用转换流将字节流转换(记得关流)

客户端实现如下:

package com.itazhang.TCPExercise3;import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.ArrayList;public class Client {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("D:\\11Codingtext\\MySocketnet\\a.txt");ArrayList<Integer> list = new ArrayList<>();int temp;while (true){temp = fr.read();if(temp==-1){break;}else{list.add(temp);}}Socket socket = new Socket("127.0.0.1",10086);OutputStream os = socket.getOutputStream();OutputStreamWriter osw = new OutputStreamWriter(os);for (Integer integer : list) {osw.write(integer);}osw.close();socket.close();fr.close();}
}

服务端实现如下:

package com.itazhang.TCPExercise3;import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;public class Server {public static void main(String[] args) throws IOException {ServerSocket ss = new ServerSocket(10086);Socket socket = ss.accept();InputStream is = socket.getInputStream();InputStreamReader isr = new InputStreamReader(is);FileWriter fw = new FileWriter("D:\\11Codingtext\\MySocketnet\\b.txt");int temp;while(true){temp = isr.read();if(temp == -1){break;}else{fw.write(temp);}}fw.close();ss.close();}
}

练习(二)

使用TCP协议进行图片文件传输(图片只能使用字节流)

客户端

package com.itazhang.Demo5;import java.io.*;
import java.net.Socket;public class Client {public static void main(String[] args) throws IOException {//创建套接字,输出文件流Socket socket = new Socket("127.0.0.1",10086);OutputStream os = socket.getOutputStream();BufferedOutputStream bos = new BufferedOutputStream(os);//读取本地文件数据BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\11Codingtext\\MySocketnet\\maomao.jpg"));int temp;byte[] bytes = new byte[1024];while(true){temp = bis.read(bytes);if(temp == -1){break;}else {bos.write(bytes,0,temp);}}bos.flush();socket.close();bis.close();}}

服务端

package com.itazhang.Demo5;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws IOException {//创建套接字,创建接收输入流ServerSocket ss = new ServerSocket(10086);Socket socket = ss.accept();InputStream is = socket.getInputStream();BufferedInputStream bis = new BufferedInputStream(is);//创建输出流,将读取的文件写入新文件byte[] bytes = new byte[1024];int temp;BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\11Codingtext\\MySocketnet\\temp.jpg"));while(true){temp = bis.read(bytes);if(temp == -1){break;}else{bos.write(bytes,0,temp);}}bos.flush();ss.close();bos.close();}
}

练习(二)(重点掌握)

要求多线程实现图片的传输,每个线程创建并开启之后会出现对应的一个新的jpg文件,例如第一个线程开启为1.jpg,第二个开启就是生成2.jpg。

线程类代码如下:通过构造方法,将每一次 开启线程后,所需要传输的socket套接字传输给Myrunnable这个类

package com.itazhang.Demo5;import java.io.*;
import java.net.Socket;public class MyRunnable implements Runnable{Socket socket;static int count = 1;public MyRunnable(Socket socket) {this.socket = socket;}@Overridepublic void run() {InputStream is = null;try {is = socket.getInputStream();} catch (IOException e) {e.printStackTrace();}BufferedInputStream bis = new BufferedInputStream(is);//创建输出流,将读取的文件写入新文件byte[] bytes = new byte[1024];int temp;BufferedOutputStream bos = null;synchronized (MyRunnable.class){try {bos = new BufferedOutputStream(new FileOutputStream("D:\\11Codingtext\\MySocketnet\\" +count+ ".jpg"));count++;} catch (FileNotFoundException e) {e.printStackTrace();}}while(true){try {if (!((temp = bis.read(bytes))!=-1)) break;bos.write(bytes,0,temp);} catch (IOException e) {e.printStackTrace();}}try {bos.flush();} catch (IOException e) {e.printStackTrace();}try {bos.close();} catch (IOException e) {e.printStackTrace();}}
}

服务端代码实现如下:下面每开启一个线程对应一个用户

package com.itazhang.Demo5;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws IOException {//创建套接字,创建接收输入流ServerSocket ss = new ServerSocket(10086);while (true){Socket socket = ss.accept();//开启线程,一个用户对应一条线程new Thread(new MyRunnable(socket)).start();new Thread(new MyRunnable(socket)).start();new Thread(new MyRunnable(socket)).start();new Thread(new MyRunnable(socket)).start();}}
}

客户端代码如下:

package com.itazhang.Demo5;import java.io.*;
import java.net.Socket;public class Client {public static void main(String[] args) throws IOException {//创建套接字,输出文件流Socket socket = new Socket("127.0.0.1",10086);OutputStream os = socket.getOutputStream();BufferedOutputStream bos = new BufferedOutputStream(os);//读取本地文件数据BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\11Codingtext\\MySocketnet\\maomao.jpg"));int temp;byte[] bytes = new byte[1024];while(true){temp = bis.read(bytes);if(temp == -1){break;}else {bos.write(bytes,0,temp);}}bos.flush();socket.close();bis.close();}}

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

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

相关文章

1.实用Qt:解决绘制圆角边框时,圆角锯齿问题

目录 问题描述 解决方案 方案1&#xff1a; 方案2&#xff1a; 结果示意图 问题描述 做UI的时候&#xff0c;我们很多时候需要给绘制一个圆角边框&#xff0c;初识Qt绘制的童鞋&#xff0c;可能绘制出来的圆角边框很是锯齿&#xff0c;而且粗细不均匀&#xff0c;如下图&…

第五十六回 徐宁教使钩镰枪 宋江大破连环马-飞桨图像分类套件PaddleClas初探

宋江等人学会了钩镰枪&#xff0c;大胜呼延灼。呼延灼损失了很多人马&#xff0c;不敢回京&#xff0c;一个人去青州找慕容知府。一天在路上住店&#xff0c;马被桃花山的人偷走了&#xff0c;于是到了青州&#xff0c;带领官兵去打莲花山。 莲花山的周通打不过呼延灼&#xf…

金融知识分享系列之:MACD指标精讲

金融知识分享系列之&#xff1a;MACD指标精讲 一、MACD指标二、指标原理三、MACD指标参考用法四、MACD计算步骤五、MACD分析要素六、根据快线DIF位置判断趋势七、金叉死叉作为多空信号八、快线位置交叉信号九、指标背离判断行情反转十、差离值的正负十一、差离值的变化十二、指…

如何在webapp中手动部署

前言&#xff1a;这个有不知道怎么下载Tomcat的可以看我这篇博客的前面&#xff0c;有相关链接&#xff0c;下载好后我那边也有如何运行成功的 在idea中配置tomcat服务器&#xff0c;部署一个项目-CSDN博客 接下来进入这篇博客的正题&#xff01;怎么手动部署 先找到我们下载…

3. ElasticSearch搜索技术深入与聚合查询实战

1. ES分词器详解 1.1 基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 1.2 …

SQL注入攻击原理与自动化检测技术的深度探究及其实战应用

SQL注入原理 SQL注入攻击的原理是基于攻击者能够控制应用程序与数据库之间的SQL查询。当应用程序将用户输入的数据直接嵌入到SQL查询中&#xff0c;而没有进行适当的验证或转义时&#xff0c;攻击者就可以通过输入精心构造的数据来操纵SQL查询的逻辑。 例如&#xff0c;假设有…

ubuntu(20.04)-安装JAVA环境-IDEA

1.下载IDEA 2.解压文件 sudo tar -zxvf idealC-2022.2.3.tar.gz -C /opt 3.添加环境变量&#xff1a; .vim ~/.bashrc export IDEA_HOME/opt/ideaIC-2022.2.3/ export PATH${IDEA_HOME}/bin:$PATH source ~/.bashrc 4.启动&#xff1a; cd /opt/ideaIC-2…

VS Code上,QT基于cmake,qmake的构建方法(非常详细)

VS Code上,QT基于cmake&#xff0c;qmake的构建方法 1 前言2 QT基于cmake的构建方法2.1 VS Code关键插件安装2.2 系统环境变量配置2.3 VS Code中&#xff0c;环境变量配置2.4 Cmake新建一个新的Porject 3 QT基于qmake的构建方法 1 前言 最近&#xff0c;由于认证了github的学生…

基于springboot的高校化学试剂仓储管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

【大模型系列】问答理解定位(Qwen-VL/Llama2/GPT)

文章目录 1 Qwen-VL(2023, Alibaba)1.1 网络结构1.2 模型训练 2 Llama2(2023, Meta)2.1 网络结构2.1.1 MHA/GQA/MQA2.1.2 RoPE(Rotary Position Embedding, 旋转式位置编码)2.1.3 RMSNorm 2.2 推理2.2.1 集束搜索(beam search)2.2.2 RoPE外推 3 GPT系列(OpenAI) 1 Qwen-VL(2023…

SketchUp Pro 2023 for Mac/Win:重塑设计,引领未来

在数字化浪潮席卷全球的今天&#xff0c;设计行业也迎来了前所未有的变革。SketchUp Pro 2023&#xff0c;这款专为设计师打造的草图大师软件&#xff0c;正以其强大的功能和卓越的性能&#xff0c;引领着设计界的新潮流。 SketchUp Pro 2023不仅继承了前代产品的优秀基因&…

CSS3技巧38:3D 翻转数字效果

博主其它CSS3 3D的文章&#xff1a; CSS3干货4&#xff1a;CSS中3D运用_css 3d-CSDN博客 CSS3干货5&#xff1a;CSS中3D运用-2_中3d-2-CSDN博客 CSS3干货6&#xff1a;CSS中3D运用-3_css3d 使用-CSDN博客 最近工作上烦心的事情太多&#xff0c;只有周末才能让我冷静一下 cod…