我迫不及待的想记录下此刻的心情,最近不知道为什么,总是犯糊涂,
对于一个问题,我明明听得很清楚,心里也想得很清楚,也总是在理清思路,但是做出来却总是一团糟
总是报各种别人都不会遇到的错误,我真是一个头两个大啊!!!
于是,我开始怀疑,是不是我变笨了,还是我本来就脑子不够用!!!幸好,我不是一个有问题憋在心里的人,这样别人永远不知道我还不懂。有问题就大声吼出来,总会有很多人帮助你的!何必扭扭捏捏呢!
胡哥鼓励我说:“那说明你进步了,什么都懂,那是假的。”
虽然我认同这种观点,但是,面对着这种窘态,什么才是真的??难道是这一堆堆不知道什么意思的错误吗?难道是这简单的任务花了一天还一团糟吗?
或许我是一个要强的人,虽然我一直不愿意承认。若有什么自己要做的事没做好,即使是不睡觉,不吃饭也要搞定它!!!从小注定,我就是这样一个人了,难改变,我也不愿意改变!!!
有的人总会觉得,女生能这样已经很不错了,但是我从来不认为这是一种褒奖。我从不认为女生在这方面会比男生弱(ps:这或许会成为我以后比较难嫁出去的原因,太彪悍了!!!)
由于我一整天的黑夜中摸索,终于把这最简单的客户端与服务器同步画图完成了。功能还很欠缺,但是,这是第一步……(23:00整完成的)
首先,给一个框架:
服务器框架图:
客户端框架图:
基础知识:
1.建立一个服务器(关键点)
ServerSocket server = new ServerSocket(9000);
client = server.accept();
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
DataInputStream dis = new DataOInputStream(client.getInputStream());
2.建立一个客户端(关键点)
Socket client = new Socket("127.0.0.1",9000);
//从客户端上获取输入输出流
dis = new DataInputStream(client.getInputStream());
dos = new DataOutputStream(client.getOutputStream());
3.读取和发送数据(待补)
结果展示:
代码存档:
服务器:
package cn.kml.drawserver20130730; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; /** * 定义一个初始化界面并且创建服务器的类 * @author 陌陌 * */ public class ServerDraw extends JFrame implements Runnable{ private Graphics g; private JMenuItem jmiline ;//画线菜单项 private JMenuItem jmicircle ;//画圆菜单项 Socket client; private ShapeListener shapeListener; /** * 程序的入口 * @param args */ public static void main(String[] args) { ServerDraw sDraw = new ServerDraw(); new Thread(sDraw).start(); sDraw.init(); } /** * 定义一个初始化服务器界面的方法 */ public void init(){ this.setTitle("大家一起画-----服务器"); this.setSize(500,400); this.setLocation(100,100); this.setDefaultCloseOperation(3); //菜单设置 JMenuBar jmb = new JMenuBar(); JMenu jmbegin=new JMenu("开始"); jmiline = new JMenuItem("画线"); jmicircle = new JMenuItem("画圆"); jmbegin.add(jmiline); jmbegin.add(jmicircle); jmb.add(jmbegin); this.setJMenuBar(jmb); this.setVisible(true); g = this.getGraphics();//获取画布 System.out.println("服务器"); } public void run() { setUpserver(); } public void setUpserver(){ try { ServerSocket server = new ServerSocket(9000); System.out.println("创建了一个服务器"); //服务器循环等待客户端来连接 while(true){ client = server.accept(); //从客户端获取输入输出流 DataOutputStream dos = new DataOutputStream(client.getOutputStream()); System.out.println("线程对象启动了"); DrawThread dt = new DrawThread(g,client); System.out.println("实例化线程对象了"); dt.start(); ShapeListener shapeListener=new ShapeListener(); jmiline.addActionListener(shapeListener); jmicircle.addActionListener(shapeListener); this.addMouseListener( new ServerListener(g,client,shapeListener)); //启动读取数据的线程 } } catch (Exception e) { e.printStackTrace(); } } }
package cn.kml.drawserver20130730; import java.awt.Graphics; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.Socket; /** * 定义一个线程,用于读取客户端转过来的数据,并画出相应图形 * * @author 陌陌 需要获取客户端对象和画布(通过客户端对象可以获得输入流) */ public class DrawThread extends Thread { private Graphics g; private Socket client; private DataInputStream dis; public DrawThread(Graphics g, Socket client) { this.g = g; this.client = client; } public void run() { System.out.println("进入线程了,开始读数据了"); // 循环读取客户机发来的数据 readData(); } /** * 定义一个读取数据并画出相应图形的方法 */ public void readData() { // 从客户端获取输出流 try { dis = new DataInputStream(client.getInputStream()); System.out.println("要开始读取数据了"); while (true) { byte flagcome = dis.readByte(); int a1 = dis.readInt(); int b1 = dis.readInt(); int a2 = dis.readInt(); int b2 = dis.readInt(); // dis.close(); System.out.println("服务器收到的:" + "a1是:" + a1 + " " + "b1是:" + b1 + " " + "a2是:" + a2 + " " + "b2是:" + b2); if (flagcome == 1) { g.drawLine(a1, b1, a2, b2); } else if (flagcome == 2) { g.drawOval(a1, b1, Math.abs(a2 - a1), Math.abs(b2 - b1)); } } } catch (IOException e) { e.printStackTrace(); } } }
package cn.kml.drawserver20130730; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; /** * 定义一个鼠标监听器,用于在窗体上点击画出图形 * * @author 陌陌 需要从主类中获取画布和输出流,从ShapeListener中获取flag的值 */ public class ServerListener implements MouseListener { private Graphics g; private byte flag = 0; private Socket client; private DataOutputStream dos; private int x1, y1, x2, y2; private ShapeListener shapeListener; /** * 构造器,用于从主类中传值 * @param g 窗体上的画布 * @param dos 数据输出流 */ public ServerListener(Graphics g, Socket client,ShapeListener shapeListener) { this.g = g; this.client = client; System.out.println(client + "构造函数中"); this.shapeListener = shapeListener; } /** * 按下鼠标的时候,获取该店的坐标 */ public void mousePressed(MouseEvent e) { x1 = e.getX(); y1 = e.getY(); System.out.println("x1是:" + x1 + "," + "y1是:" + y1); } /** * 鼠标释放的时候,获取该点坐标,并画出直线。同时,把这两点的坐标以及flag值传递给客户端 */ public void mouseReleased(MouseEvent e) { System.out.println("鼠标释放了!"); x2 = e.getX(); y2 = e.getY(); // ShapeListener sl = new ShapeListener(); flag = shapeListener.getFlag(); System.out.println("再鼠标监听器中" + flag); if (flag == 1) { System.out.println("x2是:" + x2 + "," + "y2是:" + y2); g.drawLine(x1, y1, x2, y2); } else if (flag == 2) { g.drawOval(x1, y1, Math.abs(x2 - x1), Math.abs(y2 - y1)); } try { System.out.println("client是:"+client); OutputStream os = client.getOutputStream(); System.out.println("os是:"+os); dos =new DataOutputStream(os); System.out.println("dos是:"+dos); dos.writeByte(flag); dos.writeInt(x1); dos.writeInt(y1); dos.writeInt(x2); dos.writeInt(y2); dos.flush(); // dos.close(); System.out.println("已经把数据传出去!!!"); } catch (Exception ef) { ef.printStackTrace(); } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } }
package cn.kml.drawserver20130730; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * 定义一个监听器类,用于设定flag的值,判断所画图形的形状 * @author 陌陌 * */ public class ShapeListener implements ActionListener{ public byte getFlag() { return flag; } public void setFlag(byte flag) { this.flag = flag; System.out.println("形状监听器中setflag后flag的值是:"+flag); } private byte flag ;//标志物,用于区分画的是圆还是线 public void actionPerformed(ActionEvent e) { String string = e.getActionCommand(); if(string.equals("画线")){ setFlag((byte)1); } if(string.equals("画圆")){ setFlag((byte)2); } } }
客户端:
package cn.kml.drawclient20130730; import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; /** * 定义一个可以画图的客户端 * @author 陌陌 */ public class ClientDraw extends JFrame{ private JMenuItem jmiline; private JMenuItem jmicircle; private Graphics g; public static void main(String[] args) { ClientDraw cDraw = new ClientDraw(); cDraw.init(); } public void init(){ //设置窗体的属性 this.setTitle("大家一起画--客户端"); this.setSize(500,400); this.setLocation(600,100); this.setDefaultCloseOperation(3); //菜单设置 JMenuBar jmb = new JMenuBar(); JMenu jmbegin=new JMenu("开始"); jmiline = new JMenuItem("画线"); jmicircle = new JMenuItem("画圆"); jmbegin.add(jmiline); jmbegin.add(jmicircle); jmb.add(jmbegin); this.setJMenuBar(jmb); this.setVisible(true); System.out.println("客户端"); g = this.getGraphics();//获取画布 ShapeClientListener sClientListener = new ShapeClientListener(); jmiline.addActionListener(sClientListener); jmicircle.addActionListener(sClientListener); ClientListener cListener = new ClientListener(g,sClientListener); this.addMouseListener(cListener); } } package cn.kml.drawclient20130730; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; public class ClientListener implements MouseListener{ private Graphics g; private byte flag; private int x1,x2,y1,y2; private DataInputStream dis; ShapeClientListener sClientListener; DataOutputStream dos; public ClientListener(Graphics g,ShapeClientListener sClientListener){ this.sClientListener = sClientListener; this.g = g; createDrawClient(); System.out.println("监听器中g为"+g); } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { x1 = e.getX(); y1 = e.getY(); } public void mouseReleased(MouseEvent e) { x2 = e.getX(); y2 = e.getY(); // ShapeClientListener sClientListener = new ShapeClientListener(); flag=sClientListener.getFlag(); System.out.println("fiag="+flag); System.out.println("从形状监听器处得到的flag是:"+flag); if(flag==1){ g.drawLine(x1, y1, x2, y2); }else if(flag==2){ g.drawOval(x1, y1, Math.abs(x2-x1), Math.abs(y2-y1)); }try { dos.write(flag); dos.writeInt(x1); dos.writeInt(y1); dos.writeInt(x2); dos.writeInt(y2); dos.flush(); System.out.println("客户端已经将画图的数据写出"); } catch (Exception e2) { } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void createDrawClient(){ try { //创建客户端 Socket client = new Socket("127.0.0.1",9000); //从客户端上获取输入输出流 dis = new DataInputStream(client.getInputStream()); dos = new DataOutputStream(client.getOutputStream()); //启动线程循环读取数据,并画出相应的图形 readDrawThread rdt = new readDrawThread(g,dis); rdt.start(); //把客户端画出图形的数据传给服务器 // dos.close(); } catch (IOException e) { e.printStackTrace(); } } } package cn.kml.drawclient20130730; import java.awt.Graphics; import java.io.DataInputStream; import java.io.IOException; public class readDrawThread extends Thread{ private Graphics g; private DataInputStream dis ; public readDrawThread(Graphics g,DataInputStream dis){ this.dis = dis; this.g = g; System.out.println("read方法中g为"+g); } public void run(){ readData(); } public void readData(){ try { while(true){ byte flagcome = dis.readByte(); int a1 = dis.readInt(); int b1 = dis.readInt(); int a2 = dis.readInt(); int b2 = dis.readInt(); // dis.close(); System.out.println("客户端中的flagcome是:"+flagcome); System.out.println("客户机收到的"+"a1是:"+a1+" "+"b1是:"+b1+" "+"a2是:"+a2+" "+"b2是:"+b2); if(flagcome ==1){ g.drawLine(a1, b1, a2, b2); }else if(flagcome==2){ g.drawOval(a1, b1, Math.abs(a2-a1), Math.abs(b2-b1)); } } } catch (IOException e) { e.printStackTrace(); } } } package cn.kml.drawclient20130730; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class ShapeClientListener implements ActionListener{ private byte flag; public byte getFlag() { return flag; } public void setFlag(byte flag) { this.flag = flag; System.out.println("客户端形状监听器中setflag后flag的值是:"+flag); } public void actionPerformed(ActionEvent e) { String string = e.getActionCommand(); if(string.equals("画线")){ setFlag((byte)1); } if(string.equals("画圆")){ setFlag((byte)2); } } }
………………………………………………未完待续…………………………………………………………
………………………………………敬请期待各种奇葩错误分析…………………………………………
相关推荐
在本项目"java大作业--画图板"中,我们主要关注的是利用Java编程语言实现一个功能丰富的图形用户界面(GUI)应用,它允许用户进行绘画操作,类似于电子画板。这个应用程序具备了一系列常见的绘图工具,如绘图、颜色...
画图板--Java课程设计
在C#编程环境中,开发一个画图板应用是一项常见的任务,尤其对于教学、设计或创建图形用户界面(GUI)的应用程序。在这个项目中,我们关注的是实现基础的绘图功能,包括绘制直线、曲线和矩形,并允许用户选择线条的...
Java课程设计中的“画图板”项目是一个典型的图形用户界面(GUI)应用,它允许用户在屏幕上绘制图形。这个项目通常被用作教学实践,帮助学生掌握Java编程基础,特别是Swing库和AWT库在构建图形用户界面时的应用。...
Java画图板是一款基于Java开发的图形用户界面(GUI)应用程序,它允许用户在屏幕上绘制图形,并具有网络同步功能。这个程序可能适用于教学、协作或者简单的创意表达,使得多个用户可以实时共享和编辑同一画布。 ...
设计师通常会在纸质画图板上完成初步设计后,通过扫描仪将作品数字化,利用计算机软件进行细化处理和后期编辑。这种方法既保留了原始创意的完整性,又充分利用了数字工具的精确性和编辑功能。 总的来说,纸质画图板...
**MFC程序设计-画图板** MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于简化Windows应用程序的开发。它基于面向对象的编程理念,将Windows API进行了封装,使得开发者能够更加高效地构建图形用户...
大学生JAVA学习笔记,复习巩固,课程作业,课程设计!!!
A4打印模板-画图设计设计师产品草稿图纸-平板原型设计A4打印模板高清待办练字模板PDF下载
比较好用的电子教鞭,可以不锁定屏幕情况下画图。
在本文中,我们将深入探讨如何使用C#编程语言高仿Windows自带的画图板应用程序,实现各种绘图功能。这个项目旨在提供一个类似的用户界面和功能集,包括打开和保存图片、文字绘制、多种形状绘制、画刷和画笔操作、...
根据给定文件的信息,我们可以提炼出以下几个相关的IT知识点: ### A4打印模板的设计与应用 ...此外,高清格式和PDF格式的结合更是为设计师提供了便捷高效的解决方案,有助于推动设计项目的顺利进行。
开始→运行→命令集锦 ... mspaint--------画图板 mstsc----------远程桌面连接 mplayer2-------媒体播放机 magnify--------放大镜实用程序 mmc------------打开控制台 mobsync--------同步命令 ......
C#画图板程序是一种基于Microsoft .NET Framework的桌面应用程序,它允许用户通过鼠标或触控设备进行图形绘制。这个程序通常由C#编程语言编写,利用Windows Forms或WPF(Windows Presentation Foundation)框架来...
本项目是一款基于JavaScript的Canvas画图板设计源码,综合运用HTML、CSS和JavaScript语言,共包含20个文件,其中包括5个PNG图片文件、3个地图文件、2个HTML文件、2个...该画图板适用于各类绘画和创意表达需求。
1. 数字化绘图:教学用画图板通常配备高精度触控技术,允许用户通过手写笔或手指进行精细的线条绘制,支持多种颜色和笔刷样式,提供类似于纸笔的书写体验。 2. 实时互动:教师可以在画图板上实时展示解题过程,学生...
《画图板的实现》 在信息技术领域,创建一个简单的画图板是许多初学者和开发者经常接触的任务。这个过程涉及到图形用户界面(GUI)的设计和编程,通常使用Java这样的面向对象语言。在这个主题中,我们将深入探讨...
### MFC画图板开发详解 #### 基础知识概览 在开始深入探讨如何使用MFC(Microsoft Foundation Classes)构建一个画图板应用程序之前,我们先来了解一些基础知识。 1. **新建一个工程** - 打开 **Microsoft ...
在这个"计算机图形学课程设计--windows画图板"项目中,我们将会深入探讨如何利用编程技术实现一个类似于Windows内置画图板的应用程序。这个项目是学习者理解和掌握计算机图形学基本原理与实践技能的理想平台。 首先...
在本文中,我们将深入探讨如何使用C#编程语言创建一个Winform画图板应用程序,该程序具有类似于Windows内置画图工具的功能。这个项目的核心在于利用Windows Forms(Winform)库来构建用户界面,并通过GDI+图形处理...