Java网络多线程
2022年8月31日
笔记 韩顺平Java自学笔记 网络多线程_关注永雏塔菲喵的博客-CSDN博客InetAddress
网课 【韩顺平讲Java】Java网络多线程专题 - TCP UDP Socket编程 多线程 并发处理 文件传输 新闻推送 Java_哔哩哔哩_bilibili
通信项目上传到github:cxy-sky/JavaSocket: Java 网络多线程专题,包括 TCP UDP Socket编程 多线程 并发处理 文件传输 新闻推送 (github.com)
2022年9月7日完结
package com.jiao;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Main {public static void main(String[] args) throws UnknownHostException {
//获得本机的InetAddress对象
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);
//根据指定的主机名获得InetAddress对象
InetAddress byName = InetAddress.getByName("sky");
System.out.println(byName);
//根据域名返回对应的ip
InetAddress byName1 = InetAddress.getByName("www.baidu.com");
System.out.println(byName1);
//通过getHostAddress对象使他获得对应的地址ipv4地址
String hostAddress = byName1.getHostAddress();
System.out.println(hostAddress);
//获取对应的域名
String hostName = byName1.getHostName();
System.out.println(hostName);
}
}
Socket 简介
文章图片
理解
文章图片
TCP网络通信 简介
文章图片
案例1 字节流 服务端
package com.jiao.socket.tcp01;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/8/31
* email:zgt9321@qq.com
**/
public class Server {public static void main(String[] args) throws IOException {//要求电脑上没有其他程序在监听9999接口
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务器在9999端口进行监听");
//程序阻塞,不再向下执行如果有客户端socket链接,返回一个socket链接,开始向下执行
Socket socket = serverSocket.accept();
System.out.println("客户端 socket = "+socket.getClass());
//客户端没有发送消息的话,会堵塞在这里
InputStream inputStream = socket.getInputStream();
byte[] msg = new byte[1024];
int len = 0;
while ((len = inputStream.read(msg)) != -1) {
System.out.println("收到消息: " + socket.getLocalAddress().getHostName() + " " + new String(msg, 0, len));
}
inputStream.close();
socket.close();
serverSocket.close();
System.out.println("服务关闭");
}}
客户端
package com.jiao.socket.tcp01;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* auth:@highSky
* create:2022/8/31
* email:zgt9321@qq.com
**/
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
System.out.println("正在发送消息");
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello jiaojiao".getBytes());
//发送完成结束标记
socket.shutdownOutput();
System.out.println("消息发送完成");
outputStream.close();
socket.close();
}
}
案例2 互发消息 server
package com.jiao.socket.tcp02;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/8/31
* email:zgt9321@qq.com
**/
public class Server {public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("server" + InetAddress.getLocalHost().getHostAddress() + "正在监听");
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
byte[] msg = new byte[1024];
int len = 0;
while ((len = inputStream.read(msg)) != -1) {
System.out.println("收到消息: " + socket.getLocalAddress().getHostName() + " " + new String(msg, 0, len));
}//给client发送消息
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello tiantian".getBytes());
//发送完成结束标记
socket.shutdownOutput();
outputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
System.out.println("服务关闭");
}}
client
package com.jiao.socket.tcp02;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/8/31
* email:zgt9321@qq.com
**/
public class Client {
public static void main(String[] args) throws IOException {
//Socket socket = new Socket("106.14.219.106", 9999);
Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
System.out.println("正在发送消息");
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello jiaojiao".getBytes());
//发送完成结束标记
socket.shutdownOutput();
System.out.println("消息发送完成");
//接收服务端发来的消息
InputStream inputStream = socket.getInputStream();
byte[] msg = new byte[1024];
int len = 0;
while ((len = inputStream.read(msg)) != -1) {
System.out.println(new String(msg, 0, len));
}inputStream.close();
outputStream.close();
socket.close();
}
}
案例3 字节流
使用writer时,写入数据后,要调用flush刷新
//input字节流转换为reader字符流 InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
//output字节流转换为writer字符流 OutputStream outputStream = socket.getOutputStream(); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
package com.jiao.socket.tcp03;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/8/31
* email:zgt9321@qq.com
**/
public class Server {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("server" + InetAddress.getLocalHost().getHostAddress() + "正在监听");
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String msg = bufferedReader.readLine();
System.out.println("server 收到消息: " + socket.getLocalAddress().getHostName() + " " + msg);
OutputStream outputStream = socket.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello tiantian");
bufferedWriter.newLine();
bufferedWriter.flush();
bufferedWriter.close();
bufferedReader.close();
socket.close();
serverSocket.close();
System.out.println("服务关闭");
}}
客户端
package com.jiao.socket.tcp03;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/8/31
* email:zgt9321@qq.com
**/
public class Client {
public static void main(String[] args) throws IOException {
//Socket socket = new Socket("106.14.219.106", 9999);
Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
System.out.println("正在发送消息");
OutputStream outputStream = socket.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello jiaojiao");
bufferedWriter.newLine();
bufferedWriter.flush();
System.out.println("消息发送完成");
//接收服务端发来的消息
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String msg = bufferedReader.readLine();
System.out.println("client 收到消息: " + socket.getLocalAddress().getHostName() + " " + msg);
bufferedReader.close();
bufferedWriter.close();
socket.close();
}
}
上传文件
文章图片
工具类
package com.jiao.upload;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* auth:@highSky
* create:2022/9/1
* email:zgt9321@qq.com
**/public class StreamUtils {
public static byte[] streamToByteArray(InputStream is) throws Exception {
// 创建输出流对象
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 字节数组
byte[] b = new byte[1024];
int len;
while ((len = is.read(b)) != -1) {
// 循环读取
// 把读取到的数据,写入 bos
bos.write(b, 0, len);
}
byte[] array = bos.toByteArray();
bos.close();
return array;
}public static String streamToString(InputStream is) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
builder.append(line + "\r\n");
}
return builder.toString();
}
}
server
package com.jiao.upload;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/9/1
* email:zgt9321@qq.com
**/
public class Server {public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("》》服务开启,等待连接,发送图片");
//得到连接
Socket socket = serverSocket.accept();
//准备图片
String imgName = "src/com/jiao/upload/jiaojiao.png";
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(imgName));
//将图片保存为byte数组中
byte[] img = StreamUtils.streamToByteArray(bis);
//获取socket的输出流
OutputStream outputStream = socket.getOutputStream();
//转换为缓存输出流
BufferedOutputStream bos = new BufferedOutputStream(outputStream);
bos.write(img);
System.out.println("》》图片发送完成");
socket.shutdownOutput();
//客户端收到图片后的反馈信息
InputStream inputStream = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
System.out.println(reader.readLine());
bos.close();
bis.close();
reader.close();
socket.close();
}}
client
package com.jiao.upload;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* auth:@highSky
* create:2022/9/1
* email:zgt9321@qq.com
**/
public class Client {public static void main(String[] args) throws Exception {
Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
System.out.println("》》等待图片");
//获取socket接收到的二进制图片数据
InputStream inputStream = socket.getInputStream();
BufferedInputStream bis = new BufferedInputStream(inputStream);
byte[] img = StreamUtils.streamToByteArray(bis);
//保存到本地
String imgName = "src/com/jiao/upload/tiantian.png";
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(imgName));
bos.write(img);
System.out.println("》》保存完成");
//给服务端发送接受完成信息
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write(InetAddress.getLocalHost().getHostName() + "已收到图片");
writer.newLine();
writer.flush();
writer.close();
bos.close();
bis.close();
socket.close();
}}
UDP 原理
文章图片
user1
package com.jiao.udp;
import java.io.IOException;
import java.net.*;
/**
* auth:@highSky
* create:2022/9/2
* email:zgt9321@qq.com
**/
public class User1 {public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9999);
//向user2发送消息
byte[] bag = new byte[1024];
DatagramPacket packet = new DatagramPacket(bag, bag.length, InetAddress.getByName("192.168.1.3"), 9998);
byte[] msg = "Hello jiaojiao".getBytes();
packet.setData(msg, 0, msg.length);
socket.send(packet);
System.out.println("发送完成");
System.out.println("等待user2回复");
packet = new DatagramPacket(bag, bag.length);
socket.receive(packet);
msg = packet.getData();
System.out.println(new String(msg, 0, msg.length));
System.out.println("通信完成");
socket.close();
}
}
user2
package com.jiao.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* auth:@highSky
* create:2022/9/2
* email:zgt9321@qq.com
**/
public class User2 {public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9998);
//接受user1的消息
byte[] bag = new byte[1024];
DatagramPacket packet = new DatagramPacket(bag, bag.length);
System.out.println("等待user1的消息");
socket.receive(packet);
byte[] msg = packet.getData();
System.out.println(new String(msg, 0, msg.length));
//回复user1
packet = new DatagramPacket(bag, bag.length, InetAddress.getByName("192.168.1.3"), 9999);
msg = "hello tiantian".getBytes();
packet.setData(msg, 0, msg.length);
socket.send(packet);
System.out.println("通信结束");
socket.close();
}
}
练习 tcp
文章图片
server
package com.jiao.homework.test1;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/9/2
* email:zgt9321@qq.com
**/
public class Server {public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println(">>服务已开启,等待连接");
Socket socket = serverSocket.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//System.out.println("client:" + reader.readLine());
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
if ("name".equals(reader.readLine()))
writer.write("nova");
else
writer.write("你说啥呢");
writer.newLine();
writer.flush();
System.out.println("client:" + reader.readLine());
writer.write("编写java程序");
writer.newLine();
writer.flush();
writer.close();
reader.close();
socket.close();
}
}
client
package com.jiao.homework.test1;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* auth:@highSky
* create:2022/9/2
* email:zgt9321@qq.com
**/
public class Client {public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
System.out.println(">>给服务器发送消息");
//给server发送消息
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write("name");
writer.newLine();
writer.flush();
//接受回复
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//System.out.println("server:" + reader.readLine());
if ("name".equals(reader.readLine()))
writer.write("hobby");
else
writer.write("你说啥呢");
writer.newLine();
writer.flush();
System.out.println("server:" + reader.readLine());
writer.close();
reader.close();
socket.close();
}
}
udp
文章图片
userA
package com.jiao.homework.udp;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
/**
* auth:@highSky
* create:2022/9/2
* email:zgt9321@qq.com
**/
public class UserA {public static void main(String[] args) throws IOException {Scanner in = new Scanner(System.in);
//发送方
DatagramSocket socket = new DatagramSocket(9999);
byte[] bag = new byte[1024];
DatagramPacket packet = new DatagramPacket(bag, bag.length, InetAddress.getByName("192.168.1.3"), 9998);
System.out.println("请输入问题:");
String msgS = in.nextLine();
byte[] msgB = msgS.getBytes();
packet.setData(msgB);
socket.send(packet);
packet = new DatagramPacket(bag, bag.length);
socket.receive(packet);
msgB = packet.getData();
System.out.println(new String(msgB, 0, packet.getLength()));
socket.close();
}}
userB
package com.jiao.homework.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/**
* auth:@highSky
* create:2022/9/2
* email:zgt9321@qq.com
**/
public class UserB {public static void main(String[] args) throws IOException {
//接受方
DatagramSocket socket = new DatagramSocket(9998);
byte[] bag = new byte[1024];
DatagramPacket packet = new DatagramPacket(bag, bag.length);
socket.receive(packet);
byte[] msgB = packet.getData();
System.out.println(new String(msgB, 0, packet.getLength()));
packet = new DatagramPacket(bag, bag.length, InetAddress.getByName("192.168.1.3"), 9999);
packet.setData("四大名著为。。。。。。".getBytes());
socket.send(packet);
socket.close();
}
}
文件传输
文章图片
server
package com.jiao.homework.trans;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* auth:@highSky
* create:2022/9/3
* email:zgt9321@qq.com
**/
public class Server {public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(9999);
//服务端等待客户端下载请求
System.out.println("等待请求");
Socket socket = serverSocket.accept();
//得到socket请求
InputStream is = socket.getInputStream();
byte[] data = https://www.it610.com/article/new byte[1024];
int len = 0;
//文件名称,这里是单线程可以用stringBuilder
StringBuilder fileName = new StringBuilder();
while ((len = is.read(data, 0, data.length)) != -1) {
fileName.append(new String(data, 0, len));
}
System.out.println(fileName);
BufferedInputStream bis = null;
if ("碧蓝之海".equals(fileName.toString())) {
fileName = new StringBuilder("src/com/jiao/homework/trans/碧蓝之海.mp3");
} else {
fileName = new StringBuilder("src/com/jiao/homework/trans/sorry.txt");
}
bis = new BufferedInputStream(new FileInputStream(fileName.toString()));
byte[] file = StreamUtils.streamToByteArray(bis);
//发送给客户端
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
bos.write(file);
bos.flush();
socket.shutdownOutput();
bos.close();
bis.close();
socket.close();
serverSocket.close();
}
}
client
package com.jiao.homework.trans;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
* auth:@highSky
* create:2022/9/3
* email:zgt9321@qq.com
**/
public class Client {public static void main(String[] args) throws Exception {Scanner scanner = new Scanner(System.in);
System.out.println("请输入文件名");
String filename = scanner.nextLine();
//给服务端发送下载文件的文件名
Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 9999);
OutputStream os = socket.getOutputStream();
os.write(filename.getBytes());
os.flush();
socket.shutdownOutput();
//获取返回的文件,下载
//将文件读取到数组中
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
byte[] file = StreamUtils.streamToByteArray(bis);
//保存到本地
if ("碧蓝之海".equals(filename))
filename = "E:\\" + filename + ".mp3";
else
filename = "E:\\" + filename + ".txt";
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filename));
bos.write(file);
bos.flush();
bos.close();
bis.close();
os.close();
socket.close();
}
}
【Java|Java网络多线程】StreamUtils
package com.jiao.homework.trans;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* auth:@highSky
* create:2022/9/1
* email:zgt9321@qq.com
**/public class StreamUtils {
public static byte[] streamToByteArray(InputStream is) throws Exception {
// 创建输出流对象
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 字节数组
byte[] b = new byte[1024];
int len;
while ((len = is.read(b)) != -1) {
// 循环读取
// 把读取到的数据,写入 bos
bos.write(b, 0, len);
}
byte[] array = bos.toByteArray();
bos.close();
return array;
}public static String streamToString(InputStream is) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
builder.append(line + "\r\n");
}
return builder.toString();
}
}
项目-多用户通信
文章图片
推荐阅读
- 交换机|中科大发4万封钓鱼邮件给师生“免费送月饼”,网友(学校太会“整活”了......)
- 窃密恶意软件通过仿冒盗版软件下载网站进行传播
- java|安鸾渗透实战平台综合渗透——SQL注入进阶渗透流程
- 网络|中科大给师生们发了一封钓鱼邮件 结果3000多人上当了
- Java高并发|Java多线程之常用并发容器的使用
- java|01.JAVA并发编程-线程的使用-基本概念
- Java系列——多线程实战|关于Java并发编程的总结和思考
- 并发|Java并发编程的总结和思考
- #|Java多线程那些事,对Java并发编程2w余字的总结,超详细(从入门到完全掌握)