TCP上传文件
- 基本思路:
- 客户端,客户端想要往服务端上传文件,无法通过自带的socket.read方法先读,在写,因为文件的大小是不确定的,因此你无法指定一个大小为多少的byte【】来存储。
- 因此我们用到了,一个新的类ByteArrayOutputStream,它有个toByteArray方法,可以创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。可以把缓冲区byteArrayOutputStream.write(bytes,0,len);(即此时该对象的一个区域)中的内容复制到该数组中。其具体代码如下
package InetAddRess;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
// 把字节流放入到字节数组中的方法
public class SteamToByteArray01 {
public static byte[] streamToByteArray(InputStream stream) throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] bytes=new byte[1024];
int len;
while ((len=stream.read(bytes))!=-1){
byteArrayOutputStream.write(bytes,0,len);//把bytes中的字节,按照偏移量0-len写到by对象中
}
//创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。
//缓冲区:上面读完的数据都在缓冲区放着,下面的方法就是把缓冲区的内容放到数组中
byte[] array=byteArrayOutputStream.toByteArray();
byteArrayOutputStream.close();
return array;
}
}
然后在利用socket.write方法,通过与服务端建立的连接桥传输过去。
- 服务端,服务端做的事情比较简单一点,就是接受数据,然后保存到一个位置,首先接受数据,肯定是要用socket.getInputStream创建一个对象来接受,因为只有它能获取客户端传来的数据,然后调用该对象的read方法,每次读一个数据就把它放在数组中,然后创建一个BufferedOutputStream对象用来write即可。
具体代码如下:
package InetAddRess.Test;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
System.out.println("正在等待连接!!!!");
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
String path="D:\\Netease.zip";
byte[] bytes = new byte[1024];
int len=0;
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(path));
while ((len=inputStream.read(bytes))!=-1)
{
bufferedOutputStream.write(bytes,0,len);
}
System.out.println("读取完毕。");
//关闭流 至于关闭什么流 你就看这个流用没用read或者write方法就行了 没用就不用管
socket.close();
serverSocket.close();
bufferedOutputStream.close();
inputStream.close();
}
}
客户端
package InetAddRess.Test;
import InetAddRess.SteamToByteArray01;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
String path="E:\\Netease.zip";
//socket.getInputStream()只能读socket传来的数据
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(path));
byte[] bytes= SteamToByteArray01.streamToByteArray(bufferedInputStream);
OutputStream outputStream = socket.getOutputStream();
//outputStream.write必须提前写好东西,然后传给他,这个方法很垃圾
outputStream.write(bytes);
System.out.println("传送完毕!断开连接!");
socket.close();
outputStream.close();
bufferedInputStream.close();
}
}
接受到文件后,服务端返回信息
package InetAddRess.UpdateFile;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class UpdateFileServer {
public static void main(String[] args) throws IOException {
System.out.println("服务器正在等待请求。。。");
ServerSocket serverSocket = new ServerSocket(8888);
//如果接收到了请求就返会一个socket对象
Socket socket = serverSocket.accept();
//然后就可以读取内容
InputStream inputStream = socket.getInputStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
//先读取数据放到一个地方
String path="E:\\GTA5线上小助手.exe";
//InputStream inputStream = socket.getInputStream();
//socket.getOutputStream(new FileOutputStream(path)
//在socket中是不允许将字节输出到文件中去的,因此我们要用到之前学的方法
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(path));
byte[] bytes = new byte[1024];
int len=0;
while ((len=inputStream.read(bytes))!=-1){
bufferedOutputStream.write(bytes,0,len);
}
System.out.println("读取完毕!");
socket.shutdownInput();
OutputStream outputStream = socket.getOutputStream();
outputStream.write("服务端收到程序!!!".getBytes());
//以前的这种方式是能读取,但是它不能把文件保存在某个地方
bufferedOutputStream.close();
bufferedInputStream.close();
serverSocket.close();
socket.close();
}
}
package InetAddRess.UpdateFile;
import InetAddRess.SteamToByteArray01;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class UpDateFileClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket(InetAddress.getLocalHost(),8888);
System.out.println("已连接服务端!正在发送数据!");
String path="D:\\GTA5线上小助手 支持1.58 完全免费 v3.0.2.1.exe";
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(path));
//调用下面对象进行读取数据,并存放到字节数组中
byte[] bytes= SteamToByteArray01.streamToByteArray(bufferedInputStream);
OutputStream outputStream = socket.getOutputStream();
//outputStream.write只能输出你写好给他的东西,但不能是一个文件
outputStream.write(bytes);
System.out.println("文件上传完毕");
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
byte[] bytes1 = new byte[1024];
int len=0;
while ((len=inputStream.read(bytes1))!=-1){
System.out.println(new String(bytes1,0,len));
}
bufferedInputStream.close();
socket.close();
}
}
TCP 转换流,发送数据
package InetAddRess.HomeWork;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
public class homework001 {
public static void main(String[] args) throws IOException {
//服务端
System.out.println("正在监听!!!");
ServerSocket serverSocket = new ServerSocket(5555);
Socket accept = serverSocket.accept();
InputStream inputStream = accept.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String s = bufferedReader.readLine();
accept.shutdownInput();
OutputStream outputStream = accept.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);//转换为字符流
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
if ("name".equals(s)) {
//服务端回复xxx
bufferedWriter.write("你好我是服务端!");
} else {
bufferedWriter.write("你真帅!");
}
bufferedWriter.flush();
System.out.println("服务端,结束!");
bufferedWriter.close();
bufferedReader.close();
serverSocket.close();
accept.close();
}
}
package InetAddRess.HomeWork;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class homework1 {
public static void main(String[] args) throws IOException {
//客户端
System.out.println("连接完毕!正在发送数据!");
Socket socket = new Socket(InetAddress.getLocalHost(), 5555);
OutputStream outputStream = socket.getOutputStream();
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);//转换为字符流
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
bufferedWriter.write("name");
bufferedWriter.flush();
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String s = bufferedReader.readLine();
System.out.println(s);
System.out.println("客户端关闭!");
bufferedReader.close();
bufferedWriter.close();
socket.close();
}
}
字符流读取别往了flush方法
文件下载
加油加油!!!