TCP客户端上传任意文件至服务端

1.客户端引入库

代码如下(示例):

package TCP_and_UDP;
import java.io.*;
import java.net.Socket;

2.客户端代码

代码如下(示例):

public class Client {
    private static final int SIZE = 1024*1024;
    public static void main(String[] args) throws IOException {
        in();
    }

    public static void in() throws IOException {

        //创建缓冲区存储从键盘录入的信息,主要是一整行一整行地读
        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
        //获取文件路径
        System.out.println("请输入文件所在的目录以及文件名称,以回车键结束(例如:G:\\IdeaProjects\\untitled\\一路向北.mp3)");
        String dir = bufr.readLine();
        //获取文件类型
        System.out.println("请输入上传的文件类型,以回车键结束(例如:.mp3)");
        String name = bufr.readLine();
        //获取IP地址
        System.out.println("请输入你要上传的IP地址,以回车键结束");
        String ip = bufr.readLine();

        //关闭资源
        bufr.close();

        //调用运行客户端所在的方法,并将文件路径,文件类型和IP地址作为参数传入
        free(dir,ip,name);
    }

    public static void free(String dir,String ip,String name) throws IOException {

        //创建Socket对象,这是必须要做的,因为客户端和服务端就是靠这个连接,10005为端口号
        //不建议使用1024以内的端口号
        Socket s = new Socket(ip,10005);

        //读取客户端要上传的文件
        FileInputStream bufi = new FileInputStream(dir);

        //将读到的文件数据发送给服务端
        PrintStream out = new PrintStream(s.getOutputStream(),true);

        //将文件类型告诉服务器,以便于生成对应类型的文件
        PrintWriter out1 = new PrintWriter(s.getOutputStream(),true);
        out1.println(name);

        //创建数组存储读到的文件的字节信息
        byte[] buf = new byte[SIZE];

        int len = 0;
        while((len = bufi.read(buf))!=-1)
        {
            //将读到的数据传给服务器端
           out.write(buf,0,len);

        }


        //告知服务端数据发送完毕,让服务端停止读取,否则服务端将一直等待读取
        s.shutdownOutput();

        //读取服务端发回来的应答消息,这里用缓冲区是不想创建一个数组了
        BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));

        //这里没有加while语句是因为已经知道应答消息只有:上传成功,所以不需要,但为了严谨,根据需求添加
        String str = bufr.readLine();
        //输出从服务端获取的应答消息
        System.out.println(str);

        //关流,关闭资源,PrintStream和PrintWriter会随着Socket的关闭而关闭
        s.close();
        bufi.close();
        bufr.close();


    }

3.服务端引入库

package TCP_and_UDP;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

4.服务端代码

public class Server {
    private static final int SIZE = 1024*1024;
    public static void main(String[] args) throws IOException {

        free();

    }

    public static void free() throws IOException {

        //创建服务器端ServerSocket对象,客户端和服务器端的端口必须一致才能进行连接
        ServerSocket ss = new ServerSocket(10005);

        //获取连接进来的客户端Socket对象......这里可能说得不对
        Socket s = ss.accept();
        //打印连接进来的客户端的IP,并且打印是否连接成功
        System.out.println(s.getInetAddress().getHostAddress()+".......连接成功");

        //从流中读取客户端发来的数据
        InputStream  in = s.getInputStream();

        //这个是从流中获取文件的类型,因为是用字符流传过来的是字符串,所以用字符流
        BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String name = bufr.readLine();

        //创建文件
        FileOutputStream fos = new FileOutputStream("server"+name);

        byte[] buf = new byte[SIZE];

        int len = 0;

        while((len = in.read(buf))!=-1)
        {
            //将数据写入文件
            fos.write(buf,0,len);
            fos.flush();
        }

        //创建PrintWriter对象,告诉客户端文件上传成功
        PrintWriter out = new PrintWriter(s.getOutputStream(),true);
        out.println("上传成功");

        //关闭资源
        s.close();
        ss.close();
        fos.close();

    }

总结

以上就是全部内容,本文仅仅粗略地实现了客户端向服务端上传文件,
每次只能上传一个文件,如果需要同时上传多个文件,就需要运用到多线程任务来实现,可能有些地方的解释不对,以及有一些地方浪费了资源,也就是有更好的方式,还希望路过的大佬能够指出,谢谢大佬!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
TCP服务端连接任意客户端的C代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 8888 #define MAXLINE 1024 int main(int argc, char *argv[]) { int sockfd, connfd; struct sockaddr_in servaddr, cliaddr; char buff[MAXLINE]; time_t ticks; // 创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); // 初始化服务器地址结构体 bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(PORT); // 绑定套接字和地址 bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); // 监听套接字 listen(sockfd, 5); printf("server listening on port %d...\n", PORT); while (1) { socklen_t clilen = sizeof(cliaddr); // 接受客户端连接 connfd = accept(sockfd, (struct sockaddr *)&cliaddr, &clilen); printf("client connected: %s:%d\n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port)); ticks = time(NULL); snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks)); // 发送数据给客户端 write(connfd, buff, strlen(buff)); // 关闭连接 close(connfd); } return 0; } ``` 这段代码实现了一个TCP服务端,可以连接任意客户端。它首先创建一个套接字,然后初始化服务器地址结构体,绑定套接字和地址,监听套接字。在一个无限循环中,它接受客户端连接,打印客户端IP地址和端口号,发送当前时间给客户端,然后关闭连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值