亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Socket編程-TCP協議上傳圖片到服務器

標簽:
Java

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

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();
    }
}
點擊查看更多內容
6人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
移動開發工程師
手記
粉絲
9
獲贊與收藏
227

關注作者,訂閱最新文章

閱讀免費教程

感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消