日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

supersocket缓冲区_使用Socket从Client传输文件到Server对文件缓冲区大小有限制么?...

發(fā)布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 supersocket缓冲区_使用Socket从Client传输文件到Server对文件缓冲区大小有限制么?... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Client端代碼:

public class Client implements Runnable {

private String ip;// 連接IP

private int port;// 連接端口

private String filePath;// 源文件路徑

public Client(String ip, int port, String filePath) {

super();

this.ip = ip;

this.port = port;

this.filePath = filePath;

}

@Override

public void run() {

try {

long id = Thread.currentThread().getId();

System.out.println("進程" + id + "上傳開始!");

Socket s = new Socket(InetAddress.getByName(ip), port);

FileInputStream fis = new FileInputStream(filePath);

BufferedInputStream bis = new BufferedInputStream(fis);

DataInputStream dis = new DataInputStream(s.getInputStream());

DataOutputStream dos = new DataOutputStream(s.getOutputStream());

int bufferSize = 1024;

byte[] buffer = new byte[bufferSize];

long size = new File(filePath).length();

dos.writeUTF(MD5.getMD5(filePath));

dos.writeLong(size);

dos.writeUTF(new File(filePath).getName());

int i = 0;

int j=0;

while ((i = fis.read(buffer)) != -1) {

dos.write(buffer, 0, i);

dos.flush();

System.out.println(j++);

// Thread.sleep(2000);

}

System.out.println("進程" + id + dis.readUTF());

dis.close();

dos.close();

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

}

}

Server端代碼:

public class Server implements Runnable {

private ServerSocket ss;

private String path;

public Server(ServerSocket ss, String path) {

super();

this.ss = ss;

this.path = path;

}

@Override

public void run() {

while (true) {

try {

Socket s = ss.accept();

DataInputStream dis = new DataInputStream(s.getInputStream());

DataOutputStream dos = new DataOutputStream(s.getOutputStream());

int bufferSize = 1024;

byte[] buffer = new byte[bufferSize];

String md5 = dis.readUTF();

System.out.println("MD5:" + md5);

long size = dis.readLong();

System.out.println("文件總大小:" + size);

String fileName = new SimpleDateFormat("yyyyMMddHmsS")

.format(new Date())

+ (int) (1000 * Math.random())

+ dis.readUTF();

System.out.println("文件名:" + fileName);

FileOutputStream fos = new FileOutputStream(path + "/"

+ fileName);

BufferedOutputStream bos = new BufferedOutputStream(fos);

while (size > bufferSize) {

dis.read(buffer);

fos.write(buffer);

size -= bufferSize;

// Thread.sleep(2000);

}

fos.write(buffer, 0, dis.read(buffer));

if (MD5.getMD5(path + "/" + fileName).equals(md5)) {

dos.writeUTF("MD5驗證正確,上傳成功!");

} else {

dos.writeUTF("MD5驗證錯誤,上傳失敗!");

}

dis.close();

dos.close();

} catch (IOException e) {

e.printStackTrace();

} catch (Exception e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

try {

ServerSocket ss = new ServerSocket(2011);

String path = "upload";

new Thread(new Server(ss, path)).start();

} catch (IOException e) {

e.printStackTrace();

}

}

}

疑點如下:

1.當(dāng)Client的bufferSize小于Server的bufferSize時拋出java.net.SocketException: Software caused connection abort: socket write error,是不是要考慮Client和Server的處理速度問題?就是說Server讀取速度快于Client的寫入速度時候會出問題?可是這個異常是Client報的啊。

2.當(dāng)Client端sleep(2000)時候Server端會等待這個可以理解,而當(dāng)Server端sleep(2000)時候Client端也會等待,為何呢?這個不能理解。另外既然Server端會等待Client端的write,是不是可以理解為兩端的bufferSize隨便設(shè)置都可以?可運行結(jié)果表明我的理解是錯誤的。當(dāng)Client端的bufferSize是Server端的整數(shù)倍時候才能傳輸成功。

求解惑,或許是我的程序本身有問題?

總結(jié)

以上是生活随笔為你收集整理的supersocket缓冲区_使用Socket从Client传输文件到Server对文件缓冲区大小有限制么?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。