- 浏览: 18954 次
- 性别:
- 来自: 湖南常德
最新评论
网络通信:一句话说,用网络传输数据(各种数据) 。进行通讯那我们肯定需要知道传送到哪去,比如在现实中我们寄信,肯定需要知道目的地的地址,在计算机网络中我们就需要知道计算机的IP ,每个计算机拥有独立的IP ,这样我们就能把数据传送到我们需要的机器上,但是计算机上运行了那么多的程序我们怎么知道怎么区分他们呢? 因此我们用端口号区分我们计算机上的程序知道了IP 和端口号,我们就能对对应计算机上的对应程序发送数据,我们从最基础的文本消息开始传送。
首先我们需要一个服务器和一个客户端,听上去很牛逼,其实也就几句代码搞定的事。
Java.net.ServerSocket server = new Java.net.ServerSocket(9393);
// 这样服务器就创建成功了,9393 代表他所绑定的端口号
Java.net.Socket client = server.accept();// 服务器会一直等待客户端连接
Java.net.Socket client = new java.net.Socket(“localhost”,9393);
// 客户端建立,localhost 表示本地连接,9393 表示连接的端口号
启动我们创建的服务器和客户端就能让他们连接上,连接以后我们获取流来进行数据的传输
OutputStream out = client.getOutputStream();
InputStream in = client.getInputStream();
在正式进行数据传输之前我们还有一个很重要的事情要做,关于协议。协议不过是数据传输和数据接受的规定,就是服务器端按什么顺序传输数据,那么客户端就按什么顺序接受数据并处理。
比如我们实现一个简单的网络画板,客户端在画图形的同时,将坐标数据发送到服务器端,服务器端会同时出现相同的图形
// 显示画板窗体 public void showMyFrame() { this.setTitle("client"); this.setSize(600, 500); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(3); this.setResizable(false); // 添加图形选择面板 GraphPanel gp = new GraphPanel(); this.add(gp, BorderLayout.WEST); // 添加颜色选择面板 ColorPanel cp = new ColorPanel(); this.add(cp, BorderLayout.SOUTH); this.setVisible(true); g = this.getGraphics(); client = sc.getClient(); //监听器的添加 MyListener ml = new MyListener(g, client, gp, cp); this.addMouseListener(ml); }
在这个网络画板中使用的是自定义的简单通信协议,客户端按什么顺序发送消息服务器端就按相应的顺序处理消息,使用graphSign表示,不同类型的图形或者文件发送等,colorSign则表示发送的颜色,客户端就按照这个顺序发送数据
if (command.equals("line")) { g.drawLine(x1, y1, x2, y2); graphSign = 1; sendMsg(x1, y1, x2, y2); } else if (command.equals("rect")) { g.drawRect(Math.min(x2, x1), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2)); graphSign = 2; sendMsg(x1, y1, x2, y2); } else if (command.equals("oval")) { g.drawOval(Math.min(x2, x1), Math.min(y1, y2), Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2)), Math.max(Math.abs(x1 - x2), Math.abs(y1 - y2))); graphSign = 3; sendMsg(x1, y1, x2, y2); } // 向服务器发送坐标 public void sendMsg(int x1, int y1, int x2, int y2) { try { // 输出流 out = client.getOutputStream(); dos = new DataOutputStream(out); dos.writeInt(graphSign); dos.writeInt(colorSign); dos.writeInt(x1); dos.writeInt(y1); dos.writeInt(x2); dos.writeInt(y2); dos.flush(); } catch (Exception ef) { ef.printStackTrace(); } System.out.println("向服务器发送: " + x1 + " " + y1 + " " + x2 + " " + y2); }
下面就是数据就收了,先接受标记,判断传送的是什么图形的标记
graphSign = dis.readInt(); if (graphSign == 1) { drawLine(dis); } else if (graphSign == 2) { drawRect(dis); } else if (graphSign == 3) { drawOval(dis); }
接受到数据以后就画出对应的图形就大功告成了
Apache Mina初探
关于文件的引入
apache-mina-2.0.7\dist\ mina-core-2.0.7.jar
slf4j-1.7.2\ slf4j-api-1.7.2.jar
slf4j-1.7.2\slf4j-nop-1.7.2.jar
slf4j-1.7.2\log4j-over-slf4j-1.7.2.jar
下载好以后从原文件夹中引入就好(反正我是这样做的)
客户端:
NioSocketConnector connector = new NioSocketConnector(); // 创建接受数据的过滤器 DefaultIoFilterChainBuilder chain = connector.getFilterChain(); // 设定该过滤器一行一行的读取数据 chain.addLast("myChain", new ProtocolCodecFilter( new TextLineCodecFactory())); // 设定服务器端的消息处理器 connector.setHandler(new ClientIoHandler()); // 连接到服务器 ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 9393)); // waiting for connect cf.awaitUninterruptibly(); cf.getSession().getCloseFuture().awaitUninterruptibly(); connector.dispose();
创建连接以后,使用IOHandler进行处理IoHandler抽象类下列方法,触发事件后调用
sessionCreated() sessionOpened() sessionClosed() sessionIdle() exceptionCaught() messageReceived() messageSent
// 当一个客户端连接进入时 public void sessionOpened(IoSession session) throws Exception { sessions.add(session); System.out.println("a new client:" + session.getRemoteAddress()); System.out.println("the id is:" + session.getId()); } // 当一个客户端关闭时 public void sessionClosed(IoSession session) throws Exception { System.out.println("a client closed" + session.getRemoteAddress()); } // 就收消息 public void messageReceived(IoSession session, Object message) throws Exception { String str = (String) message; System.out.println("message from client-->" + str); // 将最后一条消息发送后关闭 true-->直接关闭无需等待最后一条消息关闭 if (str.equals("bye")) { session.close(true); } //客户端关闭 public void sessionClosed(InSession session){ } .............
服务器端:
// 使用NIO创建非阻塞的Server端Socket acceptor = new NioSocketAcceptor(); // 创建接受数据的过滤器 DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); // 设定这个过滤器将一行一行的读取数据 chain.addLast("myChain", new ProtocolCodecFilter( new TextLineCodecFactory())); // 设定服务器端的消息处理器,一个SimpleMinaServer对象 acceptor.setHandler(new ServerIoHandler()); // 设定服务器端口 int port = 9393; // 绑定端口启动服务器 acceptor.bind(new InetSocketAddress(port));
服务器端的IoHandler的用法与客户端的类似
发表评论
-
git入门
2015-02-11 11:02 0git入门 -
JVM内存结构浅谈
2013-05-19 14:47 697Java程序的运行过程: ... -
菜鸟入门之网页数据抓取
2013-05-04 21:53 5557有时候需要从网页上获取数据,比如别一些网页上的新闻获取到放 ... -
动态编译
2013-03-01 22:33 627前几天谈论了关于动 ... -
位映射
2013-03-01 22:33 947前些天讨论了位映射的内容,一个具体的例子就对于M个int ... -
线程同步
2013-03-01 22:34 7461,为什么要有线程同 ... -
生产消费模型
2013-03-01 22:34 721当遇到一个线程要产生数据而另一个线程要处理数据时,这就是生 ... -
设计模式之单例模式
2012-12-02 23:02 0单例模式又叫单台模式或者单例模式 -
数据结构之Hash
2012-11-19 21:45 883数据结构之hash 首先介绍两种非常重要的数据结构。数组,为 ... -
数据结构之Hash
2012-11-18 14:47 0数据结构之hash 首先介 ... -
哈弗曼压缩
2012-08-03 11:43 705一、哈弗曼树,又称最优树,是一种带权路径长度最短的树。 ... -
链表总结
2012-08-03 11:43 806首先,链表是一种顺 ... -
线程及线程应用总结
2012-08-03 11:44 761一、什么是线程 每个java程序都至少有一个线程 ... -
树二叉树总结
2012-08-03 11:45 880一、数的相关 节点: 节点是树的基本组成单 ... -
java集合框架
2012-07-16 21:21 753java集合框架总结 主要由以下三部分组成: ... -
I/O体系结构总结
2012-07-16 21:22 921I/O体系结构总结 流的概念和分类: ... -
File相关类总结
2012-07-16 21:22 929File是java中的与文件相关的类,可以对进行创建、删 ... -
java异常机制
2012-07-11 13:01 727JAVA异常机制 一、异常的基本概念 简单的说 ... -
总结20120705
2012-07-05 10:07 690一、类与对象 1. ... -
java关键字总结
2012-05-20 13:31 748常用关键字: 访问修饰符关键字: public: 是最为公 ...
相关推荐
在Android系统应用开发中,网络通信是至关重要的一个环节,特别是在构建交互性强的应用时。本实验旨在让学生深入了解Android网络通信技术,并通过实际操作掌握不同类型的网络通信方式,包括利用WebView实现浏览器...
网络通信年终总结.docx
总结来说,这个“网络通信开发包”以C++语言为核心,结合了控件、源码和丰富的资源,为开发者构建网络应用提供了强大支持。它不仅简化了网络通信的实现过程,还通过清晰的文档和源码,帮助开发者提升技能,实现更...
Linux与Windows系统间的网络通信 Linux与Windows系统间的网络通信是计算机网络领域中的一个重要话题。本文将介绍Linux与Windows系统间的网络通信的实现方法,包括 Socket 编程的工作原理和 Linux 与 Windows 不同...
总结来说,西门子工业网络通信指南上册是一份专门为工业控制网络技术提供指导的资料,其中涵盖了西门子工业网络通信的基础知识、技术要点以及应用实例等。通过学习和实践指南中的内容,技术人员可以提升对西门子工业...
基于 ARM9 的嵌入式 Linux 网络通信系统设计与实现 本文主要介绍了基于 ARM9 的嵌入式 Linux 网络通信系统的设计与实现。该系统使用 $3C2410 微处理器和 Linux 操作系统,实现了服务器和客户端的网络通信。本文首先...
网络通信年终总结(完整版).doc
嵌入式Linux网络通信程序开发 本篇论文主要讨论了基于Linux操作系统的嵌入式网络通信程序开发,特别是基于AX88796网卡驱动程序的开发。文章首先介绍了当前网络的重要性和嵌入式系统的发展趋势,然后详细分析了Linux...
总结来说,实现P2P网络通信需要对网络编程、并发处理以及文件操作有深入的理解。通过Java的Socket编程,我们可以构建起基本的节点通信框架,再结合P2P网络的特点进行优化,从而实现高效、可靠的P2P网络通信系统。...
### VB环境下用Winsock实现网络通信 #### 概述 随着计算机技术和互联网的快速发展,网络编程已经成为现代软件开发中不可或缺的一部分。然而,由于涉及到复杂的网络专业知识和技术细节,很多编程爱好者和初学者往往...
总结,网络通信VC源代码是学习网络编程的良好起点,特别是对于想在Windows环境下使用C++进行网络开发的初学者。通过对源代码的分析和实践,不仅可以掌握TCP通信的基本原理,还能熟悉Winsock API的使用,为后续的网络...
总结起来,.NET网络通信涵盖了多种协议和模式,开发者可以根据需求选择合适的通信方式。无论是在桌面应用、Web应用还是移动应用中,理解和掌握这些技术对于构建高效、可靠的网络应用至关重要。通过学习和实践C#中的...
Linux 网络通信 socket 应用编程知识点总结含例程 Linux 网络通信 socket 应用编程是指在 Linux 操作系统中使用 socket 编程来实现网络通信的技术。socket 是一种网络编程接口,提供了一个创建网络套接字的方法,...
总结,基于socket的并发网络通信涉及到网络编程的基本原理、TCP连接的建立与维护、多线程/多进程并发处理以及可能的优化策略。理解并熟练掌握这些知识点,对于开发高效、可靠的网络应用程序至关重要。
PROFINET通信技术总结
【网络通信实验报告——探索网络通信的奥秘】 在惠州学院的网络通信课程中,学生们通过一系列实验深入理解和掌握网络通信的基本原理和技术。本实验报告将详细阐述实验1及实验四至七的主要内容,旨在展示学生刘永富...
总结来说,TCP网络通信结合多线程技术可以实现高效、稳定且具有高并发能力的服务器和客户端应用。在Linux环境下,借助socket API和高级库,开发者可以构建出强大的网络服务。同时,理解并掌握线程同步与锁机制、事件...
201*年的计算机网络通信工作总结反映了该年度在IT管理岗位上的工作重点和挑战。在这一年中,工作者主要负责计算机硬件的管理、网络维护、电话系统的维护,以及协助各类会议和活动的顺利进行。以下是详细的知识点总结...
串口通信项目总结 本篇资源的主要内容是对多串口接收项目的总结,涵盖技术总结和心得总结两方面。下面将对标题、描述、标签和部分内容进行详细的解释和总结。 一、技术总结 技术总结是对整个项目的技术实现过程的...
总结来说,Java多线程技术在网络通信系统中的应用包括了线程间通信的原理、多线程实现网络通信的原理、线程安全及同步控制的有效途径,以及网络通信编程中的Socket类实现。掌握这些技术要点,对于进行高效、稳定、...