日常练习
我要两台电脑,日常学习时再两台电脑间复制粘贴文本很不方便,在学习了一些Socket知识后,便萌发了自己做一个共享剪切板的程序。
程序发送端会有简陋的图形化界面,将复制的文本粘贴到文本区域,按下发送按钮就会将文本文件发送到另一台电脑上,打印在控制台,并自动将文本设置到这台电脑的剪切板上。
因为才学浅陋,无法做到在此电脑上复制后无需其他操作就将文本发送到另一台电脑剪切板,希望以后能力足够后能够实现。
下面是代码:
发送端:
package Socket;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class UdpSend {
static JTextArea textData = null;
static JButton sendBtn = null;
public static void create() {
JFrame f = new JFrame();
f.setLayout(new BorderLayout());
textData = new JTextArea(100, 100);
sendBtn = new JButton("发送");
sendBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
send(textData.getText());
}
});
f.add(textData, BorderLayout.CENTER);
f.add(sendBtn, BorderLayout.SOUTH);
f.setBounds(600, 250, 300, 400);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void send(String data) {
DatagramSocket ds;
try {
// 创建Socket服务,0--1024端口为系统端口或保留端口
ds = new DatagramSocket(10000);
// 数据打包
byte[] p = data.getBytes();
DatagramPacket dp = null;
try {
dp = new DatagramPacket(p, p.length, InetAddress.getByName("此处填上另一台电脑ip"), 8080);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 发送数据
try {
ds.send(dp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 关闭资源
ds.close();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
create();
}
}
接收端:
package test;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceive {
public static void main(String[] args) throws Exception {
//建立Socket连接
while(true) {
DatagramSocket ds = new DatagramSocket(8080);
//定义数据包。用于存储数据
byte[] buf = new byte[2048];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
//接收数据
ds.receive(dp);
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(data);
setSysClipboardText(data);
//关闭资源
ds.close();
}
}
//设置到剪切板
private static void setSysClipboardText(String data) {
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable tText = new StringSelection(data);
clip.setContents(tText, null);
}
}