用java实现一个采用用户自定义协议的文件传输服务器FileServer。当FileClient发送请求“GET xxx.xxx”时,FileServer就把xxx.xxx文件发送给FileClient;当FileClient发送请求”PUT xxx.xxx“时,FileServer就把文件xxx.xxx保存在服务端。
FileServer.java
package learn;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class FileServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket();
serverSocket.setReuseAddress(true);
serverSocket.bind(new InetSocketAddress("localhost", 8346));
while (serverSocket.isBound() && !serverSocket.isClosed()) {
new Thread(new Handle(serverSocket.accept())).start();
}
}
}
class Handle implements Runnable {
private Socket socket;
public Handle(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
boolean isRead = false, isSave = false;
String fileName;
{
InputStream in = socket.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream();
int p;
while ((p = in.read()) != -1) {
if ((p == '\r' && (p = in.read()) == '\n')) {
break;
}
out.write(p);
}
{
String str = new String(out.toByteArray());
System.out.println(str);
String[] s = str.split(" ");
if (s[0].equals("GET")) {
isRead = true;
} else if (s[0].equals("PUT")) {
}
fileName = s[1];
}
}
if (isRead) {
InputStream in = new FileInputStream(new File("E:/" + fileName));
OutputStream out = socket.getOutputStream();
int p;
while ((p = in.read()) != -1) {
out.write(p);
}
} else if (isSave) {
OutputStream out = new FileOutputStream(new File("E:/" + fileName));
InputStream in = socket.getInputStream();
int p;
while ((p = in.read()) != -1) {
if ((p == '\r' && (p = in.read()) == '\n')) {
break;
}
out.write(p);
}
}
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
FileClient.java
package learn;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class FileClient {
public static void main(String[] args) throws UnknownHostException, IOException {
// 写入测试
{
Socket socket = new Socket("localhost", 8346);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("PUT a.txt\r\n".getBytes());
outputStream.write("今天心情不错!".getBytes());
socket.close();
}
// 读取测试
{
Socket socket = new Socket("localhost", 8346);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("GET a.txt\r\n".getBytes());
InputStream inputStream = socket.getInputStream();
outputStream = new ByteArrayOutputStream();
int p;
while ((p = inputStream.read()) != -1) {
outputStream.write(p);
}
System.out.println(new String(((ByteArrayOutputStream) outputStream).toByteArray()));
socket.close();
}
}
}