1.实现图形、图片、信息的发送,首先写了一个服务器的界面,在界面上给按钮添加了ActionListener 的监听器,目的是为了写一个判断的标志区别画线,画圆及发送图片的功能.然而,服务器发送直线和圆我是另外创建了一个鼠标监听器MouseListener,每当释放鼠标的时候根据前面的判断标志画一条线或是或一个圆.
2.值得注意的是画完一条线或是画完一个圆后就发送出去.假如要是等着线或是圆都画完了才发送这就会出现问题,比如说服务器要判断到底什么时候才能画完线以及圆,还有一点就是画线和画圆与发送消息不同的地方时,在定义消息发送的时候我是定义的一个字节一个字节的发送,而在发送直线、圆的时候定义的是发送5个int,第一个int判断发送的图形,后面4个int是为了保证有两点坐标表实现画线画圆的操作.发送图片也是类似的操作,每次发送四个int,第一个int实现判断发送的是图片,第二个int发送的是颜色rgb=image.getRGB(i,j);,后面两个int实现画一个点.代码如下:
public void mouseReleased(MouseEvent e) { x2 = e.getX(); y2 = e.getY(); //判断画直线 if(type == 1){ g.drawLine(x1,y1,x2,y2);//画出一条直线 ChatList.sendIntMg(1);//服务器的信息为1发送一条直线 ChatList.sendIntMg(x1); ChatList.sendIntMg(y1); ChatList.sendIntMg(x2); ChatList.sendIntMg(y2); System.out.println("画直线的方法执行了!!!"); } //判断画圆 if(type == 2){ g.drawOval(x1,y1,Math.abs(x2-x1),Math.abs(y2-y1));//画一个圆 ChatList.sendIntMg(2);//服务器的信息为2发送一个圆 ChatList.sendIntMg(x1); ChatList.sendIntMg(y1); ChatList.sendIntMg(x2); ChatList.sendIntMg(y2); System.out.println("画圆的方法执行了!!!"); }
3.发送图片的方法如下:通过一个按钮先实现了将图片画到自定义的面板上,画好后执行的操作还是即刻发送
if(e.getActionCommand().equals("发图")){ System.out.println(e.getActionCommand()); try { BufferedImage image = ImageIO.read(new File("images/桌面.png"));//存入一张图片 System.out.println("图片存放了!"); int w = image.getWidth();//得到图片的宽度 int h = image.getHeight();//得到图片高度 //遍历图片上的每一个像素点 for(int i=0;i<w;i++){ for(int j=0;j<h;j++){ rgb = image.getRGB(i, j);//图片上去的像素点 Color cl = new Color(rgb); g.setColor(cl);//画笔的颜色 //画图片其实就是画点 g.drawLine(i, j, i, j); //画出图片后就进行发送 ChatList.sendIntMg(4); ChatList.sendIntMg(i); ChatList.sendIntMg(j); ChatList.sendIntMg(rgb); } } } catch (IOException e1) { e1.printStackTrace(); } }
4.在图形以及信息发送之前首要的是给服务器定义一些方法,总的来说大的发面无非就是接收消息以及发送消息了.
(1)当点击服务器上的端口按钮时,实现服务器接收消息
//服务器接收消息的 方法 public void acceptMsg(){ //服务器接收消息 String strread = readString(ins); while(!strread.equals("exit")){ System.out.println("服务器: \r\n"+strread); String sin = "客户端: \r\n"+strread;//客户端收到的消息 byte [] byt = sin.getBytes(); ChatList.sendMsg(byt); jta.setText("客户端: \r\n"+sin); strread = readString(ins); }
(2)服务器发送消息,每次发送一个字节
//服务器群发消息的方法 public void sendAll(byte [] by){ try { dao.write(by); dao.flush(); } catch (IOException e) { e.printStackTrace(); } }
(3)服务器读取直线,其实质就是每次都读到一个int值
//服务器接收直线 public void readLine(){ try { x1 = dai.readInt(); y1 = dai.readInt(); x2 = dai.readInt(); y2 = dai.readInt(); g.drawLine(x1,y1,x2,y2); } catch (IOException e) { e.printStackTrace(); } }
(4)服务器接收到画圆的方法与画线的方法类似,也是每次读到一个int字节
//服务器接收圆的方法 public void readCycle(){ try { x1 = dai.readInt(); y1 = dai.readInt(); x2 = dai.readInt(); y2 = dai.readInt(); g.drawOval(x1,y1,Math.abs(x2-x1),Math.abs(y2-y1)); } catch (IOException e) { e.printStackTrace(); } }
(5)服务器读取到发送图片的方法
//定义接收图片的方法 public void readpicture(){ try { i = dai.readInt(); j = dai.readInt(); //画图片 g.drawLine(i,j,i,j); } catch (IOException e) { e.printStackTrace(); } }
(6)既然有了接收int相当于每次读到四个字节的方法,当然要有发送int的方法了
//定义一个服务器发int的方法 public void sendInt(int flag){ try { dao.writeInt(flag); System.out.println("发送flag:"+flag); dao.flush(); } catch (IOException e) { e.printStackTrace(); } }
(7)为了简便期间以及便易其他地方调用最后定义了一个方法将上述方法包装到一个方法里面
//定义一个服务器与客户端连接的方法 public void towork(java.net.Socket client){ try { //获取输入输出流 ins = client.getInputStream(); ous = client.getOutputStream(); dai = new DataInputStream(ins);//创建一个读入数据的对象 dao = new DataOutputStream(ous);//创建一个写数据的对 //设置判断标识符 int flag = dai.read(); while(true){ System.out.println("读出的flag是: "+flag); //当读到1的时候画线 if(flag == 1){ readLine(); } //当读到2的时候画圆 if(flag == 2){ readCycle(); } //当读到3的时候发送消息 if(flag == 3} acceptMsg(); } if(flag == 4){ readpicture(); } flag = dai.readInt();//读取多个信息 } } catch (IOException e) { e.printStackTrace(); } }
5.自己的理解就是其实当服务器与客户端进行连接之后就相当于可以把客户端也看做成服务器所以说,客户端界面的方法与服务器的方法是类似的这里就不一一列举了.不过,我单独用另外的一个类定义了客户端的方法了.与服务器的方法有一点区别的是我定义了一个客户端的连接方法,实现如下:
//定义服务器与客户端连接的方法 public boolean Connect(){ try { //创建客户端与服务器连接的对象 java.net.Socket soclient = new java.net.Socket(this.ip,this.port); System.out.println("客户端与服务器连接成功了!!!"); //获取输入输出流 ins = soclient.getInputStream(); ous = soclient.getOutputStream(); //数据输入输出流 dai = new DataInputStream(ins); dao = new DataOutputStream(ous); System.out.println("Connect方法执行了!!!"); return true; } catch (Exception e) { e.printStackTrace(); } return false }
6.在此,附上服务器界面的代码客户端的于此类似
package cgh20130730通信发送图形; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.image.BufferedImage; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; /** * 创建一个服务器界面类继承自JFrame * @author Allen * */ public class ServerUI extends JFrame { /** * 程序的入口主函数 * @param args */ public static void main(String[] args) { //创建对象调用窗体初始化的方法 ServerUI sr = new ServerUI(); sr.INtUI(); } private int x1,y1; private int x2, y2;//坐标属性 private int nport; private int type; private DataInputStream dai; private DataOutputStream dao; private Graphics g; private int rgb; //初始化一个窗体 public void INtUI() { this.setTitle("服务器"); this.setSize(700,650); this.setLocationRelativeTo(null); this.setResizable(false); //设置窗体的流式布局 this.setLayout(new FlowLayout()); //创建按钮对象 JButton jbu = new JButton("端口"); JButton jbu1 = new JButton("发送"); //创建文本框对象 final JTextField jte = new JTextField(30); final JTextField jte1 = new JTextField(30); //创建一个纯文本多行区域 final JTextArea jta = new JTextArea(); jta.setPreferredSize(new Dimension(650,200)); //添加到窗体 this.add(jbu); this.add(jte); this.add(jbu1); this.add(jte1); this.add(jta); //创建一个面板对象 JPanel jpa = new JPanel(); jpa.setPreferredSize(new Dimension(650,350)); jpa.setBackground(Color.GRAY); JButton jbu2 = new JButton("画线"); JButton jbu3 = new JButton("画圆"); JButton jbu4 = new JButton("发图"); jpa.add(jbu2); jpa.add(jbu3); jpa.add(jbu4); //添加面板 this.add(jpa); //显示窗体是否可见 this.setVisible(true); //取得面板上的画布 final Graphics g = jpa.getGraphics(); //动作监听器 ActionListener action = new ActionListener(){ public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("端口")){ nport = Integer.parseInt(jte.getText()); //创建一个服务器类的对象 Server ser = new Server(9007,jta,dao,g); ser.start(); System.out.println("端口号是:==="+nport); } if(e.getActionCommand().equals("发送")){ String strn = jte1.getText(); jta.append("服务器: \r\n"+strn+"\r\n"); ChatList.sendMsg(strn.getBytes()); ChatList.sendIntMg(3); //发完后清空文本 jte1.setText(""); } /* * 画线以及画圆的协议 */ if(e.getActionCommand().equals("画线")){ type = 1; } if(e.getActionCommand().equals("画圆")){ type = 2; } if(e.getActionCommand().equals("发图")){ System.out.println(e.getActionCommand()); try { BufferedImage image = ImageIO.read(new File("images/桌面.png"));//存入一张图片 System.out.println("图片存放了!"); int w = image.getWidth();//得到图片的宽度 int h = image.getHeight();//得到图片高度 //遍历图片上的每一个像素点 for(int i=0;i<w;i++){ for(int j=0;j<h;j++){ rgb = image.getRGB(i, j);//图片上去的像素点 Color cl = new Color(rgb); g.setColor(cl);//画笔的颜色 //画图片其实就是画点 g.drawLine(i, j, i, j); //画出图片后就进行发送 ChatList.sendIntMg(4); ChatList.sendIntMg(i); ChatList.sendIntMg(j); ChatList.sendIntMg(rgb); } } } catch (IOException e1) { e1.printStackTrace(); } } } }; jbu.addActionListener(action); jbu1.addActionListener(action); jbu2.addActionListener(action); jbu3.addActionListener(action); jbu4.addActionListener(action); //面板上添加监听器 MouseListener mouse = new MouseListener(){ public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { x1 = e.getX(); y1 = e.getY(); } public void mouseReleased(MouseEvent e) { x2 = e.getX(); y2 = e.getY(); //判断画直线 if(type == 1){ g.drawLine(x1,y1,x2,y2);//画出一条直线 ChatList.sendIntMg(1);//服务器的信息为1发送一条直线 ChatList.sendIntMg(x1); ChatList.sendIntMg(y1); ChatList.sendIntMg(x2); ChatList.sendIntMg(y2); System.out.println("画直线的方法执行了!!!"); } //判断画圆 if(type == 2){ g.drawOval(x1,y1,Math.abs(x2-x1),Math.abs(y2-y1));//画一个圆 ChatList.sendIntMg(2);//服务器的信息为2发送一个圆 ChatList.sendIntMg(x1); ChatList.sendIntMg(y1); ChatList.sendIntMg(x2); ChatList.sendIntMg(y2); System.out.println("画圆的方法执行了!!!"); } } }; jpa.addMouseListener(mouse);//面板添加监听器 } }
7.简单总结一下该过程中遇到的问题:
(1)服务器发送直线和圆经过测试没有问题可以发送出去,但是在客户端一直显示不出来,原来是自己在定义客户端接收方法的时候出现了一些小问题
(2)服务器可以向客户端发送消息,而反过来的操作就没法实现,最后发现了服务器的方法里面,自己吧read()字节的方法,写成而来readInt()了,因为每次发送的时候自己定义的是发送一个字节
(3)在写完这个程序的时候还有不足的地方就是还没有实现客户端发送直线圆及图片的服务器的方法.
(4)到此结束,希望大家能够多多指正代码中的不足......
相关推荐
本示例将聚焦于如何使用Qt库在PC上实现TCP通信,以实现客户端和服务端之间的图片互传。 首先,我们需要了解Qt库。Qt是一个跨平台的应用开发框架,由C++编写,它提供了一系列丰富的API用于图形用户界面、网络编程、...
在本文中,我们将深入探讨如何使用Qt框架来实现一个简单的聊天小程序,该程序支持发送文字消息和图片,并具有用户友好的界面。Qt是一个强大的跨平台应用程序开发框架,它提供了丰富的库和工具,使得构建GUI应用变得...
在现代信息技术领域,电信设备是实现远程通信的关键组成部分。标题提到的"电信设备-包括图像信息显示设备的通信终端、图像信息显示方法及图像信息显示程序"是一个涵盖多个技术领域的主题,主要涉及到通信终端、图像...
在这个实例中,你可以用这些组件创建一个窗口,显示串口信息,设置波特率、数据位、停止位等参数,并添加“打开串口”、“关闭串口”、“发送数据”等功能按钮。 4. **事件监听**:为了响应用户的操作,你需要为GUI...
不同的无线通讯终端可能支持不同的图像格式和分辨率,因此在发送信息时,需要确保图像格式是目标设备可以识别的。此外,还可能需要进行适配处理,比如根据屏幕尺寸调整图像比例,或者为不同操作系统(如iOS、Android...
在本文中,我们将深入探讨如何在MFC(Microsoft Foundation Classes)框架中利用GDI+实现图形的平滑移动,并通过线程控制实现图形界面的高效交互。MFC是微软提供的一种C++类库,用于构建Windows应用程序,而GDI+是...
本文将深入探讨如何使用汇编语言接口程序来实现打印图形的功能,这在早期计算机系统和嵌入式系统开发中尤其常见。通过理解和掌握这个主题,开发者能够更好地理解底层计算机工作原理,提高程序执行效率。 首先,我们...
总之,迪文屏串口通信是嵌入式系统设计中的一种高效解决方案,它使得在STM32等单片机上实现丰富的图形界面变得更加便捷。掌握迪文屏的使用和串口通信技术,对于提升产品的用户体验和降低开发成本具有重要意义。
学习时,可以从基础的串口通信开始,逐步添加坐标显示和图像处理等功能,最后实现进程间的通信协同工作。 综合以上,这个项目提供了一个很好的平台,让学生或开发者了解如何将串口通信与其他技术,如GUI编程、图像...
再者,用于图形信息传送和接收的设备是实现通信的关键硬件。这包括发送端的编码设备,如计算机、智能手机,以及接收端的解码设备,如显示器、打印机。设备的设计需考虑兼容性,确保不同格式的图像数据能被正确解析。...
在本项目中,我们主要探讨的是如何利用Qt和LCM(Language Communication Modules)框架来创建一个publisher和listener窗口应用程序,这两个程序分别用于发送和接收图像和字符串数据。Qt是一个广泛使用的跨平台应用...
STM32串口发送彩色图片是一项在嵌入式系统中常见的任务,特别是在使用微控制器进行图像处理和通信的应用中。STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于各种电子设备。OV7725是一款常用的CMOS图像传感器...
即时通信系统(Java实现)是一种基于Java编程语言构建的在线通信平台,允许用户实时发送和接收文本、语音、图片等多种类型的信息。这个系统的核心特点在于它的实时性,确保信息能够迅速传递,为用户提供无缝的交流...
"51单片机串口通信实现16*16点阵显示" 串口通信概述 串口通信是单片机开发中最基本也是最重要的一种通信方式。串口通信可以将单片机与外部设备连接起来,实现数据的传输和交换。在这个项目中,我们使用51单片机与...
【标题】:“Java聊天室之传送图片文字等功能的实现” 这个标题揭示了我们将要探讨的是一个基于Java开发的聊天室应用程序,它具有发送文本消息以及传输图像等多媒体功能。在Java编程领域,创建一个聊天室涉及到网络...
通信系统的概念包括信息的发送、传输和接收三个过程。 二、调制与解调在通信系统中的重要性 调制与解调在信息的传输过程中占据着重要的地位,是不可或缺的。调制是指将信息信号转换为适合传输的形式,以便在传输...
1. **图像编码**:在发送图像前,LabVIEW可以使用图像处理库将图片转换为适合网络传输的格式。常见的有位图(BMP)、JPEG或PNG等。JPEG适用于连续色调图像,PNG支持透明度且无损压缩。 2. **分块传输**:由于TCP/IP...
075、VB实现串口通信,发送命令从而接收相应数据 076、VB使用mscom控件实现PC机与单片机串口通信 077、VB通过COM串口读取条形码设备 078、VB通过串口控制单片机读写24C02源代码 079、VB通讯程序,连接串口可在电脑...
在Matlab环境下实现基于GUI的串口通信程序设计,主要依赖于Matlab中的串口通信工具箱(Serial Port Toolbox)。该工具箱提供了许多用于打开和配置串口、读写数据以及关闭串口的函数。设计这样的程序,首先需要创建一...