`
百合不是茶
  • 浏览: 354691 次
社区版块
存档分类
最新评论

网络画图板(一)

阅读更多

 

网络画图板;客户端在向服务器发送信息的时候需要定义发送的协议, 简称通信协议

 

形状类型   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();
			}

		}

	}
}

 

 

 

 

  • 大小: 35.5 KB
  • 大小: 79.4 KB
  • 大小: 79.4 KB
0
0
分享到:
评论
1 楼 qindongliang1922 2014-09-09  
图像看着很给力,写的比较用心,赞一个,java swing这种技术,楼主还在研究吗,公司有用吧

相关推荐

    QT画图板详例

    QT画图板是一个基于Qt库开发的图形用户界面应用程序,主要功能是提供一个交互式的画布,用户可以在上面进行绘图操作。对于初学者来说,QT画图板是一个极好的学习资源,它展示了Qt库在图形绘制和用户交互方面的强大...

    QTcreator写画图板

    在本文档中,我们将探讨如何使用QtCreator来编写一个画图板程序。画图板是一个基础且功能丰富的应用,常常作为学习图形用户界面(GUI)编程的一个入门项目。本文将重点介绍Qt的GUI框架、主要组件以及编程概念。 ###...

    基于qt实现的画图板

    这个"基于qt实现的画图板"项目提供了一个基础的图形用户界面(GUI)应用,让用户能够进行基本的绘画操作,比如选择画笔、填充颜色、打开和保存图像。以下是关于这个项目的一些关键知识点和相关技术的详细解释: 1. ...

    网络画图板

    "网络画图板"是一个基于源码开发的工具,它主要服务于那些需要在网络技术领域进行图形化设计和演示的用户。这个工具可能包含了丰富的功能,比如绘制网络拓扑图、设计网络架构、模拟数据传输路径等,使得网络专业人士...

    画图板,图形处理,模仿window画图板

    在IT领域,"画图板"通常指的是一个用于创建、编辑和操作简单图形的应用程序,类似于Windows操作系统内置的“画图”程序。这个程序提供了一系列基础的绘图工具,让用户可以进行基本的图像创作和编辑。下面将详细介绍...

    flash交互画图板

    本主题聚焦于"Flash交互画图板",这是一个利用ActionScript编程语言实现的一帧交互程序。ActionScript是Flash的核心,用于创建动态内容、控制影片剪辑、处理用户输入以及与其他软件进行数据交换。 首先,我们来看...

    画图板总结

    综上所述,画图板虽然看似简单,但其背后涉及到的技术和设计思路却相当丰富,包括事件处理、用户交互、图形渲染、数据结构、文件操作和网络通信等多个方面。无论是学习编程基础还是深入研究前端技术,理解并实现一个...

    Java画图板,支持网络同步

    Java画图板是一款基于Java开发的图形用户界面(GUI)应用程序,它允许用户在屏幕上绘制图形,并具有网络同步功能。这个程序可能适用于教学、协作或者简单的创意表达,使得多个用户可以实时共享和编辑同一画布。 ...

    QGraphicesView画图板

    在本文中,我们将深入探讨如何使用Qt库中的`QGraphicsView`组件来创建一个功能丰富的画图板。`QGraphicsView`是Qt图形视图框架的一部分,它提供了一个灵活的界面来显示和操作复杂的2D图形,非常适合用于构建交互式的...

    QT_C++画图板源码论文开题报告任务书外文翻译全套毕业设计.zip

    QT_C++画图板源码论文开题报告任务书外文翻译全套毕业设计是一个综合性的项目,涵盖了多个方面的IT知识,特别关注了QT框架在C++中的应用。QT是一个跨平台的应用程序开发框架,用于创建桌面、移动和嵌入式应用程序。...

    VC++ 画图板 MFC,简单功能的实现 界面简洁 适合以此为基础添加自己的东西

    本项目主要涉及的是使用MFC创建一个简单的画图板应用,它提供了基础的绘图功能,并且设计简洁,非常适合初学者或者开发者作为扩展和定制的基础。 首先,MFC是微软为C++开发的一个框架,它封装了Windows API,简化了...

    five_11_30_draw_QT_画图板_

    标题中的"five_11_30_draw_QT_画图板_"似乎是一个项目或程序的命名,其中"QT"代表了Qt库,一个广泛使用的跨平台应用开发框架,尤其适用于图形用户界面(GUI)的创建。"画图板"则意味着这个项目是一个基于Qt的图形...

    C#画图板程序源码.rar

    标题中的"C#画图板程序源码"表明这是一个使用C#编程语言开发的图形用户界面应用,主要用于绘制图形。在C#中,这样的程序通常利用Windows Presentation Foundation (WPF)或Windows Forms框架来构建。接下来,我们将...

    QT简易画图板程序

    QT简易画图板程序是一个基于Qt库开发的简单图形绘制应用程序。Qt是一个跨平台的C++框架,广泛用于创建桌面、移动以及嵌入式设备的应用程序。本程序旨在提供一个基础的画图环境,用户可以在此基础上进行各种图形的...

    java网络画板(联网画图板)

    用java编写的网络画板应用,应用socket技术,可选择当客户端以及服务器端,局域网连接,可实时聊天,实时显示多方所画内容,可选线条粗细,颜色,实线虚线,以及图形样式,界面简洁,功能强大方便扩展,通过多线程可...

    画图板源码,C++增强版.rar

    在本项目中,它被用来实现一个画图板应用程序,这需要对C++的基础语法、类和对象、指针以及内存管理有深入的理解。 1. C++基础:理解C++的基本语法结构,包括变量声明、数据类型、运算符、流程控制语句(如if-else...

    java实现的模仿画图板的程序

    在Java编程领域,实现一个模仿画图板的程序是一项常见的练习,它可以帮助开发者熟悉图形用户界面(GUI)的创建和事件处理。这个程序允许用户绘制简单的图形,甚至能导入图片进行进一步的画图操作。下面将详细介绍这...

    visio常用模板包含深度学习网络模型等模板,论文画图模板工具

    Visio是一款强大的图形绘制软件,尤其在IT领域中,它被广泛用于绘制各种流程图、组织结构图以及网络架构图等。在这个特定的压缩包中,我们关注的是"visio常用模板",其中包括了用于描绘深度学习网络模型的工具,这...

    彩虹画图板源代码.zip

    "彩虹画图板源代码.zip" 是一个包含编程源代码的压缩文件,它提供了一个基于数字和字母转换颜色的画图程序。这个程序允许用户通过输入特定的字符序列来生成和编辑图像,这些字符序列与颜色值相对应,形成了一种独特...

Global site tag (gtag.js) - Google Analytics