java网络多线程专题

蜂信物联FastBee平台https://gitee.com/beecue/fastbee

阿里资料开源项目https://gitee.com/vip204888

百度低代码前端框架https://gitee.com/baidu/amis

OpenHarmony开源项目https://gitcode.com/openharmony

仓颉编程语言开放项目https://gitcode.com/Cangjie

package com.hsp.net;

import java.net.InetAddress;

import java.net.UnknownHostException;

/**

  • Description

  • User:

  • Date:

  • Time:

  • InetAddress类方法的使用

*/

public class test01 {

public static void main(String[] args) throws UnknownHostException {

//获取本机的InetAddress对象

InetAddress localHost = InetAddress.getLocalHost();

System.out.println(localHost);//LAPTOP-2UERK2QG/192.168.205.1

//根据指定的主机名获取对象

InetAddress localhost2 = InetAddress.getByName(“LAPTOP-2UERK2QG”);

//根据域名获取对象

InetAddress localHost3 = InetAddress.getByName(“www.baidu.com”);

//通过InetAddress对象获取对应的主机名地址等信息

//获取主机名

String hostName = localHost.getHostName();

System.out.println(“主机名:”+hostName);

//获取ip地址

String hostAddress = localHost.getHostAddress();

System.out.println(“ip地址:”+hostAddress);

}

}

在这里插入图片描述

Socket:

=====================================================================

基本介绍:

  1. 套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准

  2. 通信的两端都要有Socket,是两台机器间通信的端点

  3. 网络通信其实就是Socket间的通信

  4. Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输

  5. 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端

在这里插入图片描述

TCP网络通信编程应用案例(使用字节流)


  1. 编写一个服务器端和一个客户端

  2. 服务器端在9999端口监听

  3. 客户端连接到服务器端,发送hello world然后退出

  4. 服务器端接收到客户端发送的信息,输出,并退出

服务端代码

package com.hsp.net.socket;

import java.io.IOException;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

/**服务端

  • Description

  • User:

  • Date:

  • Time:

*/

public class SSocketTCP01Server {

public static void main(String[] args) throws IOException {

// 1.在本季的9999端口监听,等待连接

//前提是9999端口没有被占用

//细节:这个ServerSocket可以通过accept()返回多个Socket[高并发]

ServerSocket serverSocket = new ServerSocket(9999);

System.out.println(“服务端,在9999端口监听,等待连接”);

//2.当没有客户端连接9999端口时,程序会阻塞,等待连接

//如果有客户端连接,则会返回socket对象,程序继续

Socket socket = serverSocket.accept();

System.out.println(“服务端 socket =”+socket.getClass());

//3.通过socket.getInputStream()读取客户端写入到数据通道的数据,显示

InputStream in = socket.getInputStream();

byte[] bt = new byte[1024];

int readLen = 0;

while((readLen= in.read(bt)) != -1){

System.out.println(new String(bt,0,readLen));

}

//关闭流和socket

in.close();

socket.close();

serverSocket.close();

}

}

客户端代码:

package com.hsp.net.socket;

import java.io.IOException;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.Socket;

import java.net.UnknownHostException;

/**客户端

  • Description

  • User:

  • Date:

  • Time:

*/

public class SocketTCP01Client {

public static void main(String[] args) throws IOException {

//1.连接服务器(ip,端口)

//连接本机的9999端口

Socket socket = new Socket(InetAddress.getLocalHost(), 9999);

System.out.println(“客户端:”+socket.getClass());

//2.连接上后,生成Socket,通过

//socket.getOutputStream()

OutputStream out = socket.getOutputStream();

//3.通过输出流,写入数据到数据通道

out.write(“hello server”.getBytes());

//4.关闭流对象和socket,必须关闭

out.close();

socket.close();

System.out.println(“客户端退出了”);

}

}

