利用TCP从客户端往服务器端发送一个文件过程中发生的问题

基础知识

使用java Socket编程时java网络编程中最常用的方式,而且步骤一般都是固定的。
对客户端具体来讲,分以下几步:
1.建立客户端Socket

//使用本机回环地址来测试,端口使用 10000
Socket socket = new Socket("127.0.0.1",10000);

2.从Socket中获取数据流并封装数据流

//使用缓冲流加快速度
BufferedReader bReader = null;
bReader= new BufferedReader(new FileReader(file));

3.得到流中数据

//每次读取一行数据 readLine()
String line = null;
line = bReader.readLine();

4.释放资源

if(bReader!=null)
    bReader.close();
if(socket!=null)
    socket.close();

对服务器端来讲:
1.建立服务器端Socket,并监听一个客户端 端口

//创建socket的同时监听客户端 端口
ServerSocket sSocket = null;
sSocket = ServerSocket(10000);

2.获得连接过来的客户端Socket

Socket socket = sSocket.accept();

3.封数据流并向客户端写数据

BufferdeWriter bWriter = null;
bWriter = new BufferedWriter(new
                FileWriter(socket.getOutputStream()));
bWriter.write("你好");

4.释放资源

if(bWriter!=null)
    bWriter.close();
if(socket!=null)
    socket.close();
//注意:服务器 sSocket不用关闭

代码完整示例 ##

/*
这两个程序可以从本地客户端把一个文件上传到服务器端
*/
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
//客户端
public class TCPClient {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        File file = new File("src\\com\\briup\\upload\\TCPServer.java");
        Socket socket  = null;
        BufferedReader bReader = null;
        PrintWriter pWriter = null;
        try {
            socket = new Socket("127.0.0.1", 10010);
            bReader = new BufferedReader(new FileReader(file));
            pWriter = new PrintWriter(socket.getOutputStream(),true);
            String line = null;
            while((line=bReader.readLine())!=null){
                pWriter.println(line);
            }
            //关闭客户端的输出流,相当于给流做了一个结束标记
            socket.shutdownOutput();

            BufferedReader bReaderSocket = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String endFlag = bReaderSocket.readLine();
            System.out.println(endFlag);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            if(pWriter!=null)
                pWriter.close();
            try {
                if(bReader!=null)
                    bReader.close();
                if(socket!=null)
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
//服务器端
public class TCPServer {
    private static int num = 1;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ServerSocket serverSocket = null;
        BufferedReader bReader = null;
        PrintWriter pWriter = null;
        BufferedWriter bWriteSocket = null;
        Socket socket = null;
        File file = new File("src\\com\\briup\\upload\\upload_copy.txt");

        if (file.exists()) {
            throw new RuntimeException("文件已經存在!");
//          System.out.println("该文件已存在,将更改文件名为upload_copy"+(num++)+".txt后开始上传!");   
//          file = new File("src\\com\\briup\\upload\\upload_copy"+(num)+".txt");
        }
        try {
            serverSocket = new ServerSocket(10010);
            socket = serverSocket.accept();
            String ip = socket.getInetAddress().getHostAddress();
            System.out.println(ip + "鏈接成功!");
            bReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            pWriter = new PrintWriter(new FileWriter(file, true));
            String line = null;

            while ((line = bReader.readLine()) != null) {

                pWriter.println(line);
                pWriter.flush();
            }
            // 这个循环如果没有读到结束标记的话是不会停止的

            PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
            printWriter.println("上傳成功呢!!");
            printWriter.println();
            printWriter.flush();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (bWriteSocket != null)
                try {
                    bWriteSocket.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            if (pWriter != null)
                pWriter.close();
            try {
                if (bReader != null)
                    bReader.close();
                if (socket != null)
                    socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Python TCP文件传输系统的实现示例: 服务器端代码(server.py): ```python import socket import os HOST = '127.0.0.1' # 服务器的IP地址 PORT = 8888 # 服务器的端口号 # 创建一个TCP/IP socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定服务器的地址和端口号 server_socket.bind((HOST, PORT)) # 开始监听连接 server_socket.listen(1) print('等待客户端连接...') # 接受连接请求 client_socket, client_address = server_socket.accept() print('客户端已连接,地址为:', client_address) # 接收客户端发送文件名和文件大小 filename = client_socket.recv(1024).decode() filesize = int(client_socket.recv(1024).decode()) # 打印客户端发送的信息 print('收到客户端上传文件请求:', filename, filesize) # 创建一个新的文件来保存上传的文件 with open(filename, 'wb') as f: # 从客户端接收数据并写入文件 while True: data = client_socket.recv(1024) if not data: break f.write(data) # 关闭socket连接 client_socket.close() server_socket.close() print('文件上传完成') ``` 客户端代码(client.py): ```python import socket import os HOST = '127.0.0.1' # 服务器的IP地址 PORT = 8888 # 服务器的端口号 # 创建一个TCP/IP socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 client_socket.connect((HOST, PORT)) # 获取要上传的文件名和文件大小 filename = input('请输入要上传的文件名:') filesize = os.path.getsize(filename) # 发送文件名和文件大小给服务器 client_socket.sendall(filename.encode()) client_socket.sendall(str(filesize).encode()) # 打开要上传的文件发送数据 with open(filename, 'rb') as f: while True: data = f.read(1024) if not data: break client_socket.sendall(data) # 关闭socket连接 client_socket.close() print('文件上传完成') ``` 运行以上代码,先运行服务器端代码,再运行客户端代码,即可实现文件上传功能。注意:文件名需要包含完整的路径信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值