`
zhaoqingqing
  • 浏览: 5370 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

我们一起学通信

阅读更多


        今年的暑假集训,主要学的技术就是通信了,通过了解、学习、运用通信,我又进一步认识到了技术的深奥与伟大。初次接触通信,我所了解到的最简单的例子就是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
			
		}
}

 

运行结果:

       在学习通信的过程中,我遇到了一些问题,以前用的少所以没注意,我在传参这方面有些混乱,局部变量经常当成全局变量用导致经常出错,还有就是输入输出流用的不太熟练,我会多加练习,正确熟练运用输入输出流,学好通信。

  • 大小: 23.2 KB
分享到:
评论

相关推荐

    MINA、Netty、Twisted放在一起学

    在“Mina、Netty、Twisted一起学(四):定制自己的协议.docx”中,我们将学习如何在Netty中定义和实现自定义的通信协议。 Twisted则是Python社区中的网络编程框架,它支持多种协议,包括HTTP、SMTP、FTP等,并且...

    管道通信源码,希望大家一起学习

    管道(Pipes)是一种进程间通信(IPC, Inter-Process Communication)机制,主要用于在同一台计算机上的两个或多个进程之间进行数据交换。管道分为两种类型:无名管道(unnamed pipes)和命名管道(named pipes)。...

    一起学用Flash做动画

    《一起学用Flash做动画》是一门针对初学者的教程,旨在帮助用户掌握Adobe Flash这一经典动画制作软件的基础知识和技巧。Flash作为一种强大的矢量图形和交互式内容创作工具,曾广泛应用于网页动画、游戏开发以及教学...

    特权和你一起学NIOS2(完整版)

    《特权和你一起学NIOS2》是一份全面的教程,专为初学者设计,旨在深入理解NIOS2嵌入式处理器系统。本教程通过详细讲解和实例演示,帮助学习者掌握NIOS2的基本概念、架构及应用。下面将根据标题、描述以及标签,深入...

    特权和你一起学习NIOS2

    【特权和你一起学习NIOS2】:这个标题暗示了我们即将探讨的是关于NIOS II处理器的学习之旅,其中“特权”可能是指深入理解和掌握处理器的内部运作机制,以及如何利用其高级功能。NIOS II是 Altera 公司(现为Intel ...

    一起学PLC

    5. **网络通信能力**:配备了RS232和RS485通信接口,支持构建485网络,每个PLC单元都可以作为网络中的节点,支持人机界面操作,大大提高了系统的网络化程度。 #### 硬件架构概述 - **上端子排**:包括电源输入(N、...

    socket基本通信学习

    关于socket基本通信的学习 里面有使用的方法 欢迎一起学习!

    爱上FPGA开发特权和你一起学NIOS2

    《爱上FPGA开发特权和你一起学NIOS2》是一本深入浅出的教程,旨在帮助读者掌握FPGA(Field-Programmable Gate Array)开发技术,特别是NIOS II嵌入式处理器的使用。FPGA是一种可编程逻辑器件,允许用户根据需求...

    特权和你一起学NIOS2

    《特权和你一起学NIOS2》是一套深受学习者喜爱的教程,旨在帮助初学者深入理解并掌握NIOS2嵌入式处理器的使用。特权同学作为教程的作者,以其通俗易懂、详尽细致的教学风格,使得这个教程在FPGA(Field-Programmable...

    轻松学业余电台通信

    业余电台通信,是一种爱好者通过无线电设备进行的非商业性通信活动。它涵盖了广泛的频率范围,允许业余无线电爱好者在国际上交流、学习无线电技术,并在紧急...让我们一起探索无线电的广阔世界,享受通信带来的快乐吧!

    接口与通信课程设计 串行通信

    同步串行通信中,数据和时钟信号一起传输,确保接收端能正确解析数据;异步串行通信则通过起始位、停止位和校验位来确定数据的边界。 2. **接口标准**: - 在串行通信中,常见的接口标准有RS-232、RS-485、USB、...

    学习通信信息网电子教案

    在通信信息网的整体架构中,我们首先要了解的是基础的网络层次模型。这一模型通常指的是OSI七层模型或TCP/IP四层(或五层)模型。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,每一层都...

    现代通信系统-现代通信系统使用MATLAB3.rar

    MATLAB允许我们将这些部分组合在一起,进行端到端的系统级仿真,以评估整个通信链路的性能。 综上所述,“现代通信系统-现代通信系统使用MATLAB3.pdf”这份资料可能涵盖了上述多个方面的内容,通过学习和实践,读者...

    通信原理(第七版 樊昌信 曹丽娜)各章节思维导图

    本人在本科学习通信原理阶段整理的各章节的思维导图,欢迎大家一起学习,如果发现有错误的地方,希望大家批评指正。谢谢!!!!

    一起学习CC3200

    【标题】:“一起学习CC3200” 【正文】: 在嵌入式系统的世界里,CC3200是一款由Texas Instruments(TI)推出的高效能微控制器,它集成了强大的Wi-Fi功能,广泛应用于物联网(IoT)设备。本学习资源主要针对CC3200的...

    通信电子线路 pdf课件 通信专业必修

    混频器是将两个信号(通常是一个高频信号和一个低频信号)结合在一起,产生新的频率成分的器件。在通信系统中,混频器用于将接收到的射频信号转换到中频,以便进行后续处理。它的工作原理基于非线性器件,如二极管或...

    通信技术培训教材

    华为新员工技术培训教材将这些内容综合在一起,通过深入浅出的讲解,帮助新员工快速掌握通信行业的核心技术,提升其专业素养。学习并理解这些技术,对于在通信行业工作的新员工来说至关重要,不仅可以增强他们的专业...

    第一季《跟我一起学习嵌入式Linux开发》

    《跟我一起学习嵌入式Linux开发》第一季的教程是一份专为初学者设计的实践指导资料,旨在帮助用户快速入门嵌入式Linux系统开发。教程以图文并茂的方式呈现,每一步操作都有清晰的截图,使学习过程更加直观易懂。然而...

    融合通信业务开通技术要求.docx

    融合通信是一种将语音、数据、视频等多种通信方式融合在一起的新型通信服务,旨在提升用户沟通体验和工作效率。 4.3.1 手机 Native 终端:这部分内容可能涉及到手机内置的原生通信应用,如电话、短信等,要求在开通...

    S71200与调试助手UDP通信.zip

    通过提供的"S71200与调试助手UDP通信.zip"压缩包,包含了详细的PLC程序和调试文档,我们可以一起学习和实践这一关键的技术。 首先,我们需要理解UDP的基本概念。UDP是一种无连接的传输层协议,它不保证数据包的顺序...

Global site tag (gtag.js) - Google Analytics