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();    }}

项目-多用户通信