Java语言实现基于消息传递的网络通信.doc

上传人:PIYPING 文档编号:10837254 上传时间:2021-06-06 格式:DOC 页数:18 大小:272.50KB
返回 下载 相关 举报
Java语言实现基于消息传递的网络通信.doc_第1页
第1页 / 共18页
Java语言实现基于消息传递的网络通信.doc_第2页
第2页 / 共18页
Java语言实现基于消息传递的网络通信.doc_第3页
第3页 / 共18页
Java语言实现基于消息传递的网络通信.doc_第4页
第4页 / 共18页
Java语言实现基于消息传递的网络通信.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《Java语言实现基于消息传递的网络通信.doc》由会员分享,可在线阅读,更多相关《Java语言实现基于消息传递的网络通信.doc(18页珍藏版)》请在三一文库上搜索。

1、网络操作系统课程设计报告课程设计题目 Java语言实现基于消息传递的网络通信系统设计姓 名 黄伟 专 业 09网络工程 学 号 09539070 成 绩 网络工程系 2011年12 月15日Java Sock实现基于消息传递的网络通信系统及简单文件传输功能的实现摘要:Socket(套接字)是一种基于TCP/IP的编程接口。它采用客户/服务器通信机制,使客户端和服务器端通过Socket接口在网络上实现连接和数据交换。它提供了一系列系统调用,使用户可以方便地实现TCP和UDP等多种网络协议的通信。它使用户可以在网络协议上工作而不必对该网络协议有非常深入的了解。这样编写的程序可被迅速移植到任何支持S

2、ocket的网络系统中去。 本程序主要利用Java Socket来实现双机通信,实现一个简单的服务器,客户端聊天小程序。通过本次实验加深对JavaSocket机制及其原理的进一步了解。关键词:套接字、 SocketServer类、客户机/服务器模式 一 理论基础:1.1 套接字通信 套接字(Socket)是网络通信的基本单元操作,又被称作端口,通常用来实现客户方向和服务器的连接。网上的两个程序通过一个双向的通信连接实现数据的交换,在实现双向通信前链路的每一个端都建立一个Socket,通过对Socket的读/写操作实现网络通信功能。套接字是网络通信的一个标准。套接字分为以下三种类型。(1) 流套

3、接字这是最常用的套接字类型,TCP/IP协议中的TCP协议用此类接口,它提供面向连接的(建立虚电路),无差错的、发送先后顺序一致的,包长度不限和非重复的网络信包传输。(2) 数据报套接字TCP/IP协议族中的UDP协议使用此类接口,它是无连接的服务,以独立的信包进行网络传输,信包最大长度为32KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重要的场合。(3) 原始数据包套接字提供对网络下层通信协议的直接访问,它一般不是提供给普通用户的,主要用于开发新的协议或者用于协议教隐蔽的功能。 所有Socket通信程序的基本结构都是一样的,主要有创建Socket、打开连接到Soc

4、ket的输入流和输出流、按照一定的协议对Socket进行读写操作。关闭Socket这四个步骤,通过这四个步骤可以完成一般的Socket通信。1.2 JAVA Sockets编程简介:用Java语言编程实现Socket通信,其原理与使用其他语言基本相同,不同之处是:(1)java是跨平台的编程语言,所以用java编写的Socket通信程序可以工作在所有支持TCP/IP协议和java的软硬件平台上;(2)因为Java是面向对象的语言,所以在编程中需要使用一些与Socket有关的系统类,其中用于实现流Socket的类主要有:InetAddress类,Socke类。InetAddress类的对象用来保

5、存IP地址,Socket类的对象用来创建Socket通信的客户端,Socket通信的服务器端则有ServerSocket类的对象来实现,用上述几个类就可以很方便的生成用户自己的TCP/IP通信程序。这几个类都属于J包,大部分用来处理网络操作的系统类都包含在这个包中,所以用JAVA编写程序是,一般要在程序开始部分用import语句加载这个包,以便引入这些类。用JAVA语言编写Socket程序的过程就是创建和定义Socket类和ServerSocket类的子类的过程, 包中提供了丰富的类用于TCP和UDP编程 ,其中Socket和ServerSocket类主要用与TCP连接,其中DatagramP

6、acket和DatagramSocket类主要用于UDP编程。 1.3 JAVA 有关概1.3.1 Java中输入/输出流概念过滤流DataInputStream 和DataOutputStream 除了分别作为FilterInputStream 和FilterOutputStream的子类外,还分别实现了接口 DataInput 和DataOutput。接口DataInput 中定义的方法主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数,如readBoolean()readInt()、readLine()、readFully()等。接口DataOutput中定义的方法

