Java小程序之简易网络画板
一、前言:
Java是一门网络编程语言,强大的网络可以让数据进行传送;今天,我们就小试牛刀,看看Java是如何进行网络传输数据的;
二、项目分析:
1、功能需求:
我们前面做个一个小项目--Java画板;现在,假设需要实现这样一个功能,打开两个画板界面,当在一个画板上画东西时,另一个画板能够显示该画板的所画的东西;即网络画板;
2、功能实现:
那么该功能如何实现呢?首先,我们得分析下,如何让我们绘制的图形信息传递到另一个画板上;假设我们绘制的图形是一条直线,绘制这条直线的信息是直线的两端点坐标(两点就可以确定一条直线),我们只需要记录该条直线的连个坐标值,把坐标值的信息发送给服务器,再让服务器转发该信息,在另一个客户端接收到这条信息后,用这条信息绘制一条直线;当然,这里只考虑了直线这一种图形;如果有正方形等其他图形该如何区分呢?这里我们可以自己定义一种协议,协议如下:
图形类型信息+图形信息
1代表直线+直线坐标
2代表正方形+正方形的坐标
......
这样,当客户端接收信息后,先可以判断图形类型,在根据图形类型绘制不同的图形
三、项目实现思路:
1、服务器搭建
2、实现服务器的数据传递
3、画板界面实现
4、画板鼠标监听
5、客户端接收数据后绘制下对应的图形
四、项目源代码:(服务器端和客户端时两个不同的人工程,类似文件压缩有解压缩)
工程结构图:
                      
