今年的暑假集训,主要学的技术就是通信了,通过了解、学习、运用通信,我又进一步认识到了技术的深奥与伟大。初次接触通信,我所了解到的最简单的例子就是QQ。如不是学习了通信,我还从不了解QQ之间的通话到底是怎么回事,只能推测是一个窗口发消息一个窗口接收消息,殊不知聊天的两个窗口都只是客户端,而中间起最重要作用的是一个服务器。两个客户端都要讲消息发送到服务器,服务器再将消息发送到应发送到的客户端。那么,这时候会有人问:“那消息是如何传送的呢,又是以什么样的形式传送的?”这里,我们需要了解stream流的概念。
java中输入输出相关的类都是java.io包中,java将输入和输出抽像为叫做流的概念,并提供了相应的实现类;流是程序和外界进行数据交换的通道在OOP中的表现,可以将流对象理解从一个水管,它从一个地方输入流据,向另外一个地方输出数据:输入流是我们在程序中从某个地方(文件、网络)读取数据时使用;输出流是我们将数据发送到某个地方(文件、网络、控制台)时使用。
流按方向分为输入流(InputStream)和输出流(OutputStream):程序可以使用输入流对象从数据源读取数据,使用输出流对象向目的地写出数据,对应的流类名中一般有Input和Output词。
流按性质分为:
基础字节流(原始流): InputStream和OutputStream是java中可以按最小数据单位读取的流,即每次读写一个字节,基础流是直接连结到输入源的流。
过滤流(节点流): 过滤流是用来包装基础流以提供更好的特性,如提供缓冲功能的BufferedInputStream和BufferedOutputStream;过滤流是用来包装基础流或其它流(以其它流对象为构造参数)---它并不直接连结到数据源。
基与具体数据类型的流: 如果要从流中读取指定的数据类型的数据,如int,long型的数值,则要使用DataInput/DataOutput接口的子类如DataInputStream和DataOutputStream;
基与对象读写:JDK提供了一种强大的功能流,即对象的输入输出流,即ObjectInput/ObjectOutput接口的子类,如我们使用ObjectOutputstream将一个java对象写入到文件中;对象流的读取就是常说的java对象序列化技术。
当我们发送消息时,就把数据存放在输出流里,当我们接收数据是就从输入流里读取数据。下面我们以一个服务器(可以接受消息,可以发送消息)为例:
ServerSocket server=new ServerSocket(p1234);//在指定端口1234上启动一个服务器。
Socket client=server.accept();//让服务器进入等待状态,创建一个ServerSocket client。
OutputStream out=client.getOutputStream();
InputStream ins=client.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(ins, "gb2312"));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out, "gb2312"));
String s="hellow,你好.com"+"\r\n";
writer.write(s);
writer.flush();//通过输出流发送数据
while(true){
String str = reader.readLine();//从输入流中读取数据
if(str == null)
break;}
类似的,我们可以运用通信来做一个网络画板。当我们在一方画时,另一方也同样在画:
客户端在画的同时不断将数据输入到输出流里,服务器端不断从输入流里读取数据,并在服务器端的画板上画。代码如下:
服务器端:
import java.awt.Graphics; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JFrame; public class ServerJFrame extends JFrame implements Runnable{ private Socket sc; String s4[] = new String[4]; Graphics gr; public static void main(String[]arg) throws IOException{ new ServerJFrame().step(1234); } public ServerJFrame(){ this.setTitle("在我上面接收"); this.setBounds(400, 300, 400, 300); this.setDefaultCloseOperation(3); this.setResizable(false); this.setVisible(true); gr = this.getGraphics(); } public void run() { try { InputStream ins = sc.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(ins)); while(true){ String s = reader.readLine(); if(s == null) break; s4 = s.split(" "); int x1 = Integer.parseInt(s4[0]); int x2 = Integer.parseInt(s4[1]); int x3 = Integer.parseInt(s4[2]); int x4 = Integer.parseInt(s4[3]); gr.drawLine(x1, x2, x3, x4); } sc.close(); } catch (IOException e) { e.printStackTrace(); } } public void step(int port) throws IOException{ ServerSocket ss = new ServerSocket(port); while(true){ sc = ss.accept(); new Thread(this).start(); } } }
客户端
import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; import javax.swing.JFrame; public class ClientFrame extends JFrame implements Runnable,MouseMotionListener,MouseListener{ BufferedWriter writer; boolean bto = true; int x1,y1,x2,y2; Graphics gr; public static void main(String []arg){ new Thread(new ClientFrame()).start(); } public ClientFrame(){ this.setTitle("在我上面画!"); this.setBounds(400, 300, 400, 300); this.setDefaultCloseOperation(3); this.setResizable(false); this.setVisible(true); gr = this.getGraphics(); this.addMouseListener(this); this.addMouseMotionListener(this); } public void run(){ try { Socket sc = new Socket("localhost",1234); OutputStream out = sc.getOutputStream(); writer = new BufferedWriter(new OutputStreamWriter(out)); while(bto){ } sc.close(); } catch (Exception ex){ bto = false; } } public void sendMsg(int x1,int y1,int x2,int y2) throws IOException{ writer.write(x1+" "+y1+" "+x2+" "+y2+"\r\n"); writer.flush(); } @Override public void mouseDragged(MouseEvent e) { x2 = e.getX(); y2 = e.getY(); gr.drawLine(x1, y1, x2, y2); try { this.sendMsg(x1, y1, x2, y2); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } x1 = x2; y1 = y2; } @Override public void mouseMoved(MouseEvent e) { } @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { x1 = e.getX(); y1 = e.getY(); } @Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } }
运行结果:
在学习通信的过程中,我遇到了一些问题,以前用的少所以没注意,我在传参这方面有些混乱,局部变量经常当成全局变量用导致经常出错,还有就是输入输出流用的不太熟练,我会多加练习,正确熟练运用输入输出流,学好通信。
相关推荐
在“Mina、Netty、Twisted一起学(四):定制自己的协议.docx”中,我们将学习如何在Netty中定义和实现自定义的通信协议。 Twisted则是Python社区中的网络编程框架,它支持多种协议,包括HTTP、SMTP、FTP等,并且...
管道(Pipes)是一种进程间通信(IPC, Inter-Process Communication)机制,主要用于在同一台计算机上的两个或多个进程之间进行数据交换。管道分为两种类型:无名管道(unnamed pipes)和命名管道(named pipes)。...
《一起学用Flash做动画》是一门针对初学者的教程,旨在帮助用户掌握Adobe Flash这一经典动画制作软件的基础知识和技巧。Flash作为一种强大的矢量图形和交互式内容创作工具,曾广泛应用于网页动画、游戏开发以及教学...
《特权和你一起学NIOS2》是一份全面的教程,专为初学者设计,旨在深入理解NIOS2嵌入式处理器系统。本教程通过详细讲解和实例演示,帮助学习者掌握NIOS2的基本概念、架构及应用。下面将根据标题、描述以及标签,深入...
【特权和你一起学习NIOS2】:这个标题暗示了我们即将探讨的是关于NIOS II处理器的学习之旅,其中“特权”可能是指深入理解和掌握处理器的内部运作机制,以及如何利用其高级功能。NIOS II是 Altera 公司(现为Intel ...
5. **网络通信能力**:配备了RS232和RS485通信接口,支持构建485网络,每个PLC单元都可以作为网络中的节点,支持人机界面操作,大大提高了系统的网络化程度。 #### 硬件架构概述 - **上端子排**:包括电源输入(N、...
关于socket基本通信的学习 里面有使用的方法 欢迎一起学习!
《爱上FPGA开发特权和你一起学NIOS2》是一本深入浅出的教程,旨在帮助读者掌握FPGA(Field-Programmable Gate Array)开发技术,特别是NIOS II嵌入式处理器的使用。FPGA是一种可编程逻辑器件,允许用户根据需求...
《特权和你一起学NIOS2》是一套深受学习者喜爱的教程,旨在帮助初学者深入理解并掌握NIOS2嵌入式处理器的使用。特权同学作为教程的作者,以其通俗易懂、详尽细致的教学风格,使得这个教程在FPGA(Field-Programmable...
业余电台通信,是一种爱好者通过无线电设备进行的非商业性通信活动。它涵盖了广泛的频率范围,允许业余无线电爱好者在国际上交流、学习无线电技术,并在紧急...让我们一起探索无线电的广阔世界,享受通信带来的快乐吧!
同步串行通信中,数据和时钟信号一起传输,确保接收端能正确解析数据;异步串行通信则通过起始位、停止位和校验位来确定数据的边界。 2. **接口标准**: - 在串行通信中,常见的接口标准有RS-232、RS-485、USB、...
在通信信息网的整体架构中,我们首先要了解的是基础的网络层次模型。这一模型通常指的是OSI七层模型或TCP/IP四层(或五层)模型。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,每一层都...
MATLAB允许我们将这些部分组合在一起,进行端到端的系统级仿真,以评估整个通信链路的性能。 综上所述,“现代通信系统-现代通信系统使用MATLAB3.pdf”这份资料可能涵盖了上述多个方面的内容,通过学习和实践,读者...
本人在本科学习通信原理阶段整理的各章节的思维导图,欢迎大家一起学习,如果发现有错误的地方,希望大家批评指正。谢谢!!!!
【标题】:“一起学习CC3200” 【正文】: 在嵌入式系统的世界里,CC3200是一款由Texas Instruments(TI)推出的高效能微控制器,它集成了强大的Wi-Fi功能,广泛应用于物联网(IoT)设备。本学习资源主要针对CC3200的...
混频器是将两个信号(通常是一个高频信号和一个低频信号)结合在一起,产生新的频率成分的器件。在通信系统中,混频器用于将接收到的射频信号转换到中频,以便进行后续处理。它的工作原理基于非线性器件,如二极管或...
华为新员工技术培训教材将这些内容综合在一起,通过深入浅出的讲解,帮助新员工快速掌握通信行业的核心技术,提升其专业素养。学习并理解这些技术,对于在通信行业工作的新员工来说至关重要,不仅可以增强他们的专业...
《跟我一起学习嵌入式Linux开发》第一季的教程是一份专为初学者设计的实践指导资料,旨在帮助用户快速入门嵌入式Linux系统开发。教程以图文并茂的方式呈现,每一步操作都有清晰的截图,使学习过程更加直观易懂。然而...
融合通信是一种将语音、数据、视频等多种通信方式融合在一起的新型通信服务,旨在提升用户沟通体验和工作效率。 4.3.1 手机 Native 终端:这部分内容可能涉及到手机内置的原生通信应用,如电话、短信等,要求在开通...
通过提供的"S71200与调试助手UDP通信.zip"压缩包,包含了详细的PLC程序和调试文档,我们可以一起学习和实践这一关键的技术。 首先,我们需要理解UDP的基本概念。UDP是一种无连接的传输层协议,它不保证数据包的顺序...