Java 网络编程 02 TCP编程 & 文件上传

1 TCP程序

1)服务端:先启动

package com.lihaogn.inet;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 1 创建服务器 ServerSocker 对象
 * 2 开启服务器,等待客户端连接
 * 3 给客户端反馈信息
 * 4 关闭资源
 * 
 * @author Mac
 *
 */
public class TCPServer {

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

        // 1 创建服务器 ServerSocker 对象
        ServerSocket serverSocket=new ServerSocket(12345);
        // 2 开启服务器,等待客户端连接
        Socket socket=serverSocket.accept();
        // 3 给客户端反馈信息
        OutputStream outputStream=socket.getOutputStream();
        outputStream.write("连接服务器成功!".getBytes());
        // 4 关闭资源
        outputStream.close();
        socket.close();
//      serverSocket.close(); // 服务器流通常是不关闭的    
    }
}

2)客户端:后启动

package com.lihaogn.inet;

import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * 1 创建客户端对象 Socket 
 * 2 获取服务器端反馈的信息 
 * 3 关闭资源
 * 
 * @author Mac
 *
 */

public class TCPClient {

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

        // 1 创建客户端对象 Socket
        Socket socket = new Socket(InetAddress.getLocalHost().getHostAddress(), 12345);
        // 2 获取服务器端反馈的信息
        InputStream inputStream = socket.getInputStream();
        byte[] buffer = new byte[1024];
        int length = inputStream.read(buffer);
        System.out.println(new String(buffer, 0, length));
        // 3 关闭资源
        inputStream.close();
        socket.close();
    }
}

2 文件上传

1)服务器端

package com.lihaogn.inet;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * 文件上传 服务器端
 */

public class FileServer {

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

        // 1 创建服务器,等待客户端连接
        ServerSocket serverSocket = new ServerSocket(22222);
        Socket clientSocket = serverSocket.accept();
        // 2 获取连接客户端的IP地址对象
        InetAddress ipAddress = clientSocket.getInetAddress();
        String ipString = ipAddress.getHostAddress(); // 获取客户端的IP地址

        System.out.println("发现一个客户端! " + ipString);
        // 3 获取socket输入流,准备读取客户端数据
        InputStream inputStream = clientSocket.getInputStream();
        // 4 获取本地输出流,准备写入客户端传来的数据到本地
        BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream("/Users/Mac/mydata/upload.png"));

        byte[] buffer = new byte[1024];
        int len = -1;
        while ((len = inputStream.read(buffer)) != -1) {
            fileOut.write(buffer, 0, len);
        }
        // 5 发送反馈信息给客户端
        OutputStream outputStream = clientSocket.getOutputStream();
        outputStream.write("文件上传成功!".getBytes());
        // 6 关闭资源
        outputStream.close();
        fileOut.close();
        inputStream.close();
        clientSocket.close();

    }
}

2)客户端

package com.lihaogn.inet;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

/*
 * 文件上传 客户端
 */

public class FileClient {

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

        // 1 创建客户端socket对象,连接服务器
        Socket socket=new Socket(InetAddress.getLocalHost().getHostAddress(),22222);
        // 2 获取socket输出流,准备将数据传输到服务器
        OutputStream outputStream=socket.getOutputStream();
        // 3 获取本地输入流,读取要传输的文件
        BufferedInputStream fileIn=new BufferedInputStream(new FileInputStream("/Users/Mac/mydata/touxiang.png"));
        // 4 传输数据
        byte[] buffer=new byte[1024];
        int len=-1;
        while ((len=fileIn.read(buffer))!=-1) {
            outputStream.write(buffer,0,len);
        }
        // 5 关闭socket输出流,告知服务器数据传输完毕
        socket.shutdownOutput();

        // 6 反馈信息
        // 7 获取socket输入流
        InputStream inputStream=socket.getInputStream();
        // 8 读取数据
        byte[] info=new byte[1024];
        int length=inputStream.read(info);
        System.out.println(new String(info, 0, length));
        // 9 关闭资源
        inputStream.close();
        fileIn.close();
        outputStream.close();
        socket.close();

    }
}

3 文件上传多线程版本

只需要更改服务器端:

package com.lihaogn.inet;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * 文件上传 服务器端 多线程 接收多个客户端连接
 */

public class FileServer {

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

        // 1 创建服务器,等待客户端连接
        ServerSocket serverSocket = new ServerSocket(22222);

        while (true) {

            final Socket clientSocket = serverSocket.accept();

            new Thread() {
                public void run() {
                    try {
                        // 2 获取连接客户端的IP地址对象
                        InetAddress ipAddress = clientSocket.getInetAddress();
                        String ipString = ipAddress.getHostAddress(); // 获取客户端的IP地址

                        System.out.println("发现一个客户端! " + ipString);
                        // 3 获取socket输入流,准备读取客户端数据
                        InputStream inputStream = clientSocket.getInputStream();
                        // 4 获取本地输出流,准备写入客户端传来的数据到本地
                        BufferedOutputStream fileOut = new BufferedOutputStream(
                                new FileOutputStream("/Users/Mac/mydata/upload.png"));

                        byte[] buffer = new byte[1024];
                        int len = -1;
                        while ((len = inputStream.read(buffer)) != -1) {
                            fileOut.write(buffer, 0, len);
                        }
                        // 5 发送反馈信息给客户端
                        OutputStream outputStream = clientSocket.getOutputStream();
                        outputStream.write("文件上传成功!".getBytes());
                        // 6 关闭资源
                        outputStream.close();
                        fileOut.close();
                        inputStream.close();
                        clientSocket.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                };
            }.start();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/lihaogn/article/details/81220589