服务器端:
package Server;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;public class Myserver {public ServerSocket server;public static ArrayList<ServerThread> list = new ArrayList<ServerThread>();public void startServer() {try {server = new ServerSocket(9090);System.out.println("服务器已经建立......");while(true){Socket socket =server.accept();System.out.println("有客户端连接进来了......");ServerThread st = new ServerThread(socket);st.start();
//              System.out.println("线程启动......");list.add(st);}} catch (Exception e) {e.printStackTrace();}}}
package Server;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;import javax.swing.JOptionPane;public class ServerThread extends Thread{public Socket socket;public DataInputStream dis ;public DataOutputStream dos;public ServerThread(Socket socket) {this.socket=socket;}public void run() {try {//获取输入输出流InputStream ins =socket.getInputStream();OutputStream ous = socket.getOutputStream();//将字节流包装成数据流dis=new DataInputStream(ins);dos=new DataOutputStream(ous);while(true){int value=dis.read();
//              System.out.println(value);//服务器转发消息for (int i = 0; i <Myserver.list.size(); i++) {ServerThread st =Myserver.list.get(i);if(st!=this){st.dos.write(value);st.dos.flush();}}
//              System.out.println("服务器已经发送消息");}}catch (SocketException e) {try {Myserver.list.remove(this);this.socket.close();System.out.println("客户端已经退出......");
//              JOptionPane.showMessageDialog(null, "客户端退出!");} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}
//          e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}
}

服务器端主函数

package Server;public class ServerTest {public static void main(String[] args) {Myserver ms = new Myserver();ms.startServer();}}

客户端

package com.huaxin.view;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;import javax.swing.JFrame;import com.huaxin.controller.ClientControl;
public class DrawUI extends JFrame{public Socket socket;public Graphics2D g;public ClientControl control;//界面初始化的socketpublic DrawUI() {try {socket = new Socket("localhost",9090);} catch (Exception e) {e.printStackTrace();} }public void initFrame() {//设置窗体属性this.setTitle("网络画板");this.setSize(600, 500);this.setDefaultCloseOperation(3);this.setLocationRelativeTo(null);this.setVisible(true);//拿到窗体的画笔g = (Graphics2D)this.getGraphics();g.setColor(Color.RED);//控制器初始化control = new ClientControl(g,socket);//添加鼠标监听DrawListener listener = new DrawListener(control);this.addMouseListener(listener);this.addMouseMotionListener(listener);//控制器接收数据并处理数据control.receiveData();}}
package com.huaxin.view;import java.awt.Graphics2D;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;import com.huaxin.controller.ClientControl;public class DrawListener extends MouseAdapter {public int x1,y1,x2,y2,x4,y4;public ClientControl control;//构造函数接受控制器对象public DrawListener(ClientControl control) {this.control=control;}//监听鼠标按下事件public void mousePressed(MouseEvent e) {//获取鼠标按下的坐标值x1=e.getX();y1=e.getY();x4=x1;y4=y1;}//获取鼠标释放的坐标值
//  public void mouseReleased(MouseEvent e) {
//      x2=e.getX();
//      y2=e.getY();
//      //当鼠标释放的时候在该画板上绘制一条直线
//      control.g.drawLine(x4, y4, x2, y2);
//      //第一个1代表图形类型,第二个1代表画笔 粗细
//      //将直线信息通过控制器发送给服务器端
//      control.sendData(1,x4, y4, x2, y2,1);
//  }//监听鼠标拖动事件(铅笔功能)public void mouseDragged(MouseEvent e) {int x3=e.getX();int y3=e.getY();control.g.drawLine(x1, y1, x3, y3);control.sendData(1,x1, y1, x3, y3,1);x1=x3;y1=y3;}
}
package com.huaxin.controller;import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class ClientControl {private Socket socket;public int x1,y1,x2,y2,color;public byte type,strock;public Graphics2D g;public ClientControl(Graphics2D g,Socket socket) {this.g=g;this.socket=socket;}//不断接受服务器发送过来的信息public void receiveData(){new Thread(){public void run() {try {while(true){//获取输入输出流InputStream ins = socket.getInputStream();OutputStream ous=socket.getOutputStream();//将字节流包装成数据流DataInputStream dis=new DataInputStream(ins);DataOutputStream dos= new DataOutputStream(ous);
//                      System.out.println("kehuduan kaishi dushuju。。。。。。");//读图形类型type=dis.readByte();//读坐标x1=dis.readInt();y1=dis.readInt();x2=dis.readInt();y2=dis.readInt();//读粗细strock=dis.readByte();//读颜色color=dis.readInt();//读完数据之后画图形
//                      System.out.print("客户端接受数据:");
//                      System.out.println("type:"+type+"x1:"+x1+"y1:"+y1+"x2:"+y2+"strock:"+strock+"Color:"+type);drawGra();}} catch (Exception e) {
//                  System.out.println("kehuudan tuichu。。。。。");e.printStackTrace();}};}.start();}//发送图形数据给服务器public void sendData(int type,int x1,int y1,int x2,int y2,int strock){try {//获取输入输出流InputStream ins = socket.getInputStream();OutputStream ous=socket.getOutputStream();//将字节流包装成数据流DataInputStream    dis=new DataInputStream(ins);DataOutputStream dos= new DataOutputStream(ous);//写图形类型dos.writeByte(type);//写坐标dos.writeInt(x1);dos.writeInt(y1);dos.writeInt(x2);dos.writeInt(y2);//写粗细dos.writeByte(strock);//写颜色dos.writeInt(g.getColor().getRGB());dos.flush();
//          System.out.println("type:"+type+"x1:"+x1+"y1:"+y1+"x2:"+y2+"strock:"+strock+"Color:"+type);
//          System.out.println("客户端已经发送数据......");} catch (Exception e) {e.printStackTrace();}}//绘制图形public void drawGra() {g.setColor(new Color(color));g.setStroke(new BasicStroke(strock));if(type==1){g.drawLine(x1, y1, x2, y2);
//          System.out.println("hutu 。。。。。");}}}
package com.huaxin.view;public class ClientTest {public static void main(String[] args) {DrawUI ui = new DrawUI();ui.initFrame();}
}

五、运行结果:

六、项目总结:
1、知道了网络中的数据是如何传送和接收的;
2、对Java是一种网络编程语言有了更深的了解;
3、对Java通信等知识有了更深的认知;
我们已经领略了Java作为一门网络编程语言如何编写程序,我们可以用今天学到的知识,看看很多的游戏,可以慢慢了解其中的原理,比如网络五子棋,网络版的你画我猜等;下篇将给大家带来简易版的你画我猜小项目;敬请期待!

Java小程序之简易网络画板相关推荐

  1. Java实现的一个简易网络画板

    文章目录 前言 一.准备工作 二.代码 1.客户机 2.服务器 前言 主要功能: 类似于腾讯会议. 客户机获取电脑摄像头拍的照片(视频)实时发给服务器.再两端的界面同时显示.客户机上还可以画图,并发给 ...

  2. Java小程序——模仿Win系统画板

    好久之前的一个小作业,用Java实现画板.毕竟当时花费不少功夫调试,在这里分享给大家,希望能够对需要的小伙伴有所帮助!声明一下,以下代码为参考网上相关代码修改,绝非完全原创. 运行效果图如下: 话不多 ...

  3. ssm springboot网络订餐点餐跑腿系统java 小程序025

    现阶段由于人们生活.工作.学习等节奏的加快,人们很重视时间的经济效应.尤其是在大学校园,随着校园的面积不断扩大.学校专业不断增多而导致的学生人数较以往大幅增加,加之学生的课业比较繁重,传统的食堂排队就 ...

  4. Wifi热点java_用笔记本电脑开启热点Java小程序

    用笔记本电脑开启热点Java小程序是一条命令设置笔记本成无线热点, 制作"开启无线热点工具,这个小工具实际上是用java来执行cmd命令来完成操作,当然也可以反射jar里边的字节码文件. 使 ...

  5. java小程序_Java小程序

    java小程序 An applet is a special kind of Java program that runs in a Java enabled browser. This is the ...

  6. dw网页插入java小程序_DW网页设计100例35:构建Java插入模块

    Java 是一种程序设计语言, Java applet ( Java 小程序)是在 Java 的基础上演变而成的.能够嵌入在网页中的.可以执行一定小任务的应用程序. 20060407140110aa1 ...

  7. dw网页插入java小程序_DW网页设计35:构建Java插入模块

    Java 是一种程序设计语言, Java applet ( Java 小程序)是在 Java 的基础上演变而成的.能够嵌入在网页中的.可以执行一定小任务的应用程序. 效果说明建立文件,以 Java 计 ...

  8. java小程序源代码,详细说明

    零基础的小白,如何学好Java?要多动手实践学习Java就像学习数学一样,在懂得理论知识后,一定要实践.学习Java不能搭便车,有些时候,句子和语法看起来很简单,但是亲自实践起来却总有自己不知道的知识 ...

  9. java程序获取外部java程序的控件,将 Java 小程序迁移到 Microsoft J# 浏览器控件-JSP教程,Java技巧及代码...

    visual j# .net 小组 microsoft corporation 摘要:通过 microsoft j# 浏览器控件,开发人员可以将所编写的在 java 虚拟机上运行的 java 小程序迁 ...

最新文章

  1. 【HDU】4706 Children's Day(模拟)
  2. 怎么打断点_搞笑段子: 有次相亲, 双方父母都在, 我坐下就给自己点了支烟
  3. 【思维导图】利用LSTM(长短期记忆网络)来处理脑电数据
  4. Linux01-企业核心技术之逻辑卷LVM原理深入讲解35
  5. mysql avg 时间_MySQL或Rails在特定日期范围内每天获得AVG的最佳方式
  6. 【TypeScript】do...while 循环
  7. swiper怎么在HTML引入JS文件,Swiper.js插件超简单实现轮播图
  8. linux学习项目,[ Linux运维学习 ] 路径及实战项目合集
  9. eovs实训报告总结心得_实训总结与心得体会3篇_心得体会
  10. CCS3的过渡、变换、动画以及响应式布局、弹性布局
  11. 网页滚动条上下滚动固定元素左右不固定之sticky
  12. mysql知识点汇总
  13. NVIDIA Parallel Nsight
  14. java modbus通讯协议_Modbus通 讯 协 议
  15. vc运行库各版本下载
  16. 那些年我们一起上过的黑客网站
  17. VB6.0超级模块-内存操作篇-含特征码搜索和HOOK跳转构造
  18. android7.1.2 xposed,安卓7.1 xposed框架
  19. python 构建和解析邮件
  20. Python+Vue计算机毕业设计酒店管理系统(前台后台)i2agu(源码+程序+LW+部署)

热门文章

  1. vant混合表单校验,以及标题前加※
  2. [择校]东南大学——信息科学与工程学院920考研
  3. 最大熵模型(MEM)
  4. g1垃圾回收器与cms垃圾回收器详解及最佳实践
  5. 政务大数据的概念模型
  6. 云python编译时间短_(第1天)1.2 在线云编辑器:有网络,就能学Python
  7. 关于可调式肩外展固定支具的介绍,肩外展矫形器
  8. 【智慧城市】交通路口摄像头转俯视图
  9. 创建隐身浏览器-Creating Incognito Browser
  10. [原创]学会批处理,用心学很容易!