网络画图板;客户端在向服务器发送信息的时候需要定义发送的协议, 简称通信协议
形状类型 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(); } } } }
相关推荐
一个Java的画图板程序,支持网络同步功能!还是不错的,^_^
用java编写的网络画板应用,应用socket技术,可选择当客户端以及服务器端,局域网连接,可实时聊天,实时显示多方所画内容,可选线条粗细,颜色,实线虚线,以及图形样式,界面简洁,功能强大方便扩展,通过多线程可...
ML Visuals 专为解决神经网络画图问题设计。ML Visuals 现在包含了 100 多个可用的自定义图形,使用者可以在任何论文、博客、PPT 中使用这些资源。这份 101 页的模板共包含几个部分:基础组件、架构、机器学习概念、...
该资源采用Visio绘图软件制作,包含卷积池化操作的绘图,以及线性层的绘图。供各位网友参考。
但问题是一些免费的画图工具效果不佳,要么图片不好看,要么就得从头到尾一点点设计,好一点像亿图这样的软件又得花钱,花了钱但又用不了几次。 那还不如用PPT画,这份PPT共160页,所有的素材均可编辑。照着模板改...
科研绘图 - 神经网络结构图ppt绘制模板,包含各种类型的神经网络结构(平面,立体3d效果)和各种图例,总有一个模板是你所需要的。 科研绘图 - 神经网络结构图ppt绘制模板,包含各种类型的神经网络结构(平面,立体...
网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络与通信是一个非常广泛的领域,它涉及到计算机科学、电子工程、数学等多个学科的知识。 云计算与大数据:数据集、包括云计算平台、大数据...
这是一个基于java socket连接实现的简单GUI网络画图白板程序,项目文件中app package中的MultiServer.java是服务端监听程序的主程序;Client.java是客户端启动程序。运用面向对象程序设计思想,基于java的GUI、套接字...
这是一套是一套非常完善的图形系统,适合在电力、煤炭、化工、仿真、网络、自动化等各种工业监控软件以及图形建模、图形管理、图形分析、中小型GIS系统、工作流、中文表格、表单、工程绘图等软件项目中应用。...
去年 5 月,github上出现一款名为 ML Visuals 的机器学习画图模板,该项目受到广泛关注,迄今已收获 6.1K Star。ML Visuals 专为解决神经网络画图问题设计。
mspaint 画图板 mstsc 远程桌面连接 narrator 屏幕"讲述人" net stop messenger 停止信使服务 net start messenger 开始信使服务 netstat an (TC)命令检查接口 notepad 打开记事本 nslookup 网络...
简单的PCB入门制作,简单的画图以及形成网络表,最终制作双单面PCB板。
简单的网络白板,一个是服务器端,一个是客户端,每一方画图,对方都有看到。
我自己用PPT重新画了一个LSTM的框架图,可以导出高清格式图片,放在投稿的小论文里面。导出方式如下: 1用office的powerpoint打开下载的LSTM.pptx文件; 2.在office中设置,保证可导出高分辨率图片,可参考...
自己写的一个网络白板程序,有客户端和服务器端,服务器实现多线程,并且可以实时显示连接数及连接的ip,客户端实现绘图功能,并把图像发到服务器端,服务器转发给其他客户端。代码是用java写的,采用的基本Server/...
JavaBean,JavascriPt以及数据库访问技术来完整构建一个网络聊天室系统项 目,从而进一步研究web项目开发的系统分析过程,通过与相关的编程技术相 结合的方式来实现网络聊天室系统前台与后台的功能,以便进一步的...
下面是我画的一棵简易的圣诞树,虽然和网络上大佬们的圣诞树相比不是很精致,但是对于萌新们来说,画这样一棵简易的圣诞树还是非常轻松的。 ps:重要的不是圣诞树,重要的是你的心意哦~ 一、让我们先来学习Python...
试编程实现累积BP算法,在西瓜数据集2.0上(用训练数据)训练一个单隐层网络,用验证集计算出均方误差。要自己实现,不能直接调用现成的库函数。 作业四 下载并安装libsvm,http://www.csie.ntu.edu.tw/~cjlin/libsvm/...