JavaSE练习-多线程、Socket(TCP协议)、IO流模拟实现服务端多线程接收客户端上传图片

来源:互联网 发布:碑文 软件 编辑:程序博客网 时间:2024/05/22 15:31

前言:对多线程、Socket(TCP协议)、字节流(高效字节流)回顾练习,实现一个模拟多个客户端向服务端发送数据服务端开多线程来接受客户端发送数据。

一、客户端实现

package cn.itcast.javaeevideoday01;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;import java.net.UnknownHostException;/** *  * @author 大家都说名字长不会被发现 *  客户端 */public class TcpClient {    public static void main(String[] args) {        uploadFile();    }    /*     * 上传文件到服务端     *      */    private static void uploadFile() {        // TODO Auto-generated method stub        Socket socket = null;        OutputStream outputStream = null;        BufferedInputStream inputStream = null;        try {            //创建客户端Socket对象            socket = new Socket(InetAddress.getByName("127.0.0.1"), 8880);            //获取Sokect对象中的输出流            outputStream = socket.getOutputStream();            //定义字节输入流,读取文件            inputStream = new BufferedInputStream(new FileInputStream("D:\\电脑壁纸\\QQ图片20151026225122.jpg"));            byte[] buf = new byte[1024*1024];            int len;            //循环读取            while((len = inputStream.read(buf)) != -1) {                //写入数据                outputStream.write(buf,0,len);            }            socket.shutdownOutput();            //获取服务端反馈信息            receiveServerUploadFeedBack(socket);        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally {            try {                outputStream.close();                inputStream.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }    /*     * 接收服务端回传消息     */    private static void receiveServerUploadFeedBack(Socket socket) {        // TODO Auto-generated method stub        InputStream inputStream = null;        try {            //获取Socket对象中的输入流            inputStream = socket.getInputStream();            byte[] buf = new byte[1024*1024];            //读取数据到缓存区            int len = inputStream.read(buf);            System.out.println(new String(buf,0,len));        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally {            try {                inputStream.close();                socket.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}

二、多线程实现

package cn.itcast.javaeevideoday01;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;/** * ·1 * @author 大家都说名字长不会被发现 *  线程 */public class FileReceiveThread implements Runnable{    //定义接收服务端Socket    private Socket socket;    //满参构造    public FileReceiveThread(Socket socket) {        super();        this.socket = socket;    }    //空参构造    public FileReceiveThread() {        super();        // TODO Auto-generated constructor stub    }    @Override    public void run() {        // TODO Auto-generated method stub        //读写数据        readWriteFile();    }    /*     * 反馈是否上传成功消息消息     */    private void serverFeelBackMessage(StringBuilder stringBuilder) {        // TODO Auto-generated method stub        File file = new File(stringBuilder.toString());        OutputStream outputStream = null;        try {            //获取客户端输出流            outputStream = socket.getOutputStream();            //判断上传文件是否存在            if (file.exists()) {                //返回成功消息                outputStream.write("图片上传成功".getBytes());            }else {                //返回失败消息                outputStream.write("图片上传失败".getBytes());            }        } catch (IOException e) {            // TODO: handle exception        }finally {            try {                outputStream.close();                socket.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }    /*     * 读写客户端发送数据     */    private void readWriteFile() {        // TODO Auto-generated method stub        //获取客户端输入流        InputStream inputStream = null;        //定义字节输出流        BufferedOutputStream outputStream = null;        try {            inputStream = socket.getInputStream();            //定义字符串拼接对象            StringBuilder stringBuilder = new StringBuilder();            stringBuilder.append("D:\\test\\").append(System.currentTimeMillis()).append(socket.getPort()).append(".jpg");            outputStream = new BufferedOutputStream(new FileOutputStream(stringBuilder.toString()));            //定义缓存区            byte[] buf = new byte[1024*1024];            //循环读取数据            int len;            while((len = inputStream.read(buf)) != -1) {                //写入数据                outputStream.write(buf,0,len);            }            //给客服端发送反馈消息            serverFeelBackMessage(stringBuilder);        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally {            //关闭资源            try {                outputStream.close();                inputStream.close();                socket.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }}

三、服务端实现

package cn.itcast.javaeevideoday01;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;/** *  * @author 大家都说名字长不会被发现 *  服务端 */public class TcpServer {    public static void main(String[] args) throws Exception {        //创建服务端Socket,并指定端口号        ServerSocket serverSocket = new ServerSocket(8880);        //死循环开启服务端        while(true) {            //获取客户端Socket            Socket socket = serverSocket.accept();            //开启线程            new Thread(new FileReceiveThread(socket)).start();        }    }}
阅读全文
0 0
原创粉丝点击