此案例对任何非文本文件例如视频,音频,图片都适用
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();
}
}