java socket上传_java socket之上传文件

本文详细介绍了如何使用TCP Socket在客户端和服务器端之间实现文件的上传和确认机制。服务器端监听9999端口,接收客户端上传的文件`test_client.txt`,将其保存为`test_server.txt`并发送确认信息。客户端则发送文件并接收服务器的反馈。整个过程涉及线程处理、输入输出流操作和文件读写。
摘要由CSDN通过智能技术生成

一、功能介绍

该功能主要实现,将客户端的:F:/work/socketSample/filetemp/client/test_client.txt上传到服务端F:/work/socketSample/filetemp/server/test_server.txt,并将test_client.txt名字修改为test_server.txt,如果服务端收到文件,则向客户端发送提示信息”文件已保存至服务器的F:/work/socketSample/filetemp/server/test_server.txt“

二、工程目录结构

5916a9d2f9c395b7956fc924186cac5a.png

三、服务端

1)Server,服务端主类,监听端口,有请求将开启处理子线程

packagefileSockeServer;importjava.io.IOException;importjava.net.InetAddress;importjava.net.ServerSocket;importjava.net.Socket;/*** 基于TCP协议的Socket通信,实现文件传输-服务器端*/

public classServer {public static voidmain(String[] args) {try{//创建一个服务器端的ServerSocket,绑定并监听9999端口

ServerSocket serverSocket = new ServerSocket(9999);int count = 0;//记录客户端的数量

System.out.println("服务器启动,等待客户端的连接。。。");

Socket socket= null;while (true) {//循环监听等待客户端的连接

socket =serverSocket.accept();//每当一个客户端连接到服务器,服务器启动一个单独的线程处理与此客户端的通信

++count;

Thread serverHandleThread= new Thread(newServerHandleThread(socket));

serverHandleThread.setPriority(4);//设置线程的优先级[1,10],1为最低,默认是5

serverHandleThread.start();

System.out.println("上线的客户端有" + count + "个!");

InetAddress inetAddress=socket.getInetAddress();

System.out.println("当前客户端的IP地址是:"+inetAddress.getHostAddress());

}

}catch(IOException e) {

e.printStackTrace();

}

}

}

2)ServerHandleThread,对客户端的请求进行处理的子线程类

packagefileSockeServer;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.io.PrintWriter;importjava.net.Socket;public class ServerHandleThread implementsRunnable{

Socket socket= null;//和本线程相关的Socket

publicServerHandleThread(Socket socket) {super();this.socket =socket;

}//响应客户端的请求

@Overridepublic voidrun() {//TODO Auto-generated method stub

OutputStream os = null;

PrintWriter pw= null;try{

InputStream is=socket.getInputStream();//要完成客户端文件上传到服务器的功能需要将客户机的文件通过FileInputStream进行读取,并包装成BufferedInputStream,//将套接字的输出流包装成BufferedOutputStream,用BufferedInputStream中的read()方法读取文件中的数据,//并用 BufferedOutputStream中的write()方法进行写入,这样文件就送入了Socket的输出流;

BufferedInputStream bufferedInputStream = new BufferedInputStream(is);//将BufferedInputStream与套接字的输入流进行连接

BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(new FileOutputStream("F:/work/socketSample/filetemp/server/test_server.txt"));byte[] buf=new byte[1024];int len=0;while((len=bufferedInputStream.read(buf))!=-1){

bufferedOutputStream.write(buf,0, len);

}//强行写入输出流,因为有些带缓冲区的输出流要缓冲区满的时候才输出

bufferedOutputStream.flush();//刷新缓冲流

socket.shutdownInput();//关闭输入流

os=socket.getOutputStream();

pw=newPrintWriter(os);

pw.println("文件已保存至服务器的F:/work/socketSample/filetemp/server/test_server.txt");

pw.flush();

socket.shutdownOutput();

}catch(IOException e) {//TODO Auto-generated catch block

e.printStackTrace();

}finally{//关闭相关资源

try{if (pw != null) {

pw.close();

}if (os != null) {

os.close();

}if (socket != null) {

socket.close();

}

}catch(IOException e) {

e.printStackTrace();

}

}

}

}

四、客户端

1)Client,向服务端发送文件,如果收到服务的反馈信息,将信息打印输出

packagefileSocketClient;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.net.Socket;importjava.net.UnknownHostException;/*** 基于TCP协议的Socket通信,实现文件传输-客户端*/

public classClient {public static voidmain(String[] args) {try{//1.创建客户端的Socket,指定服务器的IP和端口

Socket socket = new Socket("127.0.0.1", 9999);//2.获取该Socket的输出流,用来向服务器发送文件

OutputStream os =socket.getOutputStream();

BufferedOutputStream bufferedOutputStream= new BufferedOutputStream(os);//将BufferedOutputStream与套接字的输出流进行连接

BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("F:/work/socketSample/filetemp/client/test_client.txt"));//读取客户机文件

byte[] buf = new byte[1024];int len = 0;while ((len = bufferedInputStream.read(buf)) != -1) {

bufferedOutputStream.write(buf,0, len);//向BufferedOutputStream中写入数据

}

bufferedOutputStream.flush();//刷新缓冲流

socket.shutdownOutput();//禁用此套接字的输出流//3.获取输入流,取得服务器的信息

InputStream is =socket.getInputStream();

BufferedReader br= new BufferedReader(newInputStreamReader(is));

String info= null;while ((info = br.readLine()) != null) {

System.out.println("服务器端的信息:" +info);

}

socket.shutdownInput();//禁用此套接字的输出流//4.关闭资源

os.close();

bufferedInputStream.close();

bufferedOutputStream.close();

is.close();

br.close();

socket.close();

}catch(UnknownHostException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值