Socket编程(一)TCP传输文件

Socket作为应用网络交互的一种方式,可以称作为套接字。应用通常通过套接字来向网络发出请求或者应答请求。下面实现一个Socket基于TCP协议传输文件的交互应用。主要方法都在子线程中实现。

这是Socket服务端,也就是作为接收端。

class ServerThread extends Thread{
        @Override
        public void run() {
            ServerSocket serverSocket=null;
            try {
                //创建一个ServerSocket对象,并在4567端口监听
                serverSocket=new ServerSocket(4567);
                //调用ServerSocket的accept的方法,阻塞接收客户端请求
                Socket socket=serverSocket.accept();
                InputStream inputStream=socket.getInputStream();
                //实例化文件输出流的位置和文件名和位置
                FileOutputStream out = new FileOutputStream(Environment.getExternalStorageDirectory()+"/aa.jpg");
                byte buffer[]=new byte[1024*4];
                int temp=0;
                //从InputStream中读取接收的数据
                while((temp=inputStream.read(buffer))!=-1){
                    //通过输出流将文件生成
                    out.write(buffer,0,temp);
                    out.flush();
                }
                inputStream.close();
                out.close();

            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            super.run();
        }
    }

下面是作为Socket端,也就是发送信息的客户端。

    class ServerThread extends Thread{
        @Override
        public void run() {
            try {
                //创建一个Socket对象,指定服务器端的IP和端口
                Socket socket=new Socket("192.168.31.185",4567);
                //使用InputStream读取内存文件
                InputStream inputStream=new FileInputStream(Environment.getExternalStorageDirectory()+"/Download/aa.jpg");
                OutputStream outputStream=socket.getOutputStream();
                byte buffer[]=new byte[4*1024];
                int temp =0;
                //读取InputStream的数据,写入到OutputStream中
                while ((temp=inputStream.read(buffer))!=-1){
                    outputStream.write(buffer,0,temp);
                    outputStream.flush();
                }
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            super.run();
        }
    }

关于文件操作和Socket操作需要网络权限和文件操作权限,此处提示一下。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET"/>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现文件传输需要使用socket编程中的TCP协议,下面是一个简单的示例代码: 服务端代码: ```python import socket HOST = '127.0.0.1' PORT = 8000 BUFSIZE = 1024 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((HOST, PORT)) server_socket.listen(1) print('Waiting for client connection...') client_socket, addr = server_socket.accept() print('Connected by', addr) filename = 'test.txt' with open(filename, 'rb') as f: data = f.read(BUFSIZE) while data: client_socket.send(data) data = f.read(BUFSIZE) client_socket.close() server_socket.close() ``` 客户端代码: ```python import socket HOST = '127.0.0.1' PORT = 8000 BUFSIZE = 1024 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect((HOST, PORT)) filename = 'test2.txt' with open(filename, 'wb') as f: data = client_socket.recv(BUFSIZE) while data: f.write(data) data = client_socket.recv(BUFSIZE) client_socket.close() ``` 说明: - 服务端先绑定IP和端口,然后等待客户端连接,并接受客户端连接; - 服务端读取文件内容并发送给客户端; - 客户端连接服务端,并接受服务端发送的文件内容并写入到本地文件中。 注意事项: - 文件传输需要使用二进制模式('rb'或'wb'); - 在发送和接收数据时,需要设置缓冲区大小(BUFSIZE); - 如果传输文件比较大,可以分多次传输,每次发送一定大小的数据(如1KB或4KB); - 为了保证数据的完整性,可以在发送时添加校验和或CRC等机制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值