TCP网络通信编程应用案例2


  1. 编写一个服务器端和一个客户端

  2. 服务端在9999端口监听

  3. 客户端连接到服务器端,发送hello server,并接收服务器端返回的hello,client再退出

  4. 服务器端接收到客户端发送的信息,输出hello client再退出

服务端代码:

package com.hsp.net.socket;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class SSocketTCP02Server {

public static void main(String[] args) throws IOException {

ServerSocket serverSocket = new ServerSocket(9999);

System.out.println(“服务端等待连接中…”);

Socket socket = serverSocket.accept();

System.out.println(“服务端 端口号9999 收到连接”);

System.out.println(“服务端向用户端发送信息”);

OutputStream out = socket.getOutputStream();

out.write(“hello client”.getBytes());

socket.shutdownOutput();

InputStream in = socket.getInputStream();

System.out.println(“服务端接收来自用户端的信息”);

byte[] bt = new byte[1024];

int length = 0;

while((length=in.read(bt))!=-1){

System.out.println(new String(bt,0,length));

}

socket.shutdownInput();

in.close();

out.close();

socket.close();

serverSocket.close();

System.out.println(“服务端退出”);

}

}

客户端代码:

package com.hsp.net.socket;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.InetAddress;

import java.net.Socket;

import java.net.UnknownHostException;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class SocketTCP02Client {

public static void main(String[] args) throws IOException {

Socket socket = new Socket(InetAddress.getLocalHost(),9999);

System.out.println(“用户端:”+socket);

OutputStream out = socket.getOutputStream();

System.out.println(“用户端向服务端发送信息”);

out.write(“hello serve”.getBytes());

socket.shutdownOutput();

InputStream in = socket.getInputStream();

System.out.println(“用户端接收来自服务端的信息”);

byte[] bt = new byte[1024];

int length = 0;

while((length=in.read(bt))!=-1){

System.out.println(new String(bt,0,length));

}

socket.shutdownInput();

in.close();

out.close();

socket.close();

System.out.println(“用户端退出”);

}

}

TCP网络通信编程应用案例3(使用字符流)


  1. 编写一个服务器端和一个客户端

  2. 服务端在9999端口监听

  3. 客户端连接到服务器端,发送hello server,并接收服务器端返回的hello,client再退出

  4. 服务器端接收到客户端发送的信息,输出hello client再退出

这里需要现将字节流利用转换流转换成字符流,服务端接收到字节流,在转换成字符流进行输出

服务端代码:

package com.hsp.net.socket;

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class SSocketTCP03Server {

public static void main(String[] args) throws IOException {

ServerSocket serverSocket = new ServerSocket(9999);

System.out.println(“服务端等待连接中…”);

Socket socket = serverSocket.accept();

System.out.println(“服务端 端口号9999 收到连接”);

System.out.println(“服务端向用户端发送信息”);

OutputStream out = socket.getOutputStream();

BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(out));

bufferedWriter.write(“hello client:字符流”);

bufferedWriter.flush();//如果使用的字符流,需要手动刷新,否则数据不会写入数据通道

bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束,注意,要求对方使用readLine()

socket.shutdownOutput();

InputStream in = socket.getInputStream();

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));

System.out.println(“服务端接收来自用户端的信息”);

String s = bufferedReader.readLine();

System.out.println(s);

socket.shutdownInput();

in.close();

out.close();

socket.close();

serverSocket.close();

System.out.println(“服务端退出”);

}

}

用户端代码:

package com.hsp.net.socket;

import java.io.*;

import java.net.InetAddress;

import java.net.Socket;

import java.net.UnknownHostException;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class SocketTCP03Client {

public static void main(String[] args) throws IOException {

Socket socket = new Socket(InetAddress.getLocalHost(),9999);

System.out.println(“用户端:”+socket);

OutputStream out = socket.getOutputStream();

BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(out));

bufferedWriter.write(“hello serve:字符流”);

bufferedWriter.flush();

bufferedWriter.newLine();

System.out.println(“用户端向服务端发送信息”);

socket.shutdownOutput();

InputStream in = socket.getInputStream();

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));

System.out.println(“用户端接收来自服务端的信息”);

String s = bufferedReader.readLine();

System.out.println(s);

socket.shutdownInput();

in.close();

out.close();

socket.close();

System.out.println(“用户端退出”);

}

}

TCP网络通信编程应用案例4


  1. 编写一个服务器端和一个客户端

  2. 服务端在9999端口监听

  3. 客户端连接到服务器端,发送一张图片e:\qie.png

  4. 服务器端接收到客户端发送的图片,保存在src下发送“收到图片”再退出

  5. 客户端接收到服务端发送的收到图片再退出

  6. 该程序要求使用StreamUtils.java

StreamUtils的作用:将输入流转换成byte[],即可以把文件的内容读入到byte[]

示意图:

使用BufferedInputStream和BufferedOutputStream字节流

服务端代码:

package com.hsp.net.socket;

import com.hsp.net.StreamUtils;

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.stream.Stream;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class SSocketTCP04Server {

public static void main(String[] args) throws IOException {

ServerSocket serverSocket = new ServerSocket(9999);

Socket socket = serverSocket.accept();

//接收用户端传递的图片数组,并将其输出在src目录下

BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());

byte[] bytes = StreamUtils.streamTobytes(bis);

socket.shutdownInput();

String filepath = “src/test.png”;

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filepath));

bos.write(bytes);

//服务端向用户端发送信息

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

bw.write(“图片发送成功”);

bw.flush();

bw.newLine();

socket.shutdownOutput();

bw.close();

bos.close();

bis.close();

socket.close();

serverSocket.close();

}

}

用户端代码:

package com.hsp.net.socket;

import com.hsp.net.StreamUtils;

import java.io.*;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

import java.net.UnknownHostException;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class SocketTCP04Client {

public static void main(String[] args) throws Exception {

Socket socket = new Socket(InetAddress.getLocalHost(),9999);

// //将图片转换成字节数组

String filepath = “E:\test.png”;

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filepath));

byte[] bytes = StreamUtils.streamTobytes(bis);

BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());

bos.write(bytes);

socket.shutdownOutput();

//用户端接收服务端发送的消息

// BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

InputStream inputStream = socket.getInputStream();

System.out.println(StreamUtils.streamToString(inputStream));

socket.shutdownInput();

// br.close();

inputStream.close();

bos.close();

bis.close();

socket.close();

}

}

netstat指令

=======================================================================

  1. netstat -an 可以查看当前主机网络情况,包括端口监听情况和网络连接情况

  2. netstat -an | more 可以分页显示

  3. netstat -anb 查看是端口是由哪个程序占用的

  4. 要求在dos控制台下执行

在这里插入图片描述

说明:

(1)Listening表示某个端口在监听

(2)如果有一个外部程序(客户端)连接到该端口,就会显示一条连接信息

UDP网络通信编程

=======================================================================

基本介绍:


  1. 类DatagramSocket和DatagramPacket实现了基于UDP协议网络程序

  2. UDP数据报通过数据报套接字(socket)DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达

  3. DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号

  4. UDP协议中每个数据报都给出了完整的地址信息,因此无需建立发送方和接收方的连接

UDP编程的基本流程


  1. 核心的两个类/对象 DatagramSocket于DatagramPacket

  2. 建立发送端,接收端

  3. 建立数据包

  4. 调用DatagramSocket的发送,接收方法

  5. 关闭DatagramSocket

UDP网络通信编程


在这里插入图片描述

TCP和UDP综合案例

=========================================================================

案例1


  1. 使用字符流的方式编写一个客户端程序和服务器端程序

  2. 客户端发送"name",服务器端接收到后,返回“我是nova”,nova是你自己的名字

  3. 客户端发送"hobby",服务器端接收到后,返回"编写java程序"

  4. 不是这两个问题,回复"你说啥呢"

服务端代码:

package com.hsp.net.homework;

import java.io.*;

import java.net.ServerSocket;

import java.net.Socket;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class homework01Server {

public static void main(String[] args) throws IOException {

ServerSocket serverSocket = new ServerSocket(9999);

System.out.println(“服务端等待接收数据…”);

Socket socket = serverSocket.accept();

BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String s = bf.readLine();

// socket.shutdownInput();

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

if(“name”.equals(s)){

bw.write(“我是novo,是你自己的名字”);

bw.flush();

bw.newLine();

// socket.shutdownOutput();

}else if(“hobby”.equals(s)){

bw.write(“编写java程序”);

bw.flush();

bw.newLine();

// socket.shutdownOutput();

}else{

bw.write(“不清楚”);

bw.flush();

bw.newLine();

// socket.shutdownOutput();

}

//关闭资源

bw.close();

bf.close();

socket.close();

serverSocket.close();

System.out.println(“服务器端退出”);

}

}

客户端代码:

package com.hsp.net.homework;

import java.io.*;

import java.net.InetAddress;

import java.net.Socket;

import java.util.Scanner;

/**

  • Description

  • User:

  • Date:

  • Time:

*/

public class homework02Client {

public static void main(String[] args) throws IOException {

Socket socket = new Socket(InetAddress.getLocalHost(),9999);

//向Server发送数据

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

Scanner sc = new Scanner(System.in);

String next = sc.next();

bw.write(next);

bw.newLine();

bw.flush();

// socket.shutdownOutput();

//接收来自服务端的信息

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String s = br.readLine();

// socket.shutdownInput();

System.out.println(“服务器说:”+s);

//关闭资源

Kafka实战笔记

关于这份笔记,为了不影响大家的阅读体验,我只能在文章中展示部分的章节内容和核心截图

image.png

  • Kafka入门
  • 为什么选择Kafka
  • Karka的安装、管理和配置

image.png

  • Kafka的集群
  • 第一个Kafka程序
  • image.png

afka的生产者

image.png

  • Kafka的消费者
  • 深入理解Kafka
  • 可靠的数据传递

image.png

image.png

  • Spring和Kalka的整合
  • Sprinboot和Kafka的整合
  • Kafka实战之削峰填谷
  • 数据管道和流式处理(了解即可)

image.png

  • Kafka实战之削峰填谷

image.png

t = new Socket(InetAddress.getLocalHost(),9999);

//向Server发送数据

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

Scanner sc = new Scanner(System.in);

String next = sc.next();

bw.write(next);

bw.newLine();

bw.flush();

// socket.shutdownOutput();

//接收来自服务端的信息

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String s = br.readLine();

// socket.shutdownInput();

System.out.println(“服务器说:”+s);

//关闭资源

Kafka实战笔记

关于这份笔记,为了不影响大家的阅读体验,我只能在文章中展示部分的章节内容和核心截图

[外链图片转存中…(img-EcqG9pyW-1725179991880)]

  • Kafka入门
  • 为什么选择Kafka
  • Karka的安装、管理和配置

[外链图片转存中…(img-jqLVDtMU-1725179991880)]

  • Kafka的集群
  • 第一个Kafka程序
  • [外链图片转存中…(img-D571ADxp-1725179991881)]

afka的生产者

[外链图片转存中…(img-KUZAlODL-1725179991881)]

  • Kafka的消费者
  • 深入理解Kafka
  • 可靠的数据传递

[外链图片转存中…(img-Wxz0zO77-1725179991881)]

[外链图片转存中…(img-yrLqXB2M-1725179991882)]

  • Spring和Kalka的整合
  • Sprinboot和Kafka的整合
  • Kafka实战之削峰填谷
  • 数据管道和流式处理(了解即可)

[外链图片转存中…(img-c8ypMyt2-1725179991882)]

  • Kafka实战之削峰填谷

[外链图片转存中…(img-OIN4hjLR-1725179991882)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值