7、主要是向流中写入基本类型的数据或者写入一定长度的字节数组,如writeChar()、writeDouble() DataInputStream可以从所连接的输入流中读取与机器无关的基本数据类型用以实现一种独立于具体平台的输DataInputStream 可以向所连接的输出流写入基本类型的数据。1.3.2 Java语言介绍Java语言的优点主要表现在:简单、面向对象、多线程、分布性、体系结构中立、安全性等方面。(1) 简单性 Java与C+语言非常相近,但Java比C+简单,它抛弃了C+中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。 Java

8、实现了自动的垃圾收集,简化了内存管理的工作这使程序设计更加简便,同时减少了出错的可能。 (2) 面向对象Java提供了简单的类机制和动态的构架模型。对象中封装了它的状态变量和方法,很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或重新定义父类或超类所提供的方法,从而既实现了代码的复用,又提供了一种动态的解决方案。Java是一种完全面向对象的程序设计语言,它除了数组、布尔和字符三个基本数据类型外的其它类都是对象,它不再支持全局变量。在Java中,如果不创建新类就无法创建程序,Java程序在运行时必须先创建一个类的实例,然后才能提交运行。Java同样支持继

9、承特性,Java的类可以从其它类中继承行为,但Java只支持类的单重继承,即每个类只能从一个类中继承。Java支持界面,界面允许程序员定义方法但又不立即实现,一个类可以实现多个界面,利用界面可以得到多重继承的许多优点而又没有多重继承的问题。(3) 多线程 多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程机制中,不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待影响其他部分,这样容易实现网络上的实时交互操作。 Java程序可以有多个执行线程,如可以让一个线程进行复杂的计算,而让另一个线程与用户进行交互,这样用户可以在不中断计算线程的前提下与系统进行交互。多线程保证了较高

10、的执行效率。(4) 分布性Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便的访问其他对象。(5) 体系结构中立 Java是一种网络语言,为使Java程序能在网络的任何地方运行,Java解释器生成与体系结构无关的字节码结构的文件格式。Java为了做到结构中立,除生成机器无关的字节码外,还制定了完全统一的语言文本,如Java的基本数据类型不会随目标机的变化而变化,一个整型总是32位,一个长整型总是64位。为了使Java的应用程序能不依赖于具体的系统,Java语言环境还提供了用于访问底层操作系统功能的类组成的包,当程序使用这些包时,可以确保它能

11、运行在各种支持Java的平台上。java.lang: 一般的语言包。其中包括用于字符串处理、多线程、异常处理和数字函数等的类,该包是实现Java程序运行平台的基本包。 java.util: 实用工具包。其中包括哈希表、堆栈、时间和日期等 。java.io: 基于流模型的输入/输出包。该包用统一的流模型实现了各种格式的输入/输出,包括文件系统、网络和设备的输入/输出等 。: 网络包。该包支持TCP/IP协议,其中提供了socket、URL和WWW的编程接口。java.awt: 抽象窗口工具集。其中实现了可以跨平台的图形用户界面组件,包括窗口、菜单、滚动条和对话框等 ,java.applet: 支

12、持applet程序设计的基本包.(6) 安全性 用于网络、分布环境下的Java必须要防止病毒的入侵,Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止了程序员使用欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。1.3.3 与Socket有关的java类: 1.InetAddress类: 用来保存因特网上的IP地址的类,它含有很多成员变量和方法,其中比较常用的有getLocalHost,getByName和getAllByName,利用它们都可以创建该类的对象,获得一个Java程序操纵、处理的IP地址。例如下面的程序段可以根据主机名获取其IP地址 T

13、ryInetAddress remoteIp=InetAddress.getByName(“”); catch(UnknownHostException e) System.out.println(“获取主机IP错误!”);2.Socket类: 用来实现TCP/IP通信的端口套接字类,所有希望通过socket来完成与远程主机进行TCP/IP连接和通信的程序,都必须创建一个socket类的对象。这个类对象的作用首先是根据远程主机的IP地址和端口号在本地主机创建一个与远程主机的联接;其次,在连接建立后,本地主机程序就可以使用这个类对象提供的输入/输出通道与远程主机实现通信当一个socket被创建时

14、,它所指定的连接也将同时被建立并打开,若连接成功,调用这个socket对象的有关方法就可以实现与远程主机的读写通信操作. 当一个Socket被创建时,它所指定的连接也将同时建立并打开,若连接成功,调用这个Socket对象的有关方法就可以实现与远程主机的读写通信操作;若连接失败,则构造函数会抛出异常,表示没有成功创建对象。Socket对象的方法getInputStream()和getOutputStream()用来实现程序通过Socket对远程的方的读写。调用getInputStream()方法返回一个抽象的getInputStream()对象。可以从远程主机读取二进制数据,调用getOutpu

