21.2. TCP Socket

21.2.1. 案例:文件上传工具

UploadServer.java

package com.a51work.cn;

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class UploadServer {
    public static void main(String[] args) {
        System.out.println("服务端运行.............");
        try (// 创建一个ServerSocket监听8080端口的客户端请求
             ServerSocket server = new ServerSocket(8080);
             // 使用accept()阻塞当前线程,等待客户端请求
             Socket socket = server.accept();
             // 由Socket获得输入流,并创建缓冲输入流
             BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
             // 由文件输出流创建缓冲输出流
             FileOutputStream out = new FileOutputStream("./hujianli.sh")) {

            //准备一个缓冲区
            byte[] buffer = new byte[1024];
            // 首次从Socket读取数据
            int len = in.read(buffer);
            while (len != -1) {
                // 写入数据到文件
                out.write(buffer, 0, len);

                // 再次从Socket读取数据
                len = in.read(buffer);
            }
            System.out.println("接收完成!");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

UploadClient.java

package com.a51work.cn;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;

public class UploadClient {
    public static void main(String[] args) {
        System.out.println("客户端运行............");
        try (// 向本机的8080端口发出请求
             Socket socket = new Socket("127.0.0.1", 8080);
             // 由Socket获得输出流,并创建缓冲输出流
             BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
             // 创建文件输入流
             FileInputStream fin = new FileInputStream("D:\\GitHub\\test.sh");
             // 由文件输入流创建缓冲输入流
             BufferedInputStream in = new BufferedInputStream(fin)) {
            // 准备一个缓冲区
            byte[] buffer = new byte[1024];
            // 首次读取文件
            int len = in.read(buffer);
            while (len != -1) {
                // 数据写入Socket
                out.write(buffer, 0, len);
                // 再次读取文件
                len = in.read(buffer);
            }
            System.out.println("上传成功!!");
            } catch(IOException e){
                e.printStackTrace();
            }
        }
    }

21.2.2. 案例:聊天工具

ChatServer.java

package com.a51work.cn;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatServer {
    public static void main(String[] args) {
        System.out.println("服务器运行...............");
        Thread t = new Thread(() -> {
            try (// 创建一个ServerSocket监听端口8080客户请求
                 ServerSocket server = new ServerSocket(8080);
                 // 使用accept()阻塞等待客户端请求
                 Socket socket = server.accept();
                 DataInputStream in = new DataInputStream(socket.getInputStream());
                 DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                 BufferedReader keyboardIn = new BufferedReader(new InputStreamReader(System.in))) {
                while (true) {
                    /* 接收数据 */
                    String str = in.readUTF();
                    // 打印接收的数据
                    System.out.printf("从客户端接收的数据:【%s\n", str);

                    /* 发送数据 */
                    // 读取键盘输入的字符串
                    String keyboardInputString = keyboardIn.readLine();
                    // 结束聊天
                    if (keyboardInputString.equals("bye")){
                        break;
                    }
                    //发送
                    out.writeUTF(keyboardInputString);
                    out.flush();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        t.start();

    }
}

ChatClinet.java

package com.a51work.cn;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class ChatClient {
    public static void main(String[] args) {
        System.out.println("客户端运行..............");
        Thread t = new Thread(() -> {
            try (//  向127.0.0.1主机8080端口发出连接请求
                 Socket socket = new Socket("127.0.0.1", 8080);
                 DataInputStream in = new DataInputStream(socket.getInputStream());
                 DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                 BufferedReader keyboardIn = new BufferedReader(new InputStreamReader(System.in))) {
                while (true) {
                    /* 发送数据 */
                    // 读取键盘输入的字符串
                    String keyboardInputString = keyboardIn.readLine();
                    //结束聊天
                    if (keyboardInputString.equals("bye")) {
                        break;
                    }

                    //发送
                    out.writeUTF(keyboardInputString);
                    out.flush();
                    //接收数据
                    String str = in.readUTF();
                    //打印接收的数据
                    System.out.printf("从服务器接收的数据:【%s\n", str);
                }
            } catch (Exception e) {
          System.out.println("服务器暂时未启动........");
            }
            System.out.println("客户端停止!");
        });
        t.start();
    }
}