Ê×Ò³ Ê«´Ê ×Öµä °å±¨ ¾ä×Ó ÃûÑÔ ÓÑ´ð ÀøÖ¾ ѧУ ÍøÕ¾µØͼ
µ±Ç°Î»ÖÃ: Ê×Ò³ > ½Ì³ÌƵµÀ > JAVA > JavaÏà¹Ø >

java socket ÿСʱͨѶһ´Î

2013-04-09 
java socket ÿСʱͨÐÅÒ»´Î³õÀ´Õ§µ½¡£¸÷λ´óÉñÃÇ°ï°ïæ¡£²»Ê¤¸Ð¼¤£¡ÏÖÓÐÒ»ÏîÄ¿£¬ÐèÒªÔÚsocketͨÐÅʱ£¬serverÿ

java socket ÿСʱͨÐÅÒ»´Î
³õÀ´Õ§µ½¡£¸÷λ´óÉñÃÇ°ï°ïæ¡£²»Ê¤¸Ð¼¤£¡

ÏÖÓÐÒ»ÏîÄ¿£¬ÐèÒªÔÚsocketͨÐÅʱ£¬serverÿСʱ·¢ËÍÒ»¸öÎļþ£¬clientÿСʱ½ÓÊÕÒ»¸öÎļþ£¬¸ÃÔõô×ö£¬Çó½â¡£ÄÜдµãα´úÂë¸üºÃÁË¡£
[½â¾ö°ì·¨]
»ù±¾Ë¼ÏëÊÇ£¬Ã¿Ò»¸öСʱ£¬¿Í»§¶ËÈ¥Á¬½Ó·þÎñÆ÷Ò»´Î£¬·þÎñÆ÷Ö»Òª½ÓÊÕµ½Á¬½Ó£¬¾ÍÍù¿Í»§¶Ë·¢ÎļþÊý¾Ý£¬¿Í»§¶Ë½ÓÊÕÍê³Éºó£¬¶Ï¿ªÁ¬½Ó£¬µÈÒ»¸öСʱºóÔÙÈ¥Á¬½Ó£¬Èç¹û·´¸´¡£¡£¡£ µ«ÔÚÕâÖÖÇé¿öÏ£¬Èç¹ûÒª±£Ö¤Ò»Ð¡Ê±£¨Æä´ÎûÓоø¶ÔµÄ±£Ö¤£©´«ÊäÒ»´ÎÎļþ£¬ÐèÒªÔÚ¿Í»§¶Ë¿ØÖƺÃ
[½â¾ö°ì·¨]
¹À¼ÆÂ¥ÉϽ²µÄ¸úû½²Ò»Ñù£¬Ëû¿ÉÒÔÐèÒªSocketͨÐÅÔ´Â룬ºÙ£¬SocketÈç¹û²»Ì«»á£¬¾ÍÓÃmina¿ò¼Ü°É£¬±ðÂñÌ«¶àµÄµØÀס£
[½â¾ö°ì·¨]
Ò²²»Çå³þÄãΪʲôҪÓÃsocket£¬Èç¹ûÊÇΪÁË»ñÈ¡Îļþ¿ÉÒÔÓÃFtpÏÂÔØ£¬¶¨Ê±Æ÷¿ÉÒÔÓãºtimer.schedule£¬
µ±È»¸ù¾Ý¾ßÌåÇé¿ö»¹¿ÉÒÔÓÃspringµÄquartz£¬Ö»ÐèÅäÖþÍÐС£²¿·Ösocket´úÂ룺

public class FtpClient {
private ClientView clientView;
/**
 * Á½¸öSocket·Ö±ðÓÃÀ´´«ÊäÎļþºÍ¿ØÖÆÐÅÏ¢£¬ÀàËÆÓÚFtpµÄTcp 20¡¢21¡£ 20ÓÃÀ´´«ÊäÎļþ£¬21ÓÃÀ´´«Êä¿ØÖÆÐÅÏ¢¡£
 * */
private Socket fileSocket, commandSocket;
// ÀûÓÃdis»ñÈ¡µ±Ç°Á¬½ÓµÄÊäÈëÁ÷£¬²¢ÀûÓô¦ÀíÁ÷½øÐзâ×°¡£
private DataInputStream dis;
// ÀûÓÃdos»ñÈ¡µ±Ç°Á¬½ÓµÄÊä³öÁ÷£¬²¢ÀûÓô¦ÀíÁ÷½øÐзâ×°¡£
private DataOutputStream dos;
// Ñ¡È¡Ä¬ÈÏ·¾¶±£´æÎļþ
private String fileDir = "c:/";

private boolean flag = true;

public FtpClient() {
super();
}

public FtpClient(ClientView clientView) {
super();
this.clientView = clientView;
}

// ½ÓÊÕÎļþ
public void receiveFile(Socket s, String str) throws Exception {
fileSocket = s;
dis = new DataInputStream(fileSocket.getInputStream());
String existFile = dis.readUTF();
clientView.getJta().append(existFile);
// Èç¹ûÎļþ²»´æÔÚ£¬Ôò²»ÓýÓÊÜÎļþ
if (existFile.startsWith("404 File does not exist"))
;
// Èç¹ûÎļþ´æÔÚ£¬Ôò½ÓÊÜÎļþ
else {
clientView.getJta().append("·¢ËÍÎļþÃû³É¹¦\n");
// ¹ØÁª±£´æÎļþ¼Ð
File f = new File(fileDir);// µ±Ç°¸ùĿ¼
File file = new File(f, "Downloads" + File.separator + str); // ±£´æµ½µ±Ç°Ä¿Â¼µÃDownloadsÎļþÀïÃæ
// ´«ÊäÎļþÇ°ÖØй¹ÔìSocket
fileSocket = new Socket(clientView.getIPtf().getText(), 5432);
// ½«Îļþ·â×°µ½Êä³öÁ÷ÖÐ
BufferedOutputStream buff = new BufferedOutputStream(
new FileOutputStream(file));
// »ñÈ¡µ±Ç°Á¬½ÓµÄÊäÈëÁ÷£¬²¢ÀûÓô¦ÀíÁ÷½øÐзâ×°¡£
dis = new DataInputStream(fileSocket.getInputStream());
byte[] line = new byte[102400];// Ã¿´Î·¢Ë͵Ŀé´ò´óС
clientView.getJta().append("¿ªÊ¼½ÓÊÕÎļþ\n");
clientView.getJta().append("Îļþ´«ËÍÖÐ....\n");
int mount;
while ((mount = dis.read(line)) != -1) {
buff.write(line, 0, mount);
buff.flush();// Ë¢ÐÂ
Thread.sleep(50);// ÉèÖÃÒ»¸öµÈ´ýʱ¼ä£¬ÓÐÀûÓÚ½ÓÊÕÎļþ
}
clientView.getJta().append("finished\n");
buff.close();
}
fileSocket.close();
}

// ½¨Á¢Á¬½Ó
public void TestStart() {
clientView.getJta().append("Çë·¢ËÍÃüÁî: \n");
}

public void getCommand(String str) {
try {
// ÉèÖÃflag=falseÏ൱ÓÚ³ÌÐòÔÝÍ£
while (flag) {
commandSocket = new Socket(clientView.getIPtf().getText(),
Integer.parseInt(clientView.getJtf().getText()));
// ÀûÓÃdos»ñÈ¡µ±Ç°Á¬½ÓµÄÊä³öÁ÷£¬²¢ÀûÓô¦ÀíÁ÷½øÐзâ×°¡£
dos = new DataOutputStream(commandSocket.getOutputStream());
dos.writeUTF(str);
// ÀûÓÃdis»ñÈ¡µ±Ç°Á¬½ÓµÄÊäÈëÁ÷£¬²¢ÀûÓô¦ÀíÁ÷½øÐзâ×°¡£


dis = new DataInputStream(commandSocket.getInputStream());
//dirÃüÁî
if ("dir".equals(str))
printAllFile(dis);
//get<fileName>ÃüÁî
else if (str.startsWith("get"))
receiveFile(commandSocket, str.substring(str.indexOf(' '))
.trim());
//exitÃüÁî
else if ("exit".equals(str)) {
commandSocket.close();
System.exit(0);
}
//´íÎóµÄÃüÁî
else {
clientView.getJta().append(dis.readUTF());
}
flag = false;
clientView.getJta().append("Çë·¢ËÍÃüÁî: \n");
}
} catch (Exception e) {
e.printStackTrace();
}
}

// ´òÓ¡ËùÓÐÎļþÁбí
public void printAllFile(DataInputStream dis) throws IOException {
//´òÓ¡³ö200 OK
clientView.getJta().append(dis.readUTF());
//µÃµ½Îļþ×ÜÊý
int line = Integer.parseInt(dis.readUTF());
for (int i = 0; i < line; i++) {
try {
clientView.getJta().append(dis.readUTF());
} catch (IOException e) {
e.printStackTrace();
}
}
}

public boolean isFlag() {
return flag;
}

public void setFlag(boolean flag) {
this.flag = flag;
}

}


//ÏÖ¿É·¢ËÍdir¡¢get <filename>¡¢exitÃüÁî
public class FtpServer extends Thread {
private ServerView serverView;
/**
 * Á½¸öServerSocket·Ö±ðÓÃÀ´´«ÊäÎļþºÍ¿ØÖÆÐÅÏ¢£¬ÀàËÆÓÚFtpµÄTcp 20¡¢21¡£ 20ÓÃÀ´´«ÊäÎļþ£¬21ÓÃÀ´´«Êä¿ØÖÆÐÅÏ¢¡£
 * */
private ServerSocket commandServer, fileServer;
private Socket s;
// ÀûÓÃdis»ñÈ¡µ±Ç°Á¬½ÓµÄÊäÈëÁ÷£¬²¢ÀûÓô¦ÀíÁ÷½øÐзâ×°¡£
private DataInputStream dis;
// ÀûÓÃdos»ñÈ¡µ±Ç°Á¬½ÓµÄÊä³öÁ÷£¬²¢ÀûÓô¦ÀíÁ÷½øÐзâ×°¡£
private DataOutputStream dos;
// Ñ¡È¡Ä¬ÈÏ·¾¶
private String fileDir = "c:/";

public FtpServer() {
super();
}

public FtpServer(ServerView serverView) {
super();
this.serverView = serverView;
}

// ·¢ËÍÎļþ
public void sendFile(String str) throws Exception {
try {
// ÈôΪ·¢ËÍÎļþ£¬ÔòÊ×ÏÈ»ñÈ¡ÎļþÃû¡£
String filename = str.substring(str.indexOf(' ')).trim();
serverView.getJta().append("½ÓÊÕÎļþÃû" + filename + "³É¹¦\n");
// ´´½¨¶Ë¿Ú5432´«ÊäÎļþ
fileServer = new ServerSocket(5432);
//·â×°Îļþ
File path = new File(fileDir);// µ±Ç°¸ùĿ¼
File file = new File(path, filename);// ´´½¨¸ÃÎļþ¶ÔÏó
//ÅжÏÎļþÊÇ·ñ´æÔÚ
if (!file.exists())
dos.writeUTF("404 File does not exist\n");
else {
dos.writeUTF("200 OK Îļþ³¤¶È:" + file.length() + "\n");
s = fileServer.accept();
serverView.getJta().append("½«Îļþ¶Áµ½»º³åÁ÷ÖÐ\n");
// ½«Îļþ·â×°µ½ÊäÈëÁ÷ÖÐ
BufferedInputStream buffile = new BufferedInputStream(
new FileInputStream(file));
byte[] buf = new byte[102400];// Ã¿´Î·¢Ë͵Ŀé´ò´óС
int mount;
 //»ñÈ¡µ±Ç°Á¬½ÓµÄÊä³öÁ÷£¬²¢ÀûÓô¦ÀíÁ÷½øÐзâ×°¡£
dos = new DataOutputStream(s.getOutputStream());
serverView.getJta().append("¿ªÊ¼´«ËÍÎļþ\n");
while ((mount = buffile.read(buf)) != -1) {// ´«ËÍÎļþ£¬½«ÎļþÄÚÈÝÒÔ×Ö½ÚÐÎʽ±£´æµ½bufÖÐÔÙ·¢ËÍ
dos.write(buf, 0, mount);
Thread.sleep(50);// ÉèÖÃÒ»¸öµÈ´ýʱ¼ä£¬ÓÐÀûÓÚ·¢ËÍÎļþÎļþ


}
serverView.getJta().append("Îļþ´«ËÍÍê±Ï\n");
s.close();// ¹Ø±ÕÇåÀí¹¤×÷
buffile.close();
}
fileServer.close();
} catch (Exception e) {
e.printStackTrace();
}
}

public void run() {
try {
commandServer = new ServerSocket(4321);// 4321¶Ë¿ÚÓÃÀ´½Ó½ÓÊÕÃüÁî
serverView.getJta().append("Listen at 4321 port\n");
while (true) {
s = commandServer.accept();// ¼àÌý
// ÀûÓÃdis»ñÈ¡µ±Ç°Á¬½ÓµÄÊäÈëÁ÷£¬²¢ÀûÓô¦ÀíÁ÷½øÐзâ×°¡£
dis = new DataInputStream(s.getInputStream());
// ÀûÓÃdos»ñÈ¡µ±Ç°Á¬½ÓµÄÊä³öÁ÷£¬²¢ÀûÓô¦ÀíÁ÷½øÐзâ×°¡£
dos = new DataOutputStream(s.getOutputStream());
byte[] buf = new byte[100];
int len = dis.read(buf);
String str = new String(buf, 0, len).trim();
serverView.getJta().append("½ÓÊÕ" + str + "ÃüÁî³É¹¦\n");
//dirÃüÁî
if ("dir".equals(str)) {
dos.writeUTF("200 OK\n");
transAllFile(s);
}
//get<fileName>ÃüÁî
else if (str.startsWith("get")) {
sendFile(str);

//exitÃüÁî
else if ("exit".equals(str)) {
s.close();// ´¦ÀíExitÃüÁî

//´íÎóµÄÃüÁî
else {
dos.writeUTF("400 Command error\n");
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

// ´¦ÀíDirÃüÁî
public void transAllFile(Socket s1) throws IOException {
File localfile = new File(fileDir);
File[] filelist = localfile.listFiles();
dos = new DataOutputStream(s1.getOutputStream());// Êä³öÎļþÁбí
//´«ËÍÎļþ×ÜÊý
dos.writeUTF(filelist.length + "");
dos.writeUTF("-------------------File    List--------------------\n");
for (int i = 0; i < filelist.length; i++) {
dos.writeUTF("ÎļþÃû£º" + filelist[i].getName() + "    Îļþ³¤¶È£º"
+ filelist[i].length() + "×Ö½Ú\n");
}
}

}


Ï£ÍûÓÐËù°ïÖú

ÈȵãÅÅÐÐ