GUI界面,客户端向服务端传送文件

1.客户端代码:

package com.socket;

import java.awt.EventQueue;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.*;
import java.net.Socket;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

public class TCPClientSocket extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public JPanel contentPane;
	public JTextField textField;
	public JTextField textField_1;

	// public JTextField textField_2;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TCPClientSocket frame = new TCPClientSocket();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public TCPClientSocket() {
		setTitle("客户端文件传输");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 351, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);

		JLabel lblNewLabel = new JLabel("用户名");

		JLabel lblNewLabel_1 = new JLabel("文件路径");

		textField = new JTextField();
		textField.setColumns(10);

		textField_1 = new JTextField();
		textField_1.setColumns(10);

		JButton btnNewButton = new JButton("提交");
		GroupLayout gl_contentPane = new GroupLayout(contentPane);

		gl_contentPane
				.setHorizontalGroup(gl_contentPane
						.createParallelGroup(Alignment.LEADING)
						.addGroup(
								gl_contentPane
										.createSequentialGroup()
										.addGroup(
												gl_contentPane
														.createParallelGroup(
																Alignment.LEADING)
														.addGroup(
																gl_contentPane
																		.createSequentialGroup()
																		.addGap(44)
																		.addGroup(
																				gl_contentPane
																						.createParallelGroup(
																								Alignment.LEADING)
																						.addComponent(
																								lblNewLabel_1)
																						.addComponent(
																								lblNewLabel))
																		.addGap(18)
																		.addGroup(
																				gl_contentPane
																						.createParallelGroup(
																								Alignment.LEADING,
																								false)
																						.addComponent(
																								textField_1,
																								GroupLayout.DEFAULT_SIZE,
																								143,
																								Short.MAX_VALUE)
																						.addComponent(
																								textField,
																								GroupLayout.DEFAULT_SIZE,
																								143,
																								Short.MAX_VALUE)))

														.addGroup(
																gl_contentPane
																		.createSequentialGroup()
																		.addGap(103)
																		.addComponent(
																				btnNewButton)))
										.addContainerGap(159, Short.MAX_VALUE)));

		gl_contentPane
				.setVerticalGroup(gl_contentPane
						.createParallelGroup(Alignment.LEADING)
						.addGroup(
								gl_contentPane
										.createSequentialGroup()
										.addGap(25)
										.addGroup(
												gl_contentPane
														.createParallelGroup(
																Alignment.BASELINE)
														.addComponent(
																lblNewLabel)
														.addComponent(
																textField,
																GroupLayout.PREFERRED_SIZE,
																GroupLayout.DEFAULT_SIZE,
																GroupLayout.PREFERRED_SIZE))
										.addGap(38)
										.addGroup(
												gl_contentPane
														.createParallelGroup(
																Alignment.BASELINE)
														.addComponent(
																lblNewLabel_1)
														.addComponent(
																textField_1,
																GroupLayout.PREFERRED_SIZE,
																GroupLayout.DEFAULT_SIZE,
																GroupLayout.PREFERRED_SIZE))
										.addGap(39).addComponent(btnNewButton)
										.addContainerGap(105, Short.MAX_VALUE)));

		contentPane.setLayout(gl_contentPane);

		// String filePath = textField_1.getText();

		try {
			Socket socket = new Socket(TCPServerSocket.IP, TCPServerSocket.PORT);
			if (true) {
				btnNewButton.addMouseListener(new MouseListener() {
					@Override
					public void mouseReleased(MouseEvent arg0) {

					}

					@Override
					public void mousePressed(MouseEvent arg0) {

					}

					@Override
					public void mouseExited(MouseEvent arg0) {

					}

					@Override
					public void mouseEntered(MouseEvent arg0) {

					}

					@Override
					public void mouseClicked(MouseEvent arg0) {

						String filePath = textField_1.getText().toString();
						String userName = textField.getText().toString();

						sendFile(socket, filePath, userName);

					}
				});

				/*
				 * pp.btnNewButton.addActionListener(new ActionListener() {
				 * 
				 * public void actionPerformed(ActionEvent e) { sendFile(socket,
				 * filePath); } });
				 */
			}

		} catch (Exception e) {
			// e.printStackTrace();
		}
	}

	private static void sendFile(Socket socket, String filePath, String userName) {
		System.out.println(filePath);

		DataOutputStream dos = null;
		BufferedInputStream bis = null;
		// What can BufferedInputStream help ?
		// FileInputStream fis = null;
		byte[] bytes = new byte[1024];

		try {
			try {
				if (socket.isClosed()) {
					socket = new Socket(TCPServerSocket.IP,
							TCPServerSocket.PORT);
				}
				bis = new BufferedInputStream(new FileInputStream(new File(
						filePath)));
				dos = new DataOutputStream(new BufferedOutputStream(
						socket.getOutputStream()));

				dos.writeUTF(getFileName(filePath) + "##" + userName);

				int length = 0;
				while ((length = bis.read(bytes, 0, bytes.length)) > 0) {
					dos.write(bytes, 0, length);
					dos.flush();
				}

			} catch (IOException e) {
				e.printStackTrace();
			} finally {

				if (bis != null)
					bis.close();
				if (dos != null)
					dos.close();
				if (socket != null)
					socket.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private static String getFileName(String filePath) {
		String[] parts = filePath.split("/");
		return parts[parts.length - 1];
	}
}


2.服务器端代码:

package com.socket;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.ServerSocket;

public class TCPServerSocket {

	public static final int PORT = 5646; // port
	public static final String IP = "127.0.0.1"; // my ip address

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		TCPClientSocket frame = null;

		/*
		 * boolean File f = new File("d:"+File.separator+"receive") ;//
		 * 实例化File类的对象 f.mkdir();
		 */

		Socket socket = null;
		try {
			frame = new TCPClientSocket();
			// 创建服务器端
			ServerSocket mServerSocket = new ServerSocket(PORT);
			System.out.println("Server is already created now ! Waiting for client to connect ...");

			// 客户端连接服务器端
			socket = mServerSocket.accept();
			System.out.println("One client connected to this server successfully !");

			// 连接成功,开始传输文件
			receiveFile(socket);

		} catch (Exception e) {
			// e.printStackTrace();
		}
	}

	private static void receiveFile(Socket socket) {

		FileOutputStream fos = null;
		DataInputStream dis = null;

		// buffer起缓冲作用,一次读取或写入多个字节的数据
		byte[] buffer = new byte[1024];

		try {
			try {
				// 这里使用DataInputStream,可以调用它的readUTF方法来读取要传输的文件名,客户端使用writeUTF方法将文件名先传输过来
				dis = new DataInputStream(socket.getInputStream());

				// 首先读取文件名
				String oldFileName = dis.readUTF();
				int start = oldFileName.lastIndexOf("\\");
				int end = oldFileName.lastIndexOf("##");
				String fileName = oldFileName.substring(start + 1, end);
				String userName = oldFileName.substring(end + 2);
				System.out.println(fileName);
				System.out.println(userName);

				// 文件路径
				String fileDir = "E:/receive/";

				File userDir = new File(fileDir + userName);
				if (!userDir.exists()) {
					userDir.mkdirs();
				}

				String filePath = fileDir + userName + "/" + fileName;

				// 利用FileOutputStream来操作文件输出流
				fos = new FileOutputStream(new File(filePath));
				int length = 0;

				/*
				 * length = dis.read(buffer, 0, buffer.length)
				 * 一次读入1024个字节的内容到buffer中,length代表实际读入的字节数 fos.write(buffer, 0,
				 * length) 一次从buffer中的length个字节的内容写入到文件中
				 * (注:文件大小超过1024B时,length一般为1024,最后一次读取可能小于1024)
				 */
				while ((length = dis.read(buffer, 0, buffer.length)) > 0) {
					fos.write(buffer, 0, length);
					fos.flush();
				}

			} finally {
				// 使用完毕后,应关闭输入、输出流和socket
				if (dis != null)
					dis.close();
				if (fos != null)
					fos.close();
				if (socket != null)
					socket.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}


源码下载地址:

http://download.csdn.net/detail/hoho_12/9580101



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现文件传输需要用到网络编程和界面设计,可以使用 Python 的 Tkinter 库来实现界面,使用 socket 库来实现网络通信。 以下是一个简单的客户端服务端文件传输程序的示例代码,其中客户端服务端均有界面: 服务端: ```python import socket import threading import os from tkinter import * class ServerGUI: def __init__(self): self.root = Tk() self.root.title("文件传输服务端") self.root.geometry("300x200") self.label1 = Label(self.root, text="服务端状态:未启动") self.label1.pack() self.button1 = Button(self.root, text="启动服务", command=self.start_server) self.button1.pack() self.root.protocol("WM_DELETE_WINDOW", self.on_closing) def start_server(self): self.button1.config(state=DISABLED) self.label1.config(text="服务端状态:已启动") self.thread = threading.Thread(target=self.run_server) self.thread.start() def run_server(self): self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server_socket.bind(('127.0.0.1', 8000)) self.server_socket.listen(5) while True: client_socket, client_address = self.server_socket.accept() t = threading.Thread(target=self.handle_client, args=(client_socket, client_address)) t.start() def handle_client(self, client_socket, client_address): filename = client_socket.recv(1024).decode() filesize = int(client_socket.recv(1024).decode()) received = 0 with open(filename, 'wb') as f: while received < filesize: data = client_socket.recv(1024) f.write(data) received += len(data) client_socket.close() def on_closing(self): if hasattr(self, 'server_socket'): self.server_socket.close() self.root.destroy() if __name__ == '__main__': gui = ServerGUI() gui.root.mainloop() ``` 客户端: ```python import socket import os from tkinter import * class ClientGUI: def __init__(self): self.root = Tk() self.root.title("文件传输客户端") self.root.geometry("300x200") self.label1 = Label(self.root, text="客户端状态:未连接") self.label1.pack() self.label2 = Label(self.root, text="文件名:") self.label2.pack() self.entry1 = Entry(self.root) self.entry1.pack() self.label3 = Label(self.root, text="文件大小:") self.label3.pack() self.entry2 = Entry(self.root) self.entry2.pack() self.button1 = Button(self.root, text="连接服务器", command=self.connect_server) self.button1.pack() self.button2 = Button(self.root, text="发送文件", state=DISABLED, command=self.send_file) self.button2.pack() self.root.protocol("WM_DELETE_WINDOW", self.on_closing) def connect_server(self): self.button1.config(state=DISABLED) self.label1.config(text="客户端状态:已连接") self.button2.config(state=NORMAL) def send_file(self): filename = self.entry1.get() filesize = os.path.getsize(filename) self.entry2.insert(END, filesize) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect(('127.0.0.1', 8000)) s.sendall(filename.encode()) s.sendall(str(filesize).encode()) with open(filename, 'rb') as f: while True: data = f.read(1024) if not data: break s.sendall(data) def on_closing(self): self.root.destroy() if __name__ == '__main__': gui = ClientGUI() gui.root.mainloop() ``` 这个示例程序中,服务端监听本地 8000 端口,客户端连接并发送文件。在客户端界面中输入文件名和文件大小后点击“发送文件”按钮,客户端文件发送给服务端。 需要注意的是,这个程序只是一个简单的示例,实际应用中还需要考虑一些安全性和稳定性问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值