我迫不及待的想记录下此刻的心情,最近不知道为什么,总是犯糊涂,
对于一个问题,我明明听得很清楚,心里也想得很清楚,也总是在理清思路,但是做出来却总是一团糟
总是报各种别人都不会遇到的错误,我真是一个头两个大啊!!!
于是,我开始怀疑,是不是我变笨了,还是我本来就脑子不够用!!!幸好,我不是一个有问题憋在心里的人,这样别人永远不知道我还不懂。有问题就大声吼出来,总会有很多人帮助你的!何必扭扭捏捏呢!
胡哥鼓励我说:“那说明你进步了,什么都懂,那是假的。”
虽然我认同这种观点,但是,面对着这种窘态,什么才是真的??难道是这一堆堆不知道什么意思的错误吗?难道是这简单的任务花了一天还一团糟吗?
或许我是一个要强的人,虽然我一直不愿意承认。若有什么自己要做的事没做好,即使是不睡觉,不吃饭也要搞定它!!!从小注定,我就是这样一个人了,难改变,我也不愿意改变!!!
有的人总会觉得,女生能这样已经很不错了,但是我从来不认为这是一种褒奖。我从不认为女生在这方面会比男生弱(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); } } }
………………………………………………未完待续…………………………………………………………
………………………………………敬请期待各种奇葩错误分析…………………………………………
相关推荐
伟业极速文件传输服务器.ec 伟 业超级列表框列宽尺寸自动调整.ec 伟业高级表格列宽尺寸自动调整.ec 传世注册.ec 低级功能模块.ec 供应商管理模 块.ec 保存图片(1.0).EC 保存图片1.0.ec 保存扩展界面设置.ec 保护.ec ...
伟业极速文件传输服务器.ec 伟 业超级列表框列宽尺寸自动调整.ec 伟业高级表格列宽尺寸自动调整.ec 传世注册.ec 低级功能模块.ec 供应商管理模 块.ec 保存图片(1.0).EC 保存图片1.0.ec 保存扩展界面设置.ec 保护.ec ...