Java网络多线程2022年8月31日
笔记 韩顺平Java自学笔记 网络多线程_关注永雏塔菲喵的博客-CSDN博客
网课 【韩顺平讲Java】Java网络多线程专题 – TCP UDP Socket编程 多线程 并发处理 文件传输 新闻推送 Java_哔哩哔哩_bilibili
通信项目上传到github:cxy-sky/JavaSocket: Java 网络多线程专题,包括 TCP UDP Socket编程 多线程 并发处理 文件传输 新闻推送 (github.com)
2022年9月7日完结
InetAddress
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 = 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(); }}
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(); }}
项目-多用户通信