Socket实现双机通信.doc_第1页
Socket实现双机通信.doc_第2页
Socket实现双机通信.doc_第3页
Socket实现双机通信.doc_第4页
Socket实现双机通信.doc_第5页
免费预览已结束,剩余8页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

利用Socket实现双机通信1、设计概述 1.1 TCP/IP协议TCP/IP协议(传输控制协议/网际协议)是一种网络通信协议,是一种面向连接的可靠的传输协议。它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据传输格式以及传送方式。TCP/IP是Internet的基础协议。 TCP/IP协议的基本传输单位是数据报(Dataggram)。TCP协议负责把数据分成若干个Datagram,并给每个Datagram加上包头。通常把要发送的整块数据块叫一个报文,就是上面的Datagram,在发送报文之前,先把较长的报文划分为一各个个更小的等长的数据段,并在每个数据段之前加上一些控制信息组成的首部,也就是前面的包头。包头里包含了诸如目的地址和源地址等重要控制信息,这样一个个被划分的分组才能在因特网中独立地选择传输路径。如果传输过程中出现数据丢失或数据失真等异常情况,TCP协议会自动要求数据重发,并重新分组。TCP 协议保证数据传输的质量,IP协议保证数据的传输。TCP/IP协议数据的传输是基于TCP/IP模型的四层结构:应用层、传输层、网络层和网络接口层。两个主要的传输层协议:传输控制协议(TCP)和用户数据报协议(UDP)。由于设计是按照TCP/IP协议,有必要介绍下TCP。TCP传输数据建立在面向连接的基础上,实现了一种“虚电路”的概念。双方通信之前,先建立连接,然后双方即可在其上发送数据,发送完毕后关闭连接。这种数据交换方式的有点是效率高,缺点是建立连接和关闭连接需要额外的开销。TCP协议主要提供如下服务:l 可靠的数据传输l 面向连接的虚电路l 缓冲的传输l 重新排序l 多路复用技术l 高效的、全双工传输l 流量控制TCP协议提供的是一种可靠的数据流服务。得到的是一个顺序的无差错的数据流。1.2 套接字(Socket)套接字允许程序员把网络连接当成一个流,并向这个流读写字节。Socket对程序员掩盖了网络的底层细节,如纠错、包大小、包传输、网络地址等。数据在Internet中是以有限大小的分组的形式传输的。一个分组是一个数据报,包括首部和负载。首部包含目的地址和端口、源地址和端口以及用于保证可靠传输的各种其他管理信息。负载包含数据本身。但由于分组长度有限,通常必须将数据分解为多个分组,在目的地重新组合。在传输过程中,有可能发生一个或多个分组丢失或被破坏的情况,此时就需要重新分组。或者分组乱序到达,则需要重新排序。这些工作将是非常繁重。幸好的是套接字的出现是我们不必关心这些琐事,我们只要把网络看成一个流就行了。套接字(socket)是网络协议传输层提供的接口。Socket是两个程序间进行双向数据传输的网络通信端点,由一个地址和一个端口号来标识,每个服务程序在提供服务时都需要在一个端口进行,而想使用该服务的客户机也必须连接改端口。目前有两种套接字:流套接字(Stream Socket)和数据报套接字(Datagram Socket)。流套接字提供一个面向连接的、可靠的数据传输服务,保证数据无差错、无重复、按顺序发送,具有流量控制功能,数据被看成字节流,无长度限制。TCP即是一种基于流套接字的通信协议。本设计就是基于TCP/IP协议的Socket编程,在这种情况下,Socket可以看出是两个程序进行通信连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送到另外一个Socket中,使这段信息能传送到其他程序。每个基于TCP/IP的程序都赋予了一个端口号(065535),通过不同的端口号,区别服务器上运行的每一个应用程序和所提供的服务。不过一般要用1024以上的端口号,因为1024一下的端口号一般保留给系统服务使用。1.2 设计目的和要求:利用WinSock来实现双机通信,理解TCP状态机图要求使用WinSock编程,采用其中的TCP面向连接方式,实现文本数据的交换。1.3 设计方案本设计用对网络有得天独厚优势的、“一处编写、到处运行”的Java语言作为编程语言,用基于JDK1.6的MyEclipse集成开发环境进行开发。主要用到.Socket类和.ServerSocket类以及java.io包中的类来实现客户服务器端套接字对象的建立、连接、通信、释放连接,其中.Socket类是Java用来实现客户端TCP操作的基础类,在Java编制中,一切与TCP有关的操作都由Socket类负责,这个类本身使用直接代码通过主机操作系统的本地TCP栈进行通信,Socket的输入输出都通过流来实现。ServerSocket类的功能是在客户端通过Socket请求数据通信后,服务器端需要有一个响应客户端请求通信的服务程序,该服务程序将应用ServerSocket类来完成与客户端的通信:ServerSocket类用在服务器端,侦听和响应客户端的连接请求,并接收客户端发送的数据。ServerSocket类的主要任务是在服务器端耐心地等候客户端的连接请求,一旦客户端应用程序建立一个Socket连接,ServerSocket类就会通过accept()方法返回一个对应的服务器端Socket对象,以便进行直接通信。从两台计算机连接成功起,服务器端与客户端就得到了一个真正的Socket-Socket连接,此时利用Socket类的getInputStream()和getOutputStream()方法从客户端的Socket产生对应的InputStream和OutputStream对象,并将Socket数据流封装到缓冲区以便进行两台主机间的数据通信。用到java.awt包和java.swing包中的类来实现可视化界面,最终实现socket点对点聊天通信程序。1.4基于TCP/IP Socket下的设计原理图Program AProgramBInternet2软件设计 2.1软件功能图:开始第一个文本域中输入本机名或IP地址第二个文本域中输入本地端口号第三个文本域中输入对方端口号用其他计算机或本机运行该程序并完成以上对应输入先后点击连接按钮判断主机名端口号对应连接失败,聊天“发送”按钮不可用,等待继续输入连接按钮不可用,聊天内容文本区中显示欢迎信息,聊天按钮、文本域可用,开始聊天单机模拟或直接双机通信遇到exit字样或点击退出按钮结束2.2本代码主要用到的Java 基于TCP/IP Socket网络编程构造方法及其运用此编写的功能函数:2.2.1 Java API 的库函数:public Socket(InetAddressaddress, intport)throws IOException创建一个流套接字并将其连接到指定 IP 地址的指定端口号。 如果应用程序已指定套接字工厂,则调用该工厂的 createSocketImpl 方法来创建实际套接字实现。否则创建“普通”套接字。public ServerSocket(intport)throws IOException创建绑定到特定端口的服务器套接字。端口 0 在所有空闲端口上创建套接字。public InputStream getInputStream()throws IOException返回此套接字的输入流。如果此套接字具有关联的通道,则所得的输入流会将其所有操作委托给通道。在非正常条件下,底层连接可能被远程主机或网络软件中断(例如,TCP 连接情况下的连接重置)。当网络软件检测到中断的连接时,将对返回的输入流应用以下操作: l 网络软件可能丢弃经过套接字缓冲的字节。网络软件没有丢弃的字节可以使用 read 读取。 l 如果没有任何字节在套接字上缓冲,或者 read 已经消耗了所有缓冲的字节,则对 read 的所有后续调用都将抛出 IOException。 l 如果没有任何字节在套接字上缓冲,并且没有使用 close 关闭套接字,则 available 将返回 0。 public OutputStream getOutputStream()throws IOException返回此套接字的输出流。2.2.2本代码的主要功能函数如下:/ 发送消息的线程方法public void run() try serverSocket = new ServerSocket(localPort);/ 创建本地服务器套接字dw.getTextArea().append(等待用户连接.n);/ 在显示消息的演示窗体中输出信息clientSocket = serverSocket.accept();/ 等待客户端建立连接dw.getTextArea().append(已有用户连接n);/ 在显示消息的演示窗体中输出信息out = new PrintWriter(clientSocket.getOutputStream(), true);out.println(您好,欢迎来到我的聊天室!);/ 连接好显示你好字样!/ 已经建立连接isConnected = true;/ 设置窗体各组件的可用状态dw.enableControls(true); catch (Exception e) System.out.println(e.getMessage();/ 接收消息的线程方法public void run() / 对方服务器套接字Socket serverSocker = null;/ 获取消息的输入流BufferedReader in = null;try / 在显示消息的演示窗体中输出信息dw.getTextArea().append(准备连接对方.n);/ 进入循环,直到连接到对方服务器while (true) try / 建立服务器套接字serverSocker = new Socket(host, remotePort);break; catch (Exception e) System.out.println(e.getMessage();/ 在显示消息的演示窗体中输出信息dw.getTextArea().append(已经连到对方n);/ 创建获取消息的输入流in = new BufferedReader(new InputStreamReader(serverSocker.getInputStream();/由服务器套接字获得输入流并度入到缓冲区中/ 进入循环,不断显示对方服务器发送来的消息while (true) / 获取对方服务器发送来的消息String str = null;try str = in.readLine();/从缓冲区中读取文本内容 catch (Exception e) System.out.println(e.getMessage();/ 如果是退出消息,则结束显示if (str = null | in.equals(exit) break;dw.getTextArea().append(str + n);/ 在显示消息的演示窗体中的文本区中显示通信内容in.close();/ 关闭输入流释放资源 serverSocker.close();/ 关闭套接字System.exit(0); catch (Exception e) System.out.println(e.getMessage();2.3 下面是基于上面两个主要功能函数的程序流程图:2.3.1发送消息线程类OutputNetPhone 的run()方法的流程图:开始创建本地服务器套接字Socket对象等待客户端建立连 接是否建立连接 显示欢迎信息,isConnected=true调用sendData()方法开始发送信息遇到exit或退出按钮结束2.3.2接收消息的线程类的run()方法流程图:通过客户端套接字对象Socket的构造方法创建服务器端套接字对象Break;创建获取消息输入流从输入流中读取消息文本到字符串变量str显示到客户端文本区中遇到exit或退出按钮结束开始3 程序调试及其结果显示 3.1单机版测试双击通信: 首先在MyEclipse中运行本代码两次,显示预想的可视化界面,该界面为矩形,不可调整大小,有4个文本域,一个文本区,3个按钮,其中前三个文本域用来控制输入主机名(IP地址)、本机端口号、对方端口号,初始化运行效果如图: 由于是单机调试,所以主机号俱为localhost,端口号为本机上两个端口号(都大于1024,以免占用系统端口号),本例用5000和4000,对同时运行的两个程序,输入对应的端口号,即为:localhost、5000、4000;为、4000、5000,都按回车键,效果如图: 接下来输入信息发送,可以在各个界面上看到发送的信息,效果如图: 单击退出按钮或输入exit字样程序正常退出。3.2为验证程序的实际可用性、鲁棒性,可以进行真正的双机通信测试:在我的电脑和我同学的电脑上同时运行该程序,在他的电脑的主机名文本域中输入我的主机IP地址:,本地端口:4500,对方端口5000,对应我的电脑程序界面中输入他的IP地址:,本地端口5000,对方端口4500,然后皆按连接按钮测试连接成功与否,待连接成功后开始进行聊天测试,结果证明是完美的,效果如图:经过一系列测试,证明本课程设计是基本成功的,看来多日的努力终于结出甜美的果实来。4 系统不足及其改进方案根据已经学习的计算机网络知识和以前学习的Java基础和Java网络编程技术,也经过这几天的集中努力,基本上完成了Java语言版本的利用Socket实现双机通信。但是由于时间有限、水平不足系统存在很多不足之处。按道理说,本课程设计就是qq聊天程序的雏形,所以努力的方向应该是像qq这样的聊天软件。本系统的不足之处就在于没有登陆界面、而且聊天程序的界面也相当简陋,对于主机名、端口号就不应该出现在页面中,因为让客户应用时不知道对方IP地址、端口号就无法实现通信。程序只能发送文本数据,图片、压缩文件还不能传输等。本系统的改进之处就在于通过加对方好友来动态获得对方的IP地址端口号从而避免让用户输入对方的IP地址、端口号,并且将聊天信息、好友信息保存到数据库中,以便后来查看。保存好友信息包括头像,使好友在线是高亮显示、离线变灰变暗,这样可以方便地和对方聊天。还有就是让java的可执行文件自带需要的虚拟机一块打包,让用户不需安装JDK就可以运行该软件,这都是努力之处,尽管现在只是想法,但相信有想法就是进步,贵在坚持,贵在不放弃,贵在不懈努力。我相信,有朝一日我会实现我的改进方案,因为我有一颗坚定不移、不到长城非好汉的信念、志气!5 软件发布及其简要说明利用Java的MyEclipse开发环境,选择要打包的程序,右键-选择Export单击,出现Export对话框,选择Java文件夹,单击Runnable JAR file选项,弹出Runnable JAR File Export对话框,在Launch configuration下拉框中选择要打包程序所在的路径,在Export destination下拉框中选择打包后文件所在路径,点击完成按钮,即可对本软件进行打包。最后将这个已经打包好的文件发布即可。由于本软件是用java语言编写的,用的是java MyEclipse集成开发环境,在JDK6.0环境下进行编译运行,所以,运行该软件还必须安装JDK最好是JDK6.0环境,可以到java官方网站/下载最新版本的JDK , 然后双击jar文件即可运行(也可以在桌面上建立快捷方式),当然也可以拷贝本程序的源代码然后新建工程、新建类粘贴运行,记着别忘了主类名和本代码的主类名一致,运行是没问题的。总之本软件是经过精心编写,精心调试,没有错误的,虽然软件简陋,还有许多待改进之处,那是后话!6 设计总结与分析对于这次课程设计,我历经辛苦,还算是颇有受益的。首先能使平时学习的计算机网络知识能和具体的实践相结合,可以说,已经是一次小小地质地飞跃。以前只知道计算机网络的课本知识,比如的计算机网络体系结构,诸如TCP/IP的体系结构等等,但是觉得有点空,就是跟自己关系不大,怎样的体系结构别人划分好了标准我用便是,有点漠不关心,而且我编程搞的Java网络编程JSP网络编程也没怎么用到。通过这次课程设计,我算是明白我以前就是个井底之蛙。我算是大开眼界,原来JAVA 还有这方面的网络编程,而且一点不逊色于JSP的网页网络编程,并且最后我从根本上认识到我以前所做的JSP网络编程的B/S模式也是计算机网络的网络边缘的端系统中运行程序

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论