继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Socket编程-TCP协议上传图片到服务器

xiaoxin3839519
关注TA
已关注
手记 23
粉丝 9
获赞 227

此案例对任何非文本文件例如视频,音频,图片都适用

TCP协议上传文件到服务器步骤:
    发送:
        创建TCP客户端的Socket对象
        读取源文件数据
        获取输出流,写数据
        释放资源
        接收服务器反馈的信息

    接收:
        创建TCP服务器端的Socket对象
        监听客户端连接
        获取输入流,读取数据
        把读到的数据全部写入目的文件
        释放资源
        给客户端一个反馈信息

快速获取本机IP地址的方法:打开dos命令窗口,输入ipconfig,回车
package com.imooc;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

//这是客户端类
class Client implements Runnable{
    @Override
    //重写run方法
    public void run() {
        try {
            //创建客户端Socket对象
            Socket s=new Socket("192.168.1.128",2048);
            //包装通道内流
            BufferedOutputStream bos=new BufferedOutputStream(s.getOutputStream());
            //创建缓冲输入流
            BufferedInputStream bis=new BufferedInputStream(new FileInputStream(new File("Android.png")));
            //定义一个字节数组bytes
            byte bytes[]=new byte[1024];
            //定义一个整型变量d,表示读到的字节的实际长度
            int d;
            //读取图片文件,把读出来的字节数据全部写入通道内流bos中,直到读完为止
            while((d=bis.read(bytes, 0, bytes.length))!=-1){
                bos.write(bytes,0,d);
                //刷新缓冲流(这里必须刷新,否则可能会丢失字节数据)
                bos.flush();
            }
            //关闭客户端Socket输出流(否则通道一直阻塞)
            s.shutdownOutput();
            byte bytes2[]=new byte[1024];
            //接收来自客户端的反馈
            InputStream is=s.getInputStream();
            d=is.read(bytes2);
            String a=new String(bytes2,0,d);
            System.out.println(a);
            //关闭缓冲流
            bis.close();
            //关闭客户端Socket
            s.close();
        } catch (Exception e) {
            e.printStackTrace();
        }   
    }
}

//这是服务器端类
class Server implements Runnable{
    @Override
    //重写run方法
    public void run() {
        try {
            //创建服务器端Socket
            ServerSocket ss=new ServerSocket(2048);
            //监听并接收客户端Socket的连接
            Socket s=ss.accept();
            //包装通道内流
            BufferedInputStream bis=new BufferedInputStream(s.getInputStream());
            //创建缓冲流
            BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("Ok.png"));
            //定义一个字节数组bytes
            byte bytes[]=new byte[1024];
            //定义一个整型变量d,表示读到的字节的实际长度
            int d;
            //读取通道内输入流的数据,并将数据写入缓冲流的底层
            while((d=bis.read(bytes))!=-1){
                bos.write(bytes, 0, d);
                //刷新缓冲流
                bos.flush();
            }
            //给客户端一个反馈
            OutputStream os=s.getOutputStream();
            os.write("图片上传成功".getBytes());
            //关闭缓冲流
            bos.close();
            //关闭服务器Socket
            ss.close();
        } catch (Exception e) {
            e.printStackTrace();
        }   
    }

}

//这是测试类
public class Test7 {
    public static void main(String[] args) throws IOException, InterruptedException {
        //创建对象client和server
        Client client=new Client();
        Server server=new Server();
        //创建指定对象的线程
        Thread t1=new Thread(client);
        Thread t2=new Thread(server);
        //启动线程
        t1.start();
        t2.start();
    }
}
打开App,阅读手记
6人推荐
发表评论
随时随地看视频慕课网APP