TCP远程控制
TCP协议:是可靠的,面向对象的,但是传输效率比较低
使用Socket类
会使用ServerSocket类
TCP客户端:
用来发送请求,再显示远程桌面面板,面板要有要连接IP地址,端口号。再给按钮添
加
监听器
MyListener mlis =new MyListener();
btn.addActionListener(mlis);
//按钮监听器
class MyListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e){
//获得Ip@端口
String ip = ipField.getText();
String port = portField.getText();
int intPort = Integer.parseInt(port);
try{
//创建客户端套接字,连接
服务端
Socket
socket =new Socket(ip,intPort);
//不停的接受服务端发来的图片
RecieveThread rt =new RecieveThread(socket,panel);
rt.start();
}catch(Exception e1){
//弹出
错误提示框
JOptionPane.showMessageDialog(null,"网络
异常,无法连接服务器!");
e1.printStackTrace();
}
}
}
}
// 从Socket上获得输入流
InputStream ips = socket.getInputStream();
// 由于接受的是对象流
ObjectInputStream ois = new ObjectInputStream(ips);
while (true) {
// 读取对象,由于发送的是ImageIcon,这里可以强制转型成ImageIcon
Object obj = ois.readObject();
ImageIcon icon = (ImageIcon) obj;
//获得图像大小(即为服务端桌面大小)
int width = icon.getIconWidth();
int height = icon.getIconHeight();
//修改panel大小为服务端桌面大小
panel.setPreferredSize(new Dimension(width,height));
//获得画布
Graphics g = panel.getGraphics();
g.drawImage(icon.getImage(), 0,0, null);
TCP服务端:
接收客服端的请求:
// 初始化服务端的方法
public void initServer() throws IOException {
// 创建服务端套接字对象
ServerSocket server = new ServerSocket(10010);
System.out.println("服务器已经启动,等待连接");
// 等待客户端连接,如果有客户端连接上,会收到客户端套接字
Socket socket = server.accept();
System.out.println("一个客户端连上了"+socket.getRemoteSocketAddress());
// 启动一个
线程来给客户端发送服务端桌面
SendThread st = new SendThread(socket);
st.start();
//从套接字上获得输出流
OutputStream ops = socket.getOutputStream();
//包装成对象流
ObjectOutputStream oos = new ObjectOutputStream(ops);
// 创建一个机器人对象,用来截屏
Robot robot = new Robot();
while (true) {
// 获得屏幕的分辨率
Toolkit tool = Toolkit.get
DefaultToolkit();
Dimension dim = tool.getScreenSize();
// 要截取的起始点
Point p = new Point(0, 0);
// 指定截取的区域
Rectangle rect = new Rectangle(p, dim);
// 开始截屏,获得截取到的图像
BufferedImage img = robot.createScreenCapture(rect);
//由于BufferedImage没有实现
序列化,不能写到IO中
//将BufferedImage包装成可写入IO的图像对象
ImageIcon icon = new ImageIcon(img);
//写出对象
oos.writeObject(icon);
oos.flush();
UDP的传输:
UDP发送数据:
public static void main (String[] args)throws Exception {
//发件人的地址与发件人实例化
SocketAddress sendAdd = new InetSocketAddress("127.0.0.1",9091);
//收件人的地址
SocketAddress address = new InetSocketAddress("127.0.0.1",9090);
//用来发送数据包的套接字(
快递员)
DatagramSocket socket = new DatagramSocket(sendAdd);
int num =0 ;
while(true){
num++;
String ems="我是快递UDP";
byte[] bnf= ems.getBytes();//吧字符串转换成字节类型
Thread.sleep(1000);
//创建一个要发送的数据包(包裹)
DatagramPacket packet =new DatagramPacket(bnf, bnf.length, address);
//发送数据包
socket.send(packet);
UDP接收数据:
//接受方的地址
SocketAddress receiveAdd= new InetSocketAddress ("127.0.0.1",9090);
//创建接收数据的套接字(快递员)
DatagramSocket socket = new DatagramSocket(receiveAdd);
int num =0;
while(true){
num++;
Thread.sleep(1000);
byte [] buf = new byte[1024];
//创建数据包对象
DatagramPacket packet =new DatagramPacket(buf ,buf.length);
//接收数据包,数据就会被存在buf数组中
socket.receive(packet);
String str = new String(buf);
System.out.println(str.trim());
总结:tcp协议和udp协议的区别
TCP UDP
是否连接 面向连接 面向非连接
传输可靠性 可靠 不可靠
应用场合 传输大量数据 少量数据
速度 慢 快