我迫不及待的想记录下此刻的心情,最近不知道为什么,总是犯糊涂,
对于一个问题,我明明听得很清楚,心里也想得很清楚,也总是在理清思路,但是做出来却总是一团糟
总是报各种别人都不会遇到的错误,我真是一个头两个大啊!!!
于是,我开始怀疑,是不是我变笨了,还是我本来就脑子不够用!!!幸好,我不是一个有问题憋在心里的人,这样别人永远不知道我还不懂。有问题就大声吼出来,总会有很多人帮助你的!何必扭扭捏捏呢!
胡哥鼓励我说:“那说明你进步了,什么都懂,那是假的。”
虽然我认同这种观点,但是,面对着这种窘态,什么才是真的??难道是这一堆堆不知道什么意思的错误吗?难道是这简单的任务花了一天还一团糟吗?
或许我是一个要强的人,虽然我一直不愿意承认。若有什么自己要做的事没做好,即使是不睡觉,不吃饭也要搞定它!!!从小注定,我就是这样一个人了,难改变,我也不愿意改变!!!
有的人总会觉得,女生能这样已经很不错了,但是我从来不认为这是一种褒奖。我从不认为女生在这方面会比男生弱(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);
}
}
}
………………………………………………未完待续…………………………………………………………
………………………………………敬请期待各种奇葩错误分析…………………………………………