1、Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。 Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型
2、有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。最重要的是,socket 是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的socket 系统调用。客户随机申请一个socket (相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个socket号;服务器拥有全局公认的 socket ,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电
3、话号码)。socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器socket 半相关为全局所公认非常重要。不妨考虑一下,两个完全随机的用户进程之间如何建立通信?假如通信双方没有任何一方的socket 固定,就好比打电话的双方彼此不知道对方的电话号码,要通话是不可能的。2.2、WinSocket的通信原理WinSock是一个基于Socket模型的 API。WinSock在 Windows98,Window NT中使用。WinSock一般由两部分组成:开发组件和运行组件。开发组件是供程序员在windows环境下开发网络应用程序使用的,它包括应用程序接口库函数、头文件和实现的
4、文档,其中最主要的是WINSOCK.H运行组件是以动态链接库(DlL)来实现socket接口的。文件名为WINSOCK.DLL应用程序在执行时装入它就能实现网络通信功能三 、JAVA Sockets编程概述:用Java语言编程实现Socket通信,其原理与使用其他语言基本相同,不同之处是:(1)java是跨平台的编程语言,所以用java编写的Socket通信程序可以工作在所有支持TCP/IP协议和java的软硬件平台上;(2)因为Java是面向对象的语言,所以在编程中需要使用一些与Socket有关的系统类,其中用于实现流Socket的类主要有:InetAddress类,Socket类,Serv
5、erSocket类。InetAddress类的对象用来保存IP地址,Socket类的对象用来创建Socket通信的客户端,Socket通信的服务器端则有ServerSocket类的对象来实现,用上述几个类就可以很方便的生成用户自己的TCP/IP通信程序。这几个类都属于J包,大部分用来处理网络操作的系统类都包含在这个包中,所以用JAVA编写程序是,一般要在程序开始部分用import语句加载这个包,以便引入这些类。用JAVA语言编写Socket程序的过程就是创建和定义Socket类和ServerSocket类的子类的过程。3.1 Java中输入/输出流概念过滤流DataInputStream 和D
6、ataOutputStream 除了分别作为FilterInputStream 和FilterOutputStream的子类外,还分别实现了接口 DataInput 和DataOutput。接口DataInput 中定义的方法主要包括从流中读取基本类型的数据、读取一行数据、或者读取指定长度的字节数,如readBoolean() readInt()、readLine()、readFully()等。接口DataOutput中定义的方法主要是向流中写入基本类型的数据或者写入一定长度的字节数组,如writeChar()、writeDouble() DataInputStream可以从所连接的输入流中读
7、取与机器无关的基本类型数据,用以实现一种独立于具体平台的输入方式;DataInputStream 可以向所连接的输出流写入基本类型的数据。3.2 Java语言Java语言的优点主要表现在:简单、面向对象、多线程、分布性、体系结构中立、安全性等方面。(1) 简单性 Java与C+语言非常相近,但Java比C+简单,它抛弃了C+中的一些不是绝对必要的功能,如头文件、预处理文件、指针、结构、运算符重载、多重继承以及自动强迫同型。 Java实现了自动的垃圾收集,简化了内存管理的工作。这使程序设计更加简便,同时减少了出错的可能。(2) 面向对象 Java提供了简单的类机制和动态的构架模型。对象中封装了它
8、的状态变量和方法,很好地实现了模块化和信息隐藏;而类则提供了一类对象的原型,通过继承和重载机制,子类可以使用或重新定义父类或超类所提供的方法,从而既实现了代码的复用,又提供了一种动态的解决方案。 Java是一种完全面向对象的程序设计语言,它除了数组、布尔和字符三个基本数据类型外的其它类都是对象,它不再支持全局变量。在Java中,如果不创建新类就无法创建程序,Java程序在运行时必须先创建一个类的实例,然后才能提交运行。 Java同样支持继承特性,Java的类可以从其它类中继承行为,但Java只支持类的单重继承,即每个类只能从一个类中继承。Java支持界面,界面允许程序员定义方法但又不立即实现,
9、一个类可以实现多个界面,利用界面可以得到多重继承的许多优点而又没有多重继承的问题。(3) 多线程 多线程使应用程序可以同时进行不同的操作,处理不同的事件。在多线程机制中,不同的线程处理不同的任务,他们之间互不干涉,不会由于一处等待影响其他部分,这样容易实现网络上的实时交互操作。Java程序可以有多个执行线程,如可以让一个线程进行复杂的计算,而让另一个线程与用户进行交互,这样用户可以在不中断计算线程的前提下与系统进行交互。多线程保证了较高的执行效率。 (4) 分布性 Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便的访问其他对象。(5) 体
10、系结构中立 Java是一种网络语言,为使Java程序能在网络的任何地方运行,Java解释器生成与体系结构无关的字节码结构的文件格式。Java为了做到结构中立,除生成机器无关的字节码外,还制定了完全统一的语言文本,如Java的基本数据类型不会随目标机的变化而变化,一个整型总是32位,一个长整型总是64位。为了使Java的应用程序能不依赖于具体的系统,Java语言环境还提供了用于访问底层操作系统功能的类组成的包,当程序使用这些包时,可以确保它能运行在各种支持Java的平台上。java.lang: 一般的语言包。其中包括用于字符串处理、多线程、异常处理和数字函数等的类,该包是实现Java程序运行平台
11、的基本包java.util: 实用工具包。其中包括哈希表、堆栈、时间和日期等java.io: 基于流模型的输入/输出包。该包用统一的流模型实现了各种格式的输入/输出,包括文件系统、网络和设备的输入/输出等: 网络包。该包支持TCP/IP协议,其中提供了socket、URL和WWW的编程接口java.awt: 抽象窗口工具集。其中实现了可以跨平台的图形用户界面组件,包括窗口、菜单、滚动条和对话框等java.applet: 支持applet程序设计的基本包(6) 安全性 用于网络、分布环境下的Java必须要防止病毒的入侵,Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防
12、止了程序员使用欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。3.3与Socket有关的java类:1.InetAddress类:用来保存因特网上的IP地址的类,它含有很多成员变量和方法,其中比较常用的有getLocalHost,getByName和getAllByName,利用它们都可以创建该类的对象,获得一个Java程序操纵、处理的IP地址。例如下面的程序段可以根据主机名获取其IP地址:try InetAddress remoteOP=InetAddress.getByName(“”);catch(UnknownHostException excpt) System.er
13、r.println(“Unknown host:”+excpt);2.Socket类:用来实现TCP/IP通信的端口套接字类,所有希望通过socket来完成与远程主机进行TCP/IP连接和通信的程序,都必须创建一个socket类的对象。这个类对象的作用首先是根据远程主机的IP地址和端口号在本地主机创建一个与远程主机的联接;其次,在连接建立后,本地主机程序就可以使用这个类对象提供的输入/输出通道与远程主机实现通信。当一个socket被创建时,它所指定的连接也将同时被建立并打开,若连接成功,调用这个socket对象的有关方法就可以实现与远程主机的读写通信操作;若连接失败,则构造函数会抛出例外,表示
14、没有成功创建对象。Socket 对象的方法getInputStream()和getOutputStream()用来实现程序通过Socket 对远程方的读写。调用getInputStream()方法返回一个抽象的getInputStream对象,可以从远程方读取二进制数据;调用getOutputStream()方法可以返回一个抽象的getOutputStream对象,实现远程方的写入操作。由于getInputStream和getOutputStream都只是对二进制的原始数据的读写,而不能实现对复杂数据结构的直接操作,所以在实际应用中一般要先对getInputStream()和getOutput
15、Stream()方法返回的输入/输出流作加工变换后再使用。当与Socket的通信结束时,可用调用close()方法来关闭连接。另外,调用getLocalPort()和getInetAddress() 方法还可获得Socket连接的服务器的有关服务器端口号和IP地址等有关信息。3.ServerSocket 类它是java 用来实现TCP/IP通信服务器端程序的主要机制。当一个ServerSocket对象被创建时,程序在本机的指定端口处提供服务并开始监听可能的来自客户端的服务请求。当一个客户请求连接并被接受时,服务器程序将创建一个Socket对象与远程的客户机相连,实现读写通信操作。该类的acce
16、pt()方法用来等待并接受客户机的一个连接,当这个方法被调用时,服务器进程或线程将处于阻塞状态,直至它监听到有一个客户进程提出服务请求,并与之成功连接,这时方法将返回一个新创建的服务器端的Socket对象,这个对象已经与远程客户机连接成功,并可以与客户机的Socket实现读写操作。若服务器可同时提供的连接数超过一个,则服务器程序应该创建一个新的线程来完成与客户机的通信,而保留原有监听线程继续准备接受其它客户机的服务请求。当ServerSocket对象要结束它在特定端口上提供的服务时,可以调用close()方法实现。四、设计方案4.1 WinSocket通信的步骤:1.在服务器端的应用程序中的网
17、络通信的步骤如下:(1)建立服务器端的Socket,开始侦听整个网络中的连接请求。(2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接,再继续进入监听状态。(3)在监听的过程中,如果有用户发出了请求,则服务器会产生一个新的连接Socket来处理用户的请求,而原来的Socket仍然会进行监听操作。(4)当完成通信后,服务器关闭与客户端的Socket连接。2.在客户端应用程序中的网络通信的步骤如下:(1)建立一个客户端的Socket。(2)从命令行中得到服务器的名字,并进行查询以得到服务器的IP地址;(3)从命令行中得到服务器所提供的端口号,以便进行下一步
18、的操作;(4)发送连接请求到服务器,并等待服务器的回馈信息。(5)连接成功后,与服务器进行数据的交互。(6)数据处理完毕后,关闭自身的Socket连接,释放进行连接所分配的资源,客户端的程序运行完毕。五、系统的原理框图和程序流程图四、六客户机/服务器通信的实现:6.1服务器端的开发(1)服务器端实现对主机某个端口不断监听,并不断接受客户端的连接请求,当受到连接后打印客户的的信息并向客户端完成一次服务。(2)使用readUTF方法的DataInputStream处理流提供的方法,功能为读取满足UTF格式的字符串。并使用writeUTF方法为DataOutputStream处理流提供的方法,功能为
19、写出满足UTF 格式的字符。一般在网络中发生消息都在发送端用writeUTF方法写,在接收端使用readUTF方法读取,这样程序的兼容性强,不容易受到乱码。6.2客户端的开发(1)客户端用于对某个固定IP的服务器进行连接,接着向服务器发送一条消息,最后接受服务器的返回消息并打印。(2)为了与服务器对应,发送消息还要使用DataInputStream的writeUTF方法。同时应该注意的两边的首发顺序是互逆的,服务器现售后发,客户端先发后收。五程序的实现6.3服务器端的实现 6.3.1服务器端用一个类Sa来实现,创建一个ServerSocket类的对象,实现对端口9999的不断监听,直到受到客户
20、端的信息。6.3.2代码如下:import java.io.*;import .*;import java.util.*;public class Sa public static void main(String args) int count =0; /String s=; try ServerSocket server=new ServerSocket(9999); /打印提示信息 System.out.println(服务器已经对9999端口进行监听); /服务器循环接受客户断请求 /if(!s.equals(end) while(true) Socket sc=server.acce
21、pt(); /获取当前连接的输入流,并使用处理流进行封装 DataInputStream din=new DataInputStream(sc.getInputStream(); /获取当前连接的输出流,并使用处理流惊喜封装 DataOutputStream dout=new DataOutputStream(sc.getOutputStream(); /打印客户端的信息 System.out.println(=+(+count)+= System.out.print(客户端口号:+sc.getInetAddress();,本地端口:+sc.getPort();客户端信息:+din.readU
22、TF(); /向客户端发送回应信息 dout.writeUTF(sc.getInetAddress()+您好,现在服务器的时间是:+(new Date()+. /关闭流 /BufferedReader in=new BufferedReader(new InputStreamReader(din.read(); /s=in.readLine(); /s=din.readUTF(); din.close(); dout.close(); sc.close(); / else / server.close(); catch(Exception e) e.printStackTrace(); 6.3
23、.3运行结果:6.4客户端的实现:6.4.1客户端主要用Sb类来实现对服务器端的连接功能,创建一个Socket对象实现对服务器的连接。6.4.2代码如下:public class Sb public static void main(String args) String m1,m2; m1=222.22.125.142 m2= /创建连接到服务器的Socket对象 while(!m2.equals( Socket sc=new Socket(m1,9999);连接成功,请输入: BufferedReader input=new BufferedReader(new InputStreamRe
24、ader(System.in); m2=input.readLine(); dout.writeUTF(m2); System.out.println(din.readUTF(); 6.4.3运行结果如下:七、课程设计的总结体会课程设计终于完成了。在这段不长的时间里,我感触很深,也学到很多东西。我对winsock双机通信有了更深的了解和认识,其原理和功能也加深了理解。TCP协议我们以前也学过相关知识,经过这次设计,相关的知识得到进一步巩固,运用也变得更加熟练。通过这次课程设计,我不仅学习到了新的知识,也对以前学过的相关的知识有了更深入的理解和掌握。不仅加强了我的理论知识的学习,也增强了我的动手
25、能力,对知识的理解不再局限于表明,理解更加透彻,也更巩固。以前的学习都是单一方面的知识,这次通过课程设计,将这三个方面的知识综合起来,显然难度是加大了。开始的时候我也感觉似乎无从下手。但在网上查找了相关资料,并且请教了一些同学后,有了一些头绪,并着手开始设计和实践。经过十几天的努力,任务终于圆满完成。 我这次课程设计中,我得到了不少同学的指点和帮助,他们不厌其烦地给我讲解甚至是很简单的问题,也在我迷茫和困惑的时候,给我一两句话,让我幡然顿悟。我这次任务的完成也有你们的辛苦和功劳,无法在此一一道明,只有一并表示感谢。谢谢你们!八、参考文献【1】张跃平 Java2实用教程 清华大学出版社,2005年【2】谢希仁 计算机网络第四版 电子工业出版社,2003年【3】吴亚峰 java6.0编程指南 人民邮电出版社,2007年【4】李 凌 WINSOCK 网络编程实用教程 清华大学出版社 2003年
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1