当前位置: 代码迷 >> Web前端 >> Client ,Server基于socket 的图片下传(WEB)
  详细解决方案

Client ,Server基于socket 的图片下传(WEB)

热度:426   发布时间:2012-08-29 08:40:14.0
Client ,Server基于socket 的图片上传(WEB)

?

服务器端:

?

	<servlet>
		<description>
			This is the description of my J2EE component
		</description>
		<display-name>
			This is the display name of my J2EE component
		</display-name>
		<servlet-name>InitServlet</servlet-name>
		<servlet-class>com.dne.pg.servlet.InitServlet</servlet-class>
		<load-on-startup>2</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>InitServlet</servlet-name>
		<url-pattern>/servlet/InitServlet</url-pattern>
	</servlet-mapping>
?

?

?

package com.javaliver.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Locale;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.Globals;

import com.javaliver.file.FileTransServer;

public class InitServlet extends HttpServlet {

	/**
	 * Constructor of the object.
	 */
	public InitServlet() {
		super();
	}

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
	}

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.ENGLISH);
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out
				.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.print("    This is ");
		out.print(this.getClass());
		out.println(", using the GET method");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.ENGLISH);
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out
				.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.print("    This is ");
		out.print(this.getClass());
		out.println(", using the POST method");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

	/**
	 * Initialization of the servlet. <br>
	 *
	 * @throws ServletException if an error occure
	 */
	public void init() throws ServletException {
		// Put your code here
		new Thread(new FileTransServer()).start();
	}

}
?

?

package com.javaliver.file.socket;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import org.apache.log4j.Logger;


public class FileTransServer implements Runnable {
	private int port = 9992;
	private ServerSocket serverSocket = null;
	private boolean isRuning;
	private static final Logger log = Logger.getLogger(FileTransServer.class);
	public FileTransServer() {
	}
	
	public void run(){
		isRuning = true;
		try {
			serverSocket = new ServerSocket(port);
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		while(isRuning){
			try {
				log.info("FileTransServerSocket()*********step1 ;port is "+port);
				Socket socket = serverSocket.accept();
				FileTransServerSocket cs = new FileTransServerSocket();
				cs.setSocket(socket);
				log.info("开始处理线程" + cs.getSocket().getRemoteSocketAddress().toString());
				new Thread(cs).start();
			} catch (Exception e) {
				log.info("FileTransServerSocket()*********step1 ****it is not usual!;");
				e.printStackTrace();
			} finally {
			}
		}
	}
	
	
}

?

package com.javaliver.file.socket;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;

import org.apache.log4j.Logger;

public class FileTransServerSocket implements Runnable {
	private DataOutputStream out = null;
	private Socket socket;
	private DataInputStream getMessageStream = null;
	private static final Logger log = Logger.getLogger(FileTransServerSocket.class);

	public FileTransServerSocket() {}
	
	public void run(){
		try {
			this.handleConnection(this.socket);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	
	private void handleConnection(Socket socketConnection) throws Exception {

		DataInputStream inputStream = null;
		try {
			inputStream = new DataInputStream(new BufferedInputStream(
					socketConnection.getInputStream()));
		} catch (Exception e) {
			e.printStackTrace();
			if (inputStream != null)
				inputStream.close();
			System.out.print("接收消息缓存错误\n");
			throw e;
		}
		try {

			int bufferSize = 8192;
			byte[] buf = new byte[bufferSize];
			int passedlen = 0;
			long len = 0;
			if(inputStream==null){
				System.out.println("没有读取到图片名称");
				return ;
			}
			System.out.println("读取文件名称");
			String passFileName = inputStream.readUTF();
			String savePath = getSavePath() + "\\"+passFileName;
			DataOutputStream fileOut = new DataOutputStream(
					new BufferedOutputStream(new BufferedOutputStream(
							new FileOutputStream(savePath))));
			if(inputStream==null){
				System.out.println("没有读到文件长度");
				return ;
			}
			len = inputStream.readLong();
			log.info("文件的长度为:" + len + "\n");
			log.info("开始接收文件!" + "\n");
			while (true) {
				int read = 0;
				if (inputStream != null) {
					read = inputStream.read(buf);
				}
				passedlen += read;
				if (read == -1) {
					break;
				}
				log.info("文件接收了" + (passedlen * 100 / len) + "%\n");
				fileOut.write(buf, 0, read);
			}
			log.info("接收完成,文件存为" + savePath + "\n");
			if(fileOut!=null){
				fileOut.flush();
				fileOut.close();
			}
			if(inputStream!=null){
				inputStream.close();
			}
			socketConnection.close();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			e.getStackTrace();
			
			log.info("接收消息错误" + "\n"+e.getStackTrace()+e.getMessage());
			return;
		}
	}
	
    private String getSavePath() {
    	PropertyResourceBundle res =(PropertyResourceBundle) ResourceBundle.getBundle("Framework");
		String tomcatPath=System.getProperty("catalina.home");
		tomcatPath=tomcatPath.replace("/", File.separator) +"/webapps";
		String savePath= tomcatPath + res.getString("imagepath");
		savePath = savePath.replace("/", File.separator);
		return savePath;
	}

	public Socket getSocket() {
		return socket;
	}
	public void setSocket(Socket socket) {
		this.socket = socket;
	}
	
}

?

?

1:serverSocket = new ServerSocket(port);

?

当服务器(Tomcat)启动加载的时候InitServlet 创建了一个能监听某些客户机访问的入口

FileTransServer 在9992端口上监听。

?

2:Socket socket = serverSocket.accept();

创建了一个新的套接字,称为socket,这个套接字也是用9992端口

?


客户端的测试类:

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class SocketU {
	// private String ip = "";// 设置成服务器IP
	private String ip = "localhost";
	private int port = 9992;
	private String sendMessage = "C:\\1.gif";// 这个路径你自己读取的照片的位置
	Socket socketConnection = null;
	DataOutputStream sendMsg = null;
	DataInputStream getMsg = null;
	DataInputStream fis = null;

	public static void main(String arg[]) throws Exception {
		SocketU clientTest = new SocketU();
		clientTest.setUpConnection();
		clientTest.sendMessage();
	}

	public void setUpConnection() {
		try {
			socketConnection = new Socket(ip, port);
			sendMsg = new DataOutputStream(socketConnection.getOutputStream());
			getMsg = new DataInputStream(new BufferedInputStream(
					socketConnection.getInputStream()));
		} catch (UnknownHostException e) {
			System.out.println("连接错误: 未知主机 " + sendMessage + ":" + port);
		} catch (IOException e) {
			System.out.println("连接时出错: " + e);
		}
	}

	private void sendMessage() throws Exception {
		try {
			File img = new File(sendMessage);
			if (img.exists()) {
				fis = new DataInputStream(new BufferedInputStream(
						new FileInputStream(img)));
				sendMsg.writeUTF(img.getName());
				sendMsg.flush();
				sendMsg.writeLong((long) img.length());
				sendMsg.flush();
				int bufferSize = 8192;
				byte[] buf = new byte[bufferSize];
				while (true) {
					Thread.sleep(1L);
					int read = 0;
					if (fis != null) {
						read = fis.read(buf);
					}
					if (read == -1) {
						break;
					}
					System.out.println("File Saved-----------------" + read
							+ "%\n");
					sendMsg.write(buf, 0, read);
				}

			}
			if (fis != null) {
				fis.close();
			}
			socketConnection.close();
			sendMsg.flush();
			if (sendMsg != null) {
				sendMsg.close();
			}

			System.out.println("Upload File Over!!!");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
		}
	}
}
?

?

?

?

TCP在客户端的clientSocket和服务器端的socket之间建立了一条直接的虚礼管道,该客户机与服务器可以通过该管道彼此发送字节,并且发送的所有字节将按顺序到达对方。随着socket的建立,该服务器能继续使用serverSocket 监听其它客户机的连接请求。

  相关解决方案