15、tStream()方法可以返回一个抽象的getOutputStream()对象,实现远程方的写入操作。由getInputStream()和getOutputStream()都只是对二进制的原始数据读写。而不能实现对复杂的数据结构直接操作,所以在实际应用中一般要先对getInputStream()和getOutputStream()方法返回输入输出流加工变换后在使用.当Socket通信结束后,可以调用close()方法来关闭连接,此外调用getLoaclPort()和getInetAddress()可以得知Socket连接服务器的有关服务器端口号和IP地址等有关信息。3 ServerSocket

16、类 它是Java用来实现TCP/IP通信服务器端的主要机制,当一个ServerSocket对象被创建时,程序在本机的指定端口处提供服务并开始监听可能来自客户端的服务请求。当一个客户请求连接并被接受时,服务器程序创建一个Socket对象与远程的客户机相连实现通信操作。 该类的accept()方法用来等待并接受客户端的连接,当这个方法被调用时,并与之成功连接,这时方法返回一个新创建的服务器端的Socket对象,这个对象已经和远程主机连接成功。并可以和客户机的Socket实现读写操作。若服务器可以同时提供的连接数超过一个则服务器程序应该创建一个新的进程来完成和客户端的通信,而保留原有监听线程接着准备

17、接受其他客户机的请求。当ServerSocket对象要结束它在特定的端口上提供的服务,可调用Close()方法实现。二客户机服务器通信的实现:21 开发环境 Netbeans 2.2 服务器端程序的实现:import java.awt.*;import java.awt.event.*;import .*;import java.io.*;import java.util.*;public class MyServer extends Frame TextArea area = new TextArea(); ServerSocket server = null; Socket client

18、= null; DataInputStream in = null; DataOutputStream out = null; private boolean status = false; TextField path=null; java.util.List clienList = new ArrayList(); public static void main(String args) new MyServer().lanchFrame(); public void lanchFrame() this.setLocation(300, 300); /this.setSize(400, 4

19、00); this.add(area, BorderLayout.CENTER); this.setTitle(Server); this.pack(); this.setVisible(true); Panel p1 = new Panel(); /p1.setSize(300, 100); p1.setLayout(new BorderLayout(); Label lab1 = new Label(Path); Button button = new Button(Send!); path = new TextField(); p1.add(lab1, BorderLayout.WEST

20、); p1.add(path, BorderLayout.CENTER); p1.add(button, BorderLayout.EAST); p1.setVisible(true); button.addActionListener(new MyButtonLiser(); this.pack(); this.add(p1, BorderLayout.SOUTH); start(); this.addWindowListener( new WindowAdapter() public void windowClosing(WindowEvent e) /disconnect(); Syst

21、em.exit(0); ); public void disconnect() try server.close(); in.close(); out.close(); client.close(); catch (IOException e) e.printStackTrace(); public void start() try server = new ServerSocket(8888); catch (BindException e) System.out.println(此程序已经运行,端口已经被占用!请重新运行!); System.exit(0); catch (IOExcept

22、ion e) e.printStackTrace(); try status = true; while (status) client = server.accept(); / in=new DataInputStream(client.getInputStream(); area.append(A Client from IP: + client.getInetAddress() + Port: + client.getLocalPort() + Connectedn); / status=true; ClientLister c = new ClientLister(client); n

23、ew Thread(c).start(); clienList.add(c); catch (IOException e) e.printStackTrace(); private class ClientLister implements Runnable /用于接受客户端传送数据 private Socket s = null; private DataInputStream in = null; private DataOutputStream out = null; public ClientLister(Socket s) this.s = s; try in = new DataI

24、nputStream(s.getInputStream(); out = new DataOutputStream(s.getOutputStream(); status = true; catch (IOException e) e.printStackTrace(); public void send(String s) try out.writeUTF(s); catch (IOException e) e.printStackTrace(); public void run() try while (status) String s = in.readUTF(); area.appen

25、d(s + n); for (int i = 0; i clienList.size(); i+) ClientLister c = clienList.get(i); c.send(s); catch (EOFException e) area.append(One Client close! + n); catch (IOException e) e.printStackTrace(); finally try s.close(); in.close(); out.close(); catch (IOException e) e.printStackTrace(); private cla

26、ss MyButtonLiser implements ActionListener public void actionPerformed(ActionEvent e)/文件传输模块 area.append(Server begin listen port 5555 to send file!+n+ Server now is listinging.!+n); String str=path.getText(); File file=new File(str); try FileInputStream fos = new FileInputStream(file); ServerSocket

27、 pathS=new ServerSocket(5555); Socket client=pathS.accept(); OutputStream netOut=client.getOutputStream(); OutputStream doc = new DataOutputStream(new BufferedOutputStream(netOut); byte buf = new byte2048; int num = fos.read(buf); while (num != (-1) doc.write(buf, 0, num); doc.flush(); num = fos.rea

28、d(buf); area.append(File send complete!); catch(FileNotFoundException ferr) area.append(File not found!n); / System.exit(0); catch(BindException port_err) area.append(文件传输端口5555已被占用,请关闭后在运行!); System.exit(0); catch (IOException ef) ef.printStackTrace(); 2.3 客户端程序的实现 import java.awt.*;import java.awt

29、.event.*;import .*;import java.io.*;public class Client extends Frame TextArea area=new TextArea(); TextField tline=new TextField(); Socket client=null; DataOutputStream out=null; DataInputStream in=null; private boolean status=false;public static void main(String args) new Client().lanchFrame();pub

30、lic void lanchFrame() setLocation(300,400); /setSize(300,300); this.setTitle(Client); this.add(area,BorderLayout.NORTH); this.setVisible(true); Panel panel=new Panel(); panel.setLayout(new BorderLayout(); panel.add(tline,BorderLayout.CENTER); Button button=new Button(Recive); button.addActionListene

31、r(new MyButtonLiser(); panel.add(button,BorderLayout.EAST); panel.setVisible(true); this.add(panel,BorderLayout.SOUTH); /this this.pack(); this.addWindowListener( new WindowAdapter() public void windowClosing(WindowEvent e) disconnect(); System.exit(0); ); tline.addActionListener(new MyLister(); con

32、nect(); new Thread(new ReciveInfo().start();public void connect() try client=new Socket(127.0.0.1,8888); out=new DataOutputStream(client.getOutputStream(); in=new DataInputStream(client.getInputStream(); status=true; catch(IOException e) e.printStackTrace(); public void disconnect() try out.close();

33、 catch(IOException e) e.printStackTrace(); private class MyLister implements ActionListener public void actionPerformed(ActionEvent e) String s=tline.getText(); area.append(s+n); tline.setText(); try out.writeUTF(s); catch(IOException e2) e2.printStackTrace(); private class ReciveInfo implements Run

34、nable public void run() while(status) try String s=in.readUTF(); area.append(s+n); catch(SocketException e) System.out.println(客户端退出!); System.exit(0); catch (IOException e) e.printStackTrace(); private class MyButtonLiser implements ActionListener/文件接受类 public void actionPerformed(ActionEvent e) ar

35、ea.append(client start to get file.+n); File file = new File(D:+File.separator+backup.txt); / area.append(Ok1); try file.createNewFile(); RandomAccessFile raf = new RandomAccessFile(file, rw); / area.append(Ok2); Socket server = new Socket(InetAddress.getLocalHost(),5555); InputStream netIn = server

36、.getInputStream(); InputStream iner = new DataInputStream(new BufferedInputStream(netIn); /area.append(OK4); byte buf = new byte2048; int num = iner.read(buf); / area.append(OK3); while (num != (-1) raf.write(buf, 0, num); raf.skipBytes(num); num = iner.read(buf); iner.close(); raf.close(); area.app

37、end(client get file complete,and save as D:backup.txt ); catch(IOException err) err.printStackTrace(); 2.4 程序运行结果 程序功能介绍 : MyServer做为服务器端,监听Client端的请求,并对Client端的操作做出相应的处理。当有多个客户端连接到MyServer端时他们每个客户端和服务器端通信的内容服务器自动将其转发给其它客户端,实现了客户端之间的信息共享,以及服务器端可以实现简单的文件发送功能! 客户端服务器端通信结果 服务器端运行结果 多个客户端连接服务器端结果:Client

38、1 Client1 退出结果 Client 2Client2 退出结果 Server文件传输功能截图: 客户端 2.5 程序的不足之处 其一: 上面的服务器程序在我单独一个线程处理客户端发送的数据之后,它的窗口监听功能似乎就不起作用了,无法正常退出。其二: 在实现文件传输时客户端的接收程文件那块代码,似乎有问题,容易导致客户端进程卡住现象!上面两个缺陷自己能力有限解决不了,因此希望老师能指点指点! 三 课程设计小结 此次课程设计使我对用Java语言实现套接字间通信的原理更加深刻的认识了。通过本次课程设计也使我对Java的输出输出流,线程,泛型,类集,Gui,继承,异常,内部类等知识的综合运用运

39、用进一步加强。其中也遇到不少的问题 大致有以下几个 1 例如对于服务器端如过存在端口被占用的问题我采用java异常中的BindException类捕获异常来实现,服务器端运行前端口被占用时使用如下代码提示服务器释放相应的端口在运行服务器端程序!try server=new ServerSocket(8888);catch(BindException e)System.out.println(此程序已经运行,端口已经被占用!请重新运行!); System.exit(0);catch(IOException e) e.printStackTrace(); 2 程序运行过程中当服务器端运行成功时,运行多个客户端时发现之后运行的客户端虽然和服务器能连接但是无法通信,最后通过将服务器端处理客户端连接的功能,和处理用户数据的功能分开,在服

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1