网络画图板;客户端在向服务器发送信息的时候需要定义发送的协议, 简称通信协议
形状类型 int type; 0直线 1矩形 2椭圆
形状数据 int x1,y1,x2,y2;
服务器;只需要不停的接受客户端,转发给另外的客户端
客户端;需要有界面,通信协议,
服务器
客户端一上面画
客户端二上面也会有
服务器:
package 远程演示服务器; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; /** * 服务器的主类 * * @author Administrator * */ public class ServerMain { // static不能定义在main方法里面 public static ArrayList<Socket> socketlis = new ArrayList<Socket>(); public static void main(String[] args) { boolean islive = true; try { ServerSocket server = new ServerSocket(9090); System.out.println("等待连接客户端..."); while (islive) { Socket socket = server.accept(); ServerThread th = new ServerThread(socket); th.start(); socketlis.add(socket); System.out.println(socket.getInetAddress().getHostName() + "连上服务器"); } } catch (IOException e) { islive = false; System.out.println("端口不存在,,"); } } }
服务器线程来转发数据
package 远程演示服务器; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /** * 使用线程将绘制的内容发给其他的客户端 * * @author Administrator * */ public class ServerThread extends Thread { private Socket socket; public ServerThread(Socket socket) { this.socket = socket; } @Override public void run() { try { //获取输入流 InputStream is = socket.getInputStream(); DataInputStream dis = new DataInputStream(is); while (true) { int type = dis.readInt(); int x1 = dis.readInt(); int y1 = dis.readInt(); int x2 = dis.readInt(); int y2 = dis.readInt(); // 转发给其它客户端 for (int i = 0; i < ServerMain.socketlis.size(); i++) { Socket sc = ServerMain.socketlis.get(i); if (sc != socket) { OutputStream os = sc.getOutputStream(); DataOutputStream dos = new DataOutputStream(os); dos.writeInt(type); dos.writeInt(x1); dos.writeInt(y1); dos.writeInt(x2); dos.writeInt(y2); dos.flush(); } } } } catch (Exception e) { e.printStackTrace(); } } }
客户端主界面
package 远程演示客户端; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; /** * 远程演示客户端 * * @author Administrator * */ public class DrawUI extends JFrame { public static void main(String[] args) { new DrawUI(); } private JTextField ipFiled; private JTextField portFiled; private JButton Btn; private JPanel centenr; private Socket socket; public DrawUI() { this.setTitle("远程演示"); this.setSize(500, 500); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLayout(new BorderLayout()); // 绘制区域 centenr = new JPanel(); this.add(centenr,BorderLayout.CENTER); // 右边聊天区域 JPanel right = new JPanel(); right.setPreferredSize(new Dimension(100, 100)); right.setBackground(Color.lightGray); this.add(right, BorderLayout.EAST); // 下边ip设置 JPanel bottom = new JPanel(); bottom.setPreferredSize(new Dimension(500, 50)); bottom.setBackground(Color.lightGray); this.add(bottom, BorderLayout.SOUTH); // 设置默认的ip和端口 JLabel iplabel = new JLabel("IP"); ipFiled = new JTextField("127.0.0.1", 15); JLabel portlabel = new JLabel("port"); portFiled = new JTextField("9090", 10); Btn = new JButton("连接服务器"); // 创建监听器对象 BtnLisetenr blis = new BtnLisetenr(); Btn.addActionListener(blis); // 将组件添加到窗体下部 bottom.add(iplabel); bottom.add(ipFiled); bottom.add(portlabel); bottom.add(portFiled); bottom.add(Btn); this.setResizable(false); this.setVisible(true); //创建监听器对象 ClientLis lis = new ClientLis(this, centenr); centenr.addMouseListener(lis); } // 获得客户端 public Socket getSocket() { return socket; } // 添加链接服务器的监听器 class BtnLisetenr implements ActionListener { @Override public void actionPerformed(ActionEvent e) { String str = e.getActionCommand(); if (str.equals("连接服务器")) { // 获得输入框中的ip和端口 String ip = ipFiled.getText().trim(); String ports = portFiled.getText().trim(); // 在客户端的创建中端口是整型的,所以需要将端口字符串转换成整形 int port = Integer.parseInt(ports); try { socket = new Socket(ip, port); //启动接收消息的线程 receiveThread th = new receiveThread(socket, centenr); th.start(); Btn.setText("已经连接上服务器.."); } catch (Exception e1) { e1.printStackTrace(); } } } } }
客户端监听器类
package 远程演示客户端; /* * 监听器类 */ import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import javax.swing.JPanel; public class ClientLis extends MouseAdapter { private int x1, y1, x2, y2; private JPanel centenr; private DrawUI ui; Graphics g; public ClientLis(DrawUI ui, JPanel centenr) { this.ui = ui; this.centenr = centenr; } // 按下 public void mousePressed(MouseEvent e) { // 获得画布和按下的坐标 g = centenr.getGraphics(); x1 = e.getX(); y1 = e.getY(); } // 释放 public void mouseReleased(MouseEvent e) { // 获得释放时的坐标 x2 = e.getX(); y2 = e.getY(); g.drawLine(x1, y1, x2, y2); Send(); } // 将绘制的消息发送给服务器 public void Send() { // 获得socket Socket socket = ui.getSocket(); if (socket != null) { try { OutputStream os = socket.getOutputStream(); DataOutputStream oos = new DataOutputStream(os); oos.writeInt(0); oos.writeInt(x1); oos.writeInt(y1); oos.writeInt(x2); oos.writeInt(y2); oos.flush(); } catch (IOException e) { e.printStackTrace(); } } else { javax.swing.JOptionPane.showMessageDialog(null, "网络不通!!!"); } } }
客户端线程类,定义通信协议
package 远程演示客户端; import java.awt.Graphics; import java.io.DataInputStream; import java.io.InputStream; import java.net.Socket; import javax.swing.JPanel; /** * 处理客户端接受服务器的消息 * * @author Administrator * */ public class receiveThread extends Thread { private JPanel centenr; private Socket socket; boolean islive = true; private DataInputStream dis; private Graphics g; public receiveThread(Socket socket, JPanel centenr) { this.socket = socket; this.centenr = centenr; try { // 创建输入流 InputStream is = socket.getInputStream(); dis = new DataInputStream(is); } catch (Exception e) { e.printStackTrace(); } } @Override public void run() { while (islive) { try { int type = dis.readInt(); int x1 = dis.readInt(); int y1 = dis.readInt(); int x2 = dis.readInt(); int y2 = dis.readInt(); g = centenr.getGraphics(); if (type == 0) { g.drawLine(x1, y1, x2, y2); } } catch (Exception ef) { islive = false; ef.printStackTrace(); } } } }
相关推荐
QT画图板是一个基于Qt库开发的图形用户界面应用程序,主要功能是提供一个交互式的画布,用户可以在上面进行绘图操作。对于初学者来说,QT画图板是一个极好的学习资源,它展示了Qt库在图形绘制和用户交互方面的强大...
在本文档中,我们将探讨如何使用QtCreator来编写一个画图板程序。画图板是一个基础且功能丰富的应用,常常作为学习图形用户界面(GUI)编程的一个入门项目。本文将重点介绍Qt的GUI框架、主要组件以及编程概念。 ###...
这个"基于qt实现的画图板"项目提供了一个基础的图形用户界面(GUI)应用,让用户能够进行基本的绘画操作,比如选择画笔、填充颜色、打开和保存图像。以下是关于这个项目的一些关键知识点和相关技术的详细解释: 1. ...
为了更好地规划和展示网络结构,"网络画图板"这一工具应运而生,成为网络技术领域的重要辅助工具。 "网络画图板"的开发初衷,是为了满足网络专业人士在图形化设计和演示方面的需求。这使得他们能够通过直观的图形...
在IT领域,"画图板"通常指的是一个用于创建、编辑和操作简单图形的应用程序,类似于Windows操作系统内置的“画图”程序。这个程序提供了一系列基础的绘图工具,让用户可以进行基本的图像创作和编辑。下面将详细介绍...
本主题聚焦于"Flash交互画图板",这是一个利用ActionScript编程语言实现的一帧交互程序。ActionScript是Flash的核心,用于创建动态内容、控制影片剪辑、处理用户输入以及与其他软件进行数据交换。 首先,我们来看...
在本文中,我们将深入探讨如何使用Qt库中的`QGraphicsView`组件来创建一个功能丰富的画图板。`QGraphicsView`是Qt图形视图框架的一部分,它提供了一个灵活的界面来显示和操作复杂的2D图形,非常适合用于构建交互式的...
综上所述,画图板虽然看似简单,但其背后涉及到的技术和设计思路却相当丰富,包括事件处理、用户交互、图形渲染、数据结构、文件操作和网络通信等多个方面。无论是学习编程基础还是深入研究前端技术,理解并实现一个...
Java画图板是一款基于Java开发的图形用户界面(GUI)应用程序,它允许用户在屏幕上绘制图形,并具有网络同步功能。这个程序可能适用于教学、协作或者简单的创意表达,使得多个用户可以实时共享和编辑同一画布。 ...
QT_C++画图板源码论文开题报告任务书外文翻译全套毕业设计是一个综合性的项目,涵盖了多个方面的IT知识,特别关注了QT框架在C++中的应用。QT是一个跨平台的应用程序开发框架,用于创建桌面、移动和嵌入式应用程序。...
本项目主要涉及的是使用MFC创建一个简单的画图板应用,它提供了基础的绘图功能,并且设计简洁,非常适合初学者或者开发者作为扩展和定制的基础。 首先,MFC是微软为C++开发的一个框架,它封装了Windows API,简化了...
标题中的"five_11_30_draw_QT_画图板_"似乎是一个项目或程序的命名,其中"QT"代表了Qt库,一个广泛使用的跨平台应用开发框架,尤其适用于图形用户界面(GUI)的创建。"画图板"则意味着这个项目是一个基于Qt的图形...
标题中的"C#画图板程序源码"表明这是一个使用C#编程语言开发的图形用户界面应用,主要用于绘制图形。在C#中,这样的程序通常利用Windows Presentation Foundation (WPF)或Windows Forms框架来构建。接下来,我们将...
QT简易画图板程序是一个基于Qt库开发的简单图形绘制应用程序。Qt是一个跨平台的C++框架,广泛用于创建桌面、移动以及嵌入式设备的应用程序。本程序旨在提供一个基础的画图环境,用户可以在此基础上进行各种图形的...
用java编写的网络画板应用,应用socket技术,可选择当客户端以及服务器端,局域网连接,可实时聊天,实时显示多方所画内容,可选线条粗细,颜色,实线虚线,以及图形样式,界面简洁,功能强大方便扩展,通过多线程可...
在本项目中,它被用来实现一个画图板应用程序,这需要对C++的基础语法、类和对象、指针以及内存管理有深入的理解。 1. C++基础:理解C++的基本语法结构,包括变量声明、数据类型、运算符、流程控制语句(如if-else...
在Java编程领域,实现一个模仿画图板的程序是一项常见的练习,它可以帮助开发者熟悉图形用户界面(GUI)的创建和事件处理。这个程序允许用户绘制简单的图形,甚至能导入图片进行进一步的画图操作。下面将详细介绍这...
Visio是一款强大的图形绘制软件,尤其在IT领域中,它被广泛用于绘制各种流程图、组织结构图以及网络架构图等。在这个特定的压缩包中,我们关注的是"visio常用模板",其中包括了用于描绘深度学习网络模型的工具,这...
"彩虹画图板源代码.zip" 是一个包含编程源代码的压缩文件,它提供了一个基于数字和字母转换颜色的画图程序。这个程序允许用户通过输入特定的字符序列来生成和编辑图像,这些字符序列与颜色值相对应,形成了一种独特...