socket传文件

用socket,安卓客户端向pc服务器端传文件。

一开始传出的文件有多出来的字节,后来通过局部修改后没有任何问题了。

安卓客户端代码:

package com.example.androidclient2;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import android.os.Bundle;
import android.app.Activity;

/**
 * 对传文件客户端的测试
 * @author nm 2014-12-10
 */
public class ClientActivity extends Activity {
	private Socket socket;
	private OutputStream streamOut;
	private InputStream streamIn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		socketPhone();
	}

	private void socketPhone() {
		new Thread(){
			@Override
			public void run() {
				super.run();
				try {
					socket = new Socket("192.168.0.90", 10000);
					streamIn = socket.getInputStream();
					streamOut = socket.getOutputStream();
					interaction();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}.start();
	}

	private void interaction() {
		new Thread() {
			@Override
			public void run() {
				super.run();
				try {
					while (true) {
						String path = "/mnt/sdcard/abc.mp3";
						FileInputStream fileIn = new FileInputStream(path);
						
						// 这个循环有限发送
						int a = 0,b = 0;
						while (a != -1) {
							byte[] fileByte = new byte[1024];
							a = (fileIn.read(fileByte, 0, 1024));
							b += a;
							System.out.println("a==================" + a+  " ,b="+b);
							if(a > 0){
								System.out.println("a---------------------------------" + a);
								streamOut.write(fileByte, 0, a);
								streamOut.flush();
							}
						}
						fileIn.close();
						break;
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}.start();
	}
}
pc服务器端的代码如下:

import java.io.FileOutputStream;
import java.io.IOException;  
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;  
import java.net.Socket;  
  
public class MyServer {  
	private static ServerSocket server;
	private static Socket socket;
	private static OutputStream streamOut;
	private static InputStream streamIn;
	
    public static void main(String[] args) throws IOException {
        server = new ServerSocket(10000);
        acceptClient();
    }
    
    private static void acceptClient() throws IOException {
        new Thread(new Runnable() {  
            public void run() { 
            	while (true) {
	                try {
	                	socket = server.accept();  //Socket[addr=/192.168.0.90,port=53418,localport=10000]
	                	streamIn = socket.getInputStream();
	            		streamOut = socket.getOutputStream();
	            		invoke();
	                } catch(Exception ex) {  
	                    ex.printStackTrace();  
	                }
            	}
            }  
        }).start();  
    }

    private static FileOutputStream file;
	private static String savePath = "E:/test/nmsong.mp3";
	protected static void invoke() {
		new Thread(){
			@Override
			public void run() {
				super.run();
				try {
					int index =0;
					file = new FileOutputStream(savePath, false);
					while(true){
						int size = streamIn.available();
						index++;
						//下面先放到文件里面试试能不能成功,结果不能成功。
						byte[] buffer = new byte[1024];
						int buffer1 = streamIn.read(buffer);
						System.out.println("index = "+index + " size=" + size + ", buffer1=" + buffer1);
						file.write(buffer, 0 ,buffer1);//后面的两个参数是必须的,否则字节不足默认bugger的长度,则补0。
					}
				} catch (Exception e) {
					e.printStackTrace();
					return;
				}
			}
		}.start();
	}
}
完。

在Linux虚拟机中文件,可以使用C语言中的socket编程实现。以下是一个简单的例子: 1. 在发送端(虚拟机上): ``` #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/stat.h> #include <fcntl.h> #define PORT 8080 int main(int argc, char const *argv[]) { int sock = 0; struct sockaddr_in serv_addr; char *file_path = "/path/to/file"; // 创建socket if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Socket creation error \n"); return -1; } // 设置服务器地址 serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) { printf("\nInvalid address/ Address not supported \n"); return -1; } // 连接服务器 if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { printf("\nConnection Failed \n"); return -1; } // 打开文件并读取内容 int fd = open(file_path, O_RDONLY); if (fd < 0) { printf("\nFile open error\n"); return -1; } struct stat st; fstat(fd, &st); size_t file_size = st.st_size; char *file_buf = malloc(file_size); read(fd, file_buf, file_size); // 发送文件大小 write(sock, &file_size, sizeof(file_size)); // 发送文件内容 write(sock, file_buf, file_size); // 关闭文件socket close(fd); close(sock); return 0; } ``` 2. 在接收端(本地机器上): ``` #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #define PORT 8080 int main(int argc, char const *argv[]) { int server_fd, new_socket; struct sockaddr_in address; int addrlen = sizeof(address); char buffer[1024] = {0}; // 创建socket if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 绑定端口并监听 address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } // 接收连接 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } // 接收文件大小 size_t file_size; read(new_socket, &file_size, sizeof(file_size)); printf("File size: %zu\n", file_size); // 接收文件内容 char *file_buf = malloc(file_size); read(new_socket, file_buf, file_size); // 将文件写入本地 FILE *fp = fopen("/path/to/destination", "wb"); fwrite(file_buf, 1, file_size, fp); fclose(fp); // 关闭socket close(new_socket); close(server_fd); return 0; } ``` 在这个例子中,我们首先打开要输的文件并读取其内容,然后使用socket连接将文件大小和内容发送到另一端。在接收端,我们先接收文件大小,然后根据大小接收文件内容,并将其写入本地磁盘。请注意,这个例子中使用的是本地回环地址127.0.0.1和端口号8080,您需要根据您的实际情况进行更改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值