用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

Java Socket基础 设计界面,在服务器端、客服端间传输图片和文件

2014-12-29 作者: java源代码大全举报

[java]代码库

package socket.file;

import java.io.*;
import java.net.*;
import javax.swing.*;

/**
 * 设计界面,在服务器端、客服端间传输图片和文件
 * 
 * @author JH
 * @date 2014-9-27
 */


public class Server {

	private SocketFrame socketFrame;

	private final int port = 5674;
	private Socket socket;

	public Server() {

		try {
			ServerSocket server = new ServerSocket(port);
			socketFrame = new SocketFrame();
			socketFrame.setTitle("Server");
			
			while (true) {

				socket = server.accept();
				System.out.println("Server : new socket");
				socketFrame.setSocket(socket);
				new Thread(Server.this::run).start();

			}

		} catch (IOException e) {
			System.out.println("Error Server : " + e);
		}

	}

	private void run() {
		while (true) {
			socketFrame.receive();
		}
	}

	public static void main(String[] args) {
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			JFrame.setDefaultLookAndFeelDecorated(true);
			JDialog.setDefaultLookAndFeelDecorated(true);
		} catch (ClassNotFoundException | InstantiationException
				| IllegalAccessException | UnsupportedLookAndFeelException e) {
			e.printStackTrace();
		}
		
		new Server();
	}

}






package socket.file;

import java.io.*;
import java.net.*;
import javax.swing.*;
import java.util.StringTokenizer;

public class Client {

	private final int port = 5674;
	private String host = "";

	private SocketFrame socketFrame;

	public Client() {

		try {

			Socket client = new Socket(host, port);

			client.setSoTimeout(100 * 1000);// 最迟响应时间
			socketFrame = new SocketFrame();
			socketFrame.setSocket(client);
			socketFrame.setTitle("Client");
			run();

		} catch (IOException e) {
			System.out.println("Error Server : " + e);
		}

	}

	private void run() {
		while (true) {

			socketFrame.receive();
		}
	}

	private void getHost() {
		while (true) {

			host = JOptionPane
					.showInputDialog("Enter Server IP : eg. 10.110.124.54");

			StringTokenizer token = new StringTokenizer(host, ".");
			try {

				while (token.hasMoreTokens()) {
					Integer.valueOf(token.nextToken());
				}

			} catch (Exception e) {
				JOptionPane.showMessageDialog(null, "Formal Error");
				continue;
			}
			break;
		}
	}

	public static void main(String[] args) {

		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
			JFrame.setDefaultLookAndFeelDecorated(true);
			JDialog.setDefaultLookAndFeelDecorated(true);
		} catch (ClassNotFoundException | InstantiationException
				| IllegalAccessException | UnsupportedLookAndFeelException e) {
			e.printStackTrace();
		}

		new Client();
	}

}






package socket.file;

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.text.BadLocationException;


public class SocketFrame extends JFrame {

	private final int WIDTH = 480;
	private final int HEIGHT = 315;

	private JTextArea textArea;
	private JFileChooser chooser;
	private JButton sendFile;
	private JButton sendMsg;

	private DataOutputStream out;
	private DataInputStream in;

	public SocketFrame() {

		setSize(WIDTH, HEIGHT);

		Dimension dime = getToolkit().getScreenSize();
		setLocation((dime.width - WIDTH) / 2, (dime.height - HEIGHT) / 2);

		createPanel();

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	private void createPanel() {

		Container contentPane = getContentPane();
		JPanel buttonPanel = new JPanel();

		textArea = new JTextArea();
		chooser = new JFileChooser();

		JScrollPane scrollPane = new JScrollPane(textArea);

		sendFile = new JButton("Send File");
		sendFile.addActionListener(e -> sendFile());

		sendMsg = new JButton("Send Msg");
		sendMsg.addActionListener(e -> sendMsg());

		buttonPanel.add(sendFile);
		buttonPanel.add(sendMsg);

		contentPane.add(scrollPane, BorderLayout.CENTER);
		contentPane.add(buttonPanel, BorderLayout.SOUTH);

		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {

			}
		});
	}

	// 发送文件

	private void sendFile() {

		int option = chooser.showOpenDialog(this);
		if (option != JFileChooser.APPROVE_OPTION)
			return;

		File file = chooser.getSelectedFile();

		long length = file.length();

		textArea.append("开始发送文件 : " + file.getName() + "\n");

		try {
			// 发送文件名标记
			out.writeUTF(file.getName());

			// 发送文件长度标记
			out.writeLong(file.length());

			// 开启此文件的输入流
			DataInputStream input = new DataInputStream(new FileInputStream(
					file));
			byte[] bytes = new byte[1024];
			int len = 0;
			int passedLen = 0;

			while ((len = input.read(bytes)) != -1) {
				out.write(bytes, 0, len);
				passedLen += len;

				textArea.append("文件已传送 : " + (passedLen * 100 / length) + "%\n");

				out.flush();

			}
			out.flush();

			input.close();

			textArea.append("发送完成 : " + file.getName() + "\n");
			
			textArea.setCaretPosition(textArea.getLineStartOffset(textArea
					.getLineCount() - 1));

		} catch (IOException | BadLocationException e) {

			System.out.println("From Send() : " + e);
		}

	}

	// 发送消息
	private void sendMsg() {
		String msg = JOptionPane.showInputDialog("Send Message:");
		if (msg.length() == 0)
			return;
		try {
			// 发送消息的标记
			out.writeUTF("Message");
			out.writeUTF(msg);

			out.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// 接收 分为 消息和文件
	public void receive() {

		try {
			// 类型标记
			String InforType = in.readUTF();

			switch (InforType) {
			case "Message":
				String msg = in.readUTF();
				textArea.append(msg + "\n");
				break;
			default:
				// 打开个对话框,获取文件保存路径
				chooser.setSelectedFile(new File(InforType));
				int option = chooser.showSaveDialog(this);

				if (option != JFileChooser.APPROVE_OPTION)
					return;

				String path = chooser.getSelectedFile().getAbsolutePath();

				textArea.append("开始接收文件 : " + InforType + "\n");

				int fileLength = (int) in.readLong();
				byte[] buf = new byte[fileLength];
				StringBuffer BufferString = new StringBuffer();

				// output-开启文件的输出流
				FileOutputStream output = new FileOutputStream(new File(path));

				int len = 0;// 一次成功读到的字节
				int passedLen = 0;// 目前已读到的字节
				while (passedLen < fileLength) {

					len = in.read(buf, passedLen, fileLength - passedLen);
					if (len > 0) {
						passedLen += len;
					} else
						break;

					textArea.append("文件已接收 : " + (passedLen * 100 / fileLength)
							+ "%\n");

					BufferString.append("" + new String(buf, 0, len) + "\n");
				}
				output.write(buf);
				output.flush();

				output.close();
				textArea.append("接收完成,文件存为 : " + path + "\n");

				

				// 如果是文本文件 打印到文本区里
				InforType = InforType.toLowerCase();
				if (InforType.endsWith(".txt") || InforType.endsWith(".html")
						|| InforType.endsWith(".htm")
						|| InforType.endsWith(".java")
						|| InforType.endsWith(".jsp")) {
					textArea.append(BufferString.toString() + "\n");
				}

				// 如果是图片 打开个对话框显示
				if (InforType.endsWith(".png") || InforType.endsWith(".gif")
						|| InforType.endsWith(".jpg")
						|| InforType.endsWith(".bmp")
						|| InforType.endsWith(".jpeg")) {
					new ImageDialog(path);
				}
			}
			chooser.setSelectedFile(new File("."));;

			// 置光标于最后
			textArea.setCaretPosition(textArea.getLineStartOffset(textArea
					.getLineCount() - 1));
			
			setVisible(true);

		} catch (IOException | BadLocationException e) {
			e.printStackTrace();
		}

	}

	public void setSocket(Socket socket) {
		try {
			out = new DataOutputStream(new BufferedOutputStream(
					socket.getOutputStream()));
			in = new DataInputStream(new BufferedInputStream(
					socket.getInputStream()));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}



package socket.file;

import javax.swing.*;

import java.awt.*;
import java.awt.image.BufferedImage;

/**
 * 显示图片
 */

public class ImageDialog extends JDialog {

	private ImageIcon img;
	private int WIDTH = 500;
	private int HEIGHT = 500;

	public ImageDialog(String path) {

		img =new ImageIcon(path);

		scaleImage();
		setTitle(path);

		setVisible(true);
	}

	public void paint(Graphics g) {
		super.paint(g);
		g.drawImage(img.getImage(), 5,30 , WIDTH, HEIGHT, null);
	}

	public void scaleImage() {
		
		int imgWidth = img.getIconWidth();
		int imgHeight = img.getIconHeight();

		if (imgWidth >= imgHeight) {

			HEIGHT = (int) Math.round((imgHeight * WIDTH * 1.0 / imgWidth));

		} else {

			WIDTH = (int) Math.round((imgWidth * HEIGHT * 1.0 / imgHeight));
		}

	
		
		setSize(WIDTH+5, HEIGHT+30);

		System.out.println("scrImg W " + imgWidth + " H " + imgHeight);
		System.out.println("Scale W " + WIDTH + " H " + HEIGHT);

		/*
		 * JLabel label = new JLabel(); JPanel panel = (JPanel)
		 * getContentPane(); panel.setOpaque(false);
		 * 
		 * label.setBounds(0, 0, WIDTH, HEIGHT);
		 * 
		 * getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));
		 */
	}
}




网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...