`
陌陌天使
  • 浏览: 21971 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

通信初步--------客户机于服务器同步画图板

阅读更多

 

我迫不及待的想记录下此刻的心情,最近不知道为什么,总是犯糊涂,

对于一个问题,我明明听得很清楚,心里也想得很清楚,也总是在理清思路,但是做出来却总是一团糟

总是报各种别人都不会遇到的错误,我真是一个头两个大啊!!!

 

 

于是,我开始怀疑,是不是我变笨了,还是我本来就脑子不够用!!!幸好,我不是一个有问题憋在心里的人,这样别人永远不知道我还不懂。有问题就大声吼出来,总会有很多人帮助你的!何必扭扭捏捏呢!

 

胡哥鼓励我说:“那说明你进步了,什么都懂,那是假的。”

虽然我认同这种观点,但是,面对着这种窘态,什么才是真的??难道是这一堆堆不知道什么意思的错误吗?难道是这简单的任务花了一天还一团糟吗?

 

或许我是一个要强的人,虽然我一直不愿意承认。若有什么自己要做的事没做好,即使是不睡觉,不吃饭也要搞定它!!!从小注定,我就是这样一个人了,难改变,我也不愿意改变!!!

 

有的人总会觉得,女生能这样已经很不错了,但是我从来不认为这是一种褒奖。我从不认为女生在这方面会比男生弱(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);
		}
		
	}


}

 

………………………………………………未完待续…………………………………………………………

………………………………………敬请期待各种奇葩错误分析…………………………………………

  • 大小: 12 KB
  • 大小: 30.9 KB
  • 大小: 39.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics