⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socketserver.java

📁 利用java语言使用Socket实现文件的传输功能。
💻 JAVA
字号:
//http://hi.baidu.com/51project/blog/item/397f508b3a0a8716c8fc7ae9.html
package com.lcj.folder.files;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class SocketServer {
	int port = 8821;

	void start() {
		Socket s = null;
		try {
			ServerSocket ss = new ServerSocket(port);
			while (true) {

				String basedir = null;
				ArrayList fileArrayList = null;
				String filefullpathlist[] = null;
				while (true) {
					//IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。
					s = ss.accept();
					System.out.println("建立socket链接");
					DataInputStream dis = new DataInputStream(
							new BufferedInputStream(s.getInputStream()));

					// 选择进行传输的文件

					basedir = dis.readUTF();
					System.out.println("basedir=" + basedir);

					GetFileFullPathList getfilefullpathlist = new GetFileFullPathList();
					fileArrayList = new ArrayList();
					getfilefullpathlist.GetFullPathName(basedir, fileArrayList);

					filefullpathlist = new String[fileArrayList.size()];
					DataOutputStream before_ps = new DataOutputStream(s
							.getOutputStream());
					before_ps.writeInt(fileArrayList.size());
					System.out.println(fileArrayList.size());
					before_ps.flush();
					String strCommand = dis.readUTF();
					if (strCommand.equals("close")) {
						s.close();
						break;
					}
				}

				for (int i = 0; i < fileArrayList.size(); i++) {
					s = ss.accept();
					System.out.println("建立socket链接" + i);
					filefullpathlist[i] = (String) fileArrayList.get(i);
					System.out.println(filefullpathlist[i]);
					File fi = new File(filefullpathlist[i]);

					System.out.println("文件长度:" + (int) fi.length());
					DataInputStream fis = new DataInputStream(
							new BufferedInputStream(new FileInputStream(fi)));

					//DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filefullpathlist[i])));
					DataOutputStream ps = new DataOutputStream(s
							.getOutputStream());
					//将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 4th里有现成的代码。

					ps.writeUTF(StringUtils.diffString(filefullpathlist[i],
							basedir));
					ps.flush();
					ps.writeLong((long) fi.length());
					ps.flush();
					int bufferSize = 8192;
					byte[] buf = new byte[bufferSize];

					while (true) {
						int read = 0;
						if (fis != null) {
							read = fis.read(buf);
						}

						if (read == -1) {
							break;
						}
						ps.write(buf, 0, read);
					}
					ps.flush();
					// 注意关闭socket链接哦,不然客户端会等待server的数据过来,
					// 直到socket超时,导致数据不完整。                
					fis.close();
					s.close();
					System.out.println(filefullpathlist[i] + "文件传输完成");
				}

			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String arg[]) {
		new SocketServer().start();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -