package sterning
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
public class ServerTest {
int port = 8821
void start() {
Socket s = null
try {
ServerSocket ss = new ServerSocket(port)
while (true) {
// 选择进行传输的文件
String filePath = "D:\\lib.rar"
File fi = new File(filePath)
System.out.println("文件长度:" + (int) fi.length())
// public Socket accept() throws
// IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。
s = ss.accept()
System.out.println("建立socket链接")
DataInputStream dis = new DataInputStream(new BufferedInputStream(s.getInputStream()))
dis.readByte()
DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)))
DataOutputStream ps = new DataOutputStream(s.getOutputStream())
//将文件名及长度传给客户端。这里要真正适用所有平台,例如中文名的处理,还需要加工,具体可以参见Think In Java 4th里有现成的代码。
ps.writeUTF(fi.getName())
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("文件传输完成")
}
} catch (Exception e) {
e.printStackTrace()
}
}
public static void main(String arg[]) {
new ServerTest().start()
}
}
2.socket的Util辅助类
package sterning
import java.net.*
import java.io.*
public class ClientSocket {
private String ip
private int port
private Socket socket = null
DataOutputStream out = null
DataInputStream getMessageStream = null
public ClientSocket(String ip, int port) {
this.ip = ip
this.port = port
}
/** *//**
* 创建socket连接
*
* @throws Exception
* exception
*/
public void CreateConnection() throws Exception {
try {
socket = new Socket(ip, port)
} catch (Exception e) {
e.printStackTrace()
if (socket != null)
socket.close()
throw e
} finally {
}
}
public void sendMessage(String sendMessage) throws Exception {
try {
out = new DataOutputStream(socket.getOutputStream())
if (sendMessage.equals("Windows")) {
out.writeByte(0x1)
out.flush()
return
}
if (sendMessage.equals("Unix")) {
out.writeByte(0x2)
out.flush()
return
}
if (sendMessage.equals("Linux")) {
out.writeByte(0x3)
out.flush()
} else {
out.writeUTF(sendMessage)
out.flush()
}
} catch (Exception e) {
e.printStackTrace()
if (out != null)
out.close()
throw e
} finally {
}
}
public DataInputStream getMessageStream() throws Exception {
try {
getMessageStream = new DataInputStream(new BufferedInputStream(socket.getInputStream()))
return getMessageStream
} catch (Exception e) {
e.printStackTrace()
if (getMessageStream != null)
getMessageStream.close()
throw e
} finally {
}
}
public void shutDownConnection() {
try {
if (out != null)
out.close()
if (getMessageStream != null)
getMessageStream.close()
if (socket != null)
socket.close()
} catch (Exception e) {
}
}
}
3.客户端
package sterning
import java.io.BufferedOutputStream
import java.io.DataInputStream
import java.io.DataOutputStream
import java.io.FileOutputStream
public class ClientTest {
private ClientSocket cs = null
private String ip = "localhost"// 设置成服务器IP
private int port = 8821
private String sendMessage = "Windwos"
public ClientTest() {
try {
if (createConnection()) {
sendMessage()
getMessage()
}
} catch (Exception ex) {
ex.printStackTrace()
}
}
private boolean createConnection() {
cs = new ClientSocket(ip, port)
try {
cs.CreateConnection()
System.out.print("连接服务器成功!" + "\n")
return true
} catch (Exception e) {
System.out.print("连接服务器失败!" + "\n")
return false
}
}
private void sendMessage() {
if (cs == null)
return
try {
cs.sendMessage(sendMessage)
} catch (Exception e) {
System.out.print("发送消息失败!" + "\n")
}
}
private void getMessage() {
if (cs == null)
return
DataInputStream inputStream = null
try {
inputStream = cs.getMessageStream()
} catch (Exception e) {
System.out.print("接收消息缓存错误\n")
return
}
try {
//本地保存路径,文件名会自动从服务器端继承而来。
String savePath = "E:\\"
int bufferSize = 8192
byte[] buf = new byte[bufferSize]
int passedlen = 0
long len=0
savePath += inputStream.readUTF()
DataOutputStream fileOut = new DataOutputStream(new BufferedOutputStream(new BufferedOutputStream(new FileOutputStream(savePath))))
len = inputStream.readLong()
System.out.println("文件的长度为:" + len + "\n")
System.out.println("开始接收文件!" + "\n")
while (true) {
int read = 0
if (inputStream != null) {
read = inputStream.read(buf)
}
passedlen += read
if (read == -1) {
break
}
//下面进度条本为图形界面的prograssBar做的,这里如果是打文件,可能会重复打印出一些相同的百分比
System.out.println("文件接收了" + (passedlen * 100/ len) + "%\n")
fileOut.write(buf, 0, read)
}
System.out.println("接收完成,文件存为" + savePath + "\n")
fileOut.close()
} catch (Exception e) {
System.out.println("接收消息错误" + "\n")
return
}
}
public static void main(String arg[]) {
new ClientTest()
}
}
客户端代码如下:
import java.io.DataOutputStreamimport java.io.File
import java.io.FileInputStream
import java.io.IOException
import java.net.InetSocketAddress
import java.net.Socket
/**
* 文件发送客户端主程序
* @author admin_Hzw
*
*/
public class BxClient {
/**
* 程序main方法
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
int length = 0
double sumL = 0
byte[] sendBytes = null
Socket socket = null
DataOutputStream dos = null
FileInputStream fis = null
boolean bool = false
try {
File file = new File("D:/天啊.zip") //要传输的文件路径
long l = file.length()
socket = new Socket()
socket.connect(new InetSocketAddress("127.0.0.1", 48123))
dos = new DataOutputStream(socket.getOutputStream())
fis = new FileInputStream(file)
sendBytes = new byte[1024]
while ((length = fis.read(sendBytes, 0, sendBytes.length)) > 0) {
sumL += length
System.out.println("已传输:"+((sumL/l)*100)+"%")
dos.write(sendBytes, 0, length)
dos.flush()
}
//虽然数据类型不同,但JAVA会自动转换成相同数据类型后在做比较
if(sumL==l){
bool = true
}
}catch (Exception e) {
System.out.println("客户端文件传输异常")
bool = false
e.printStackTrace()
} finally{
if (dos != null)
dos.close()
if (fis != null)
fis.close()
if (socket != null)
socket.close()
}
System.out.println(bool?"成功":"失败")
}
}
服务端代码如下:
import java.io.DataInputStreamimport java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.net.ServerSocket
import java.net.Socket
import java.util.Random
import com.boxun.util.GetDate
/**
* 接收文件服务
* @author admin_Hzw
*
*/
public class BxServerSocket {
/**
* 工程main方法
* @param args
*/
public static void main(String[] args) {
try {
final ServerSocket server = new ServerSocket(48123)
Thread th = new Thread(new Runnable() {
public void run() {
while (true) {
try {
System.out.println("开始监听...")
/*
* 如果没有访问它会自动等待
*/
Socket socket = server.accept()
System.out.println("有链接")
receiveFile(socket)
} catch (Exception e) {
System.out.println("服务器异常")
e.printStackTrace()
}
}
}
})
th.run() //启动线程运行
} catch (Exception e) {
e.printStackTrace()
}
}
public void run() {
}
/**
* 接收文件方法
* @param socket
* @throws IOException
*/
public static void receiveFile(Socket socket) throws IOException {
byte[] inputByte = null
int length = 0
DataInputStream dis = null
FileOutputStream fos = null
String filePath = "D:/temp/"+GetDate.getDate()+"SJ"+new Random().nextInt(10000)+".zip"
try {
try {
dis = new DataInputStream(socket.getInputStream())
File f = new File("D:/temp")
if(!f.exists()){
f.mkdir()
}
/*
* 文件存储位置
*/
fos = new FileOutputStream(new File(filePath))
inputByte = new byte[1024]
System.out.println("开始接收数据...")
while ((length = dis.read(inputByte, 0, inputByte.length)) > 0) {
fos.write(inputByte, 0, length)
fos.flush()
}
System.out.println("完成接收:"+filePath)
} finally {
if (fos != null)
fos.close()
if (dis != null)
dis.close()
if (socket != null)
socket.close()
}
} catch (Exception e) {
e.printStackTrace()
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)