当前位置:文档之家› 史上最全java socket通信

史上最全java socket通信

史上最全java socket通信
史上最全java socket通信

java socket通信

1:简介

Java语言从一开始就是为了让人们使用互联网而设计的,它为实现程序的相互通信提供了许多有用的抽象应用程序接口(API,Application Programming Interface),这类应用程序接口被称为套接字(sockets)。

信息(information)是指由程序创建和解释的字节序列。在计算机网络环境中,这些字节序列被称为分组报文(packets)。一组报文包括了网络用来完成工作的控制信息,有时还包括一些用户数据。用于定位分组报文目的地址的信息就是一个例子。路由器正是利用了这些控制信息来实现对每个报文的转发。

协议(protocol)相当于是相互通信的程序间达成的一种约定,它规定了分组报文的交换方式和它们包含的意义。一组协议规定了分组报文的结构(例如报文中的哪一部分表明了其目的地址)以及怎样对报文中所包含的信息进行解析。设计一组协议,通常是为了在一定约束条件下解决某一特定的问题。比如,超文本传输协议(HTTP,HyperText Transfer Protocol)是为了解决在服务器间传递超文本对象的问题,这些超文本对象在服务器中创建和存储,并由Web浏览器进行可视化,以使其对用户有用。即时消息协议是为了使两个或更多用户间能够交换简短的文本信息。

Application:应用程序;Socket:套接字;Host:主机;Channel:通信信道;Ethernet:以太网;Router:路由器;Network Layer:网络层;Transport Layer:传输层。

IP协议提供了一种数据报服务:每组分组报文都由网络独立处理和分发,就像信件或包裹通过邮政系统发送一样。为了实现这个功能,每个IP报文必须包含一个保存其目的地址(address)的字段,就像你所投递的每份包裹都写明了收件人地址。(我们随即会对地址进行更详细的说明。)尽管绝大部分递送公司会保证将包裹送达,但IP协议只是一个"尽力而为"(best-effort)的协议:它试图分发每一个分组报文,但在网络传输过程中,偶

尔也会发生丢失报文,使报文顺序被打乱,或重复发送报文的情况。

IP协议层之上称为传输层(transport layer)。它提供了两种可选择的协议:TCP协议和UDP协议。这两种协议都建立在IP层所提供的服务基础上,但根据应用程序协议(application protocols)的不同需求,它们使用了不同的方法来实现不同方式的传输。TCP协议和UDP协议有一个共同的功能,即寻址。回顾一下,IP协议只是将分组报文分发到了不同的主机,很明显,还需要更细粒度的寻址将报文发送到主机中指定的应用程序,因为同一主机上可能有多个应用程序在使用网络。TCP协议和UDP协议使用的地址叫做端口号(port numbers),都是用来区分同一主机中的不同应用程序。TCP协议和UDP协议也称为端到端传输协议(end-to-end transport protocols),因为它们将数据从一个应用程序传输到另一个应用程序,而IP协议只是将数据从一个主机传输到另一主机。

TCP协议能够检测和恢复IP层提供的主机到主机的信道中可能发生的报文丢失、重复及其他错误。TCP协议提供了一个可信赖的字节流(reliable byte-stream)信道,这样应用程序就不需要再处理上述的问题。TCP协议是一种面向连接(connection-oriented)的协议:在使用它进行通信之前,两个应用程序之间首先要建立一个TCP连接,这涉及到相互通信的两台电脑的TCP部件间完成的握手消息(handshake messages)的交换。使用TCP协议在很多方面都与文件的输入输出(I/O, Input/Output)相似。实际上,由一个程序写入的文件再由另一个程序读取就是一个TCP连接的适当模型。另一方面,UDP协议并不尝试对IP层产生的错误进行修复,它仅仅简单地扩展了IP协议"尽力而为"的数据报服务,使它能够在应用程序之间工作,而不是在主机之间工作。因此,使用了UDP协议的应用程序必须为处理报文丢失、顺序混乱等问题做好准备。

在TCP/IP协议中,有两部分信息用来定位一个指定的程序:互联网地址(Internet address)和端口号(port number)。其中互联网地址由IP协议使用,而附加的端口地址信息由传输协议(TCP或IP协议)对其进行解析。互联网地址由二进制的数字组成,有两种型式,分别对应了两个版本的标准互联网协议。现在最常用的版本是版本4,即

IPv4,另一个版本是刚开始开发的版本6,即IPv。IPv4的地址长32位,只能区分大约40亿个独立地址,对于如今的互联网来说,这是不够大的。(也许看起来很多,但由于地址的分配方式的原因,有很多都被浪费了)出于这个原因引入了IPv6,它的地址有128位长。

一台主机,只要它连接到网络,一个互联网地址就能定位这条主机。但是反过来,一台主机并不对应一个互联网地址。因为每台主机可以有多个接口,每个接口又可以有多个地址。(实际上一个接口可以同时拥有IPv4地址和IPv6地址)。端口号是一组16位的无符号二进制数,每个端口号的范围是1到65535。(0被保留)。每个版本的IP协议都定义了一些特殊用途的地址。其中值得注意的一个是回环地址(loopback address),该地

址总是被分配个一个特殊的回环接口(loopback interface)。回环接口是一种虚拟设备,它的功能只是简单地将发送给它的报文直接回发给发送者。IPv4的回环地址是

127.0.0.1[,IPv6的回环地址是0:0:0:0:0:0:0:1。

IPv4地址中的另一种特殊用途的保留地址包括那些"私有用途"的地址。它们包括IPv4中所有以10或192.168开头的地址,以及第一个数是172,第二个数在16到31的地址。(在IPv6中没有相应的这类地址)这类地址最初是为了在私有网络中使用而设计的,不属于公共互联网的一部分。现在这类地址通常被用在家庭或小型办公室中,这些地方通过NAT(Network Address Translation,网络地址转换)设备连接到互联网。NAT设备的功能就像一个路由器,转发分组报文时将转换(重写)报文中的地址和端口。更准确地说,它将一个接口中报文的私有地址端口对(private address, port pairs)映射成另一个接口中的公有地址端口对(public address, port pairs)。这就使一小组主机(如家庭网络)能够有效地共享同一个IP地址。重要的是这些内部地址不能从公共互联网访问。

多播(multicast)地址。普通的IP地址(有时也称为"单播"地址)只与唯一一个目的地址相关联,而多播地址可能与任意数量的目的地址关联。IPv4中的多播地址在点分格式中,第一个数字在224到239之间。IPv6中,多播地址由FF开始。

习惯于通过名字来指代一个主机,例如:https://www.doczj.com/doc/391444706.html,。然而,互联网协议只能处理二进制的网络地址,而不是主机名。首先应该明确的是,使用主机名而不使用地址是出于方便性的考虑,这与TCP/IP提供的基本服务是相互独立的。你也可以不使用名字来编写和使用TCP/IP应用程序。当使用名字来定位一个通信终端时,系统将做一些额外的工作把名字解析成地址。有两个原因证明这额外的步骤是值得的:第一,相对于点分形式(或IPv6中的十六进制数字串),人们更容易记住名字;第二,名字提供了一个间接层,使IP 地址的变化对用户不可见。如网络服务器https://www.doczj.com/doc/391444706.html,的地址就改变过。由于我们通常都使用网络服务器的名字,而且地址的改变很快就被反应到映射主机名和网络地址的服务上,如https://www.doczj.com/doc/391444706.html,从之前的地址208.164.121.48对应到了现在的地址,这种变化对通过名字访问该网络服务器的程序是透明的。名字解析服务可以从各种各样的信息源获取信息。两个主要的信息源是域名系统(DNS,Domain Name System)和本地配置数据库。DNS是一种分布式数据库。DNS协议允许连接到互联网的主机通过TCP或UDP协议从DNS数据库中获取信息。本地配置数据库通常是一种与具体操作系统相关的机制,用来实现本地名称与互联网地址的映射。

客户端(client)和服务器(server)这两个术语代表了两种角色:客户端是通信的发起者,而服务器程序则被动等待客户端发起通信,并对其作出响应。客户端与服务器组成了应用程序(application)。服务器具有一定的特殊能力,如提供数据库服务,并使任何客

户端能够与之通信。一个程序是作为客户端还是服务器,决定了它在与其对等端(peer)建立通信时使用的套接字API的形式(客户端的对等端是服务器,反之亦然)。更进一步来说,客户端与服务器端的区别非常重要,因为客户端首先需要知道服务器的地址和端口号,反之则不需要。如果有必要,服务器可以使用套接字API,从收到的第一个客户端通信消息中获取其地址信息。这与打电话非常相似:被呼叫者不需要知道拨电话者的电话号码。就像打电话一样,只要通信连接建立成功,服务器和客户端之间就没有区别了。服务器可以使用任何端口号,但客户端必须能够获知这些端口号。在互联网上,一些常用的端口号被约定赋给了某些应用程序。

Socket(套接字)是一种抽象层,应用程序通过它来发送和接收数据,就像应用程序打开一个文件句柄,将数据读写到稳定的存储器上一样。一个socket允许应用程序添加到网络中,并与处于同一个网络中的其他应用程序进行通信。一台计算机上的应用程序向socket 写入的信息能够被另一台计算机上的另一个应用程序读取,反之亦然。

Applications:应用程序;TCP sockets:TCP套接字;TCP ports:TCP端口;Socket References:套接字引用;UDP sockets:UDP套接字;Sockets bound to ports:套接字绑定到端口;UDP ports:UDP端口。

不同类型的socket与不同类型的底层协议族以及同一协议族中的不同协议栈相关联。现在TCP/IP协议族中的主要socket类型为流套接字(sockets sockets)和数据报套接字(datagram sockets)。流套接字将TCP作为其端对端协议(底层使用IP协议),提供了一个可信赖的字节流服务。一个TCP/IP流套接字代表了TCP连接的一端。数据报套接字使用UDP协议(底层同样使用IP协议),提供了一个"尽力而为"(best-effort)的数据报服务,应用程序可以通过它发送最长65500字节的个人信息。当然,其他协议族也支持

流套接字和数据报套接字,本文只对TCP流套接字和UDP数据报套接字进行讨论。一个TCP/IP套接字由一个互联网地址,一个端对端协议(TCP或UDP协议)以及一个端口号唯一确定。主机中的多个程序可以同时访问同一个套接字。在实际应用中,访问相同套接字的不同程序通常都属于同一个应用(例如,Web服务程序的多个拷贝),但从理论上讲,它们是可以属于不同应用的。

2:基本套接字

一个客户端要发起一次通信,首先必须知道运行服务器端程序的主机的IP地址。然后由网络的基础结构利用目标地址(destination address),将客户端发送的信息传递到正确的主机上。在Java中,地址可以由一个字符串来定义,这个字符串可以是数字型的地址(不同版本的IP地址有不同的型式,如192.0.2.27是一个IPv4地址,

fe20:12a0::0abc:1234是一个IPv6地址),也可以是主机名(如

https://www.doczj.com/doc/391444706.html,)。主机名必须能够被解析(resolved)成数字型地址才能用来进行通信。

NetworkInterface:NetworkInterface类提供了访问主机所有接口的信息的功能。(IP地址实际上是分配给了主机与网络之间的连接,而不是主机本身)

InetAddress:网络接口,代表了一个网络目标地址,包括主机名和数字类型的地址信息。该类有两个子类,Inet4Address和Inet6Address,分别对应了目前IP地址的两个版本。InetAddress实例是不可变的,一旦创建,每个实例就始终指向同一个地址。

SocketAddress:抽象类,代表了套接字地址的一般型式,它的子类InetSocketAddress 是针对TCP/IP套接字的特殊型式,封装了一个InetAddress和一个端口号。InetSocketAddress类为主机地址和端口号提供了一个不可变的组合。只接收端口号作为参数的构造函数将使用特殊的"任何"地址来创建实例,这点对于服务器端非常有用。接收字符串主机名的构造函数会尝试将其解析成相应的IP地址。

Socket和ServerSocket:Java为TCP协议提供了两个类:Socket类和ServerSocket 类。一个Socket实例代表了TCP连接的一端。一个TCP连接(TCP connection)是一条抽象的双向信道,两端分别由IP地址和端口号确定。在开始通信之前,要建立一个TCP连接,这需要先由客户端TCP向服务器端TCP发送连接请求。ServerSocket实例则监听TCP连接请求,并为每个请求创建新的Socket实例。也就是说,服务器端要同时处理ServerSocket实例和Socket实例,而客户端只需要使用Socket实例。

DatagramPacket:Java程序员通过DatagramPacket 类和DatagramSocket类来使用UDP套接字。客户端和服务器端都使用DatagramSockets来发送数据,使用DatagramPackets来接收数据。

DatagramPacket:UDP终端交换的是一种称为数据报文的自包含(self-contained)信息。这种信息在Java中表示为DatagramPacket类的实例,发送信息时,Java程序创建一个包含了待发送信息的DatagramPacket实例,并将其作为参数传递给DatagramSocket类的send()方法。接收信息时,Java程序首先创建一个DatagramPacket实例,该实例中预先分配了一些空间(一个字节数组byte[]),并将接收到的信息存放在该空间中。然后把该实例作为参数传递给DatagramSocket类的receive()方法。

InetAddressExample.java

[java]view plaincopy

1.import java.util.Enumeration;

2.import https://www.doczj.com/doc/391444706.html,.*;

3.

4.public class InetAddressExample {

5.

6.public static void main(String[] args) {

7.

8.// Get the network interfaces and associated addresses for this host

9.try {

10. Enumeration interfaceList = NetworkInterface.g

etNetworkInterfaces();

11.if (interfaceList == null) {

12. System.out.println("--No interfaces found--");

13. } else {

14.while (interfaceList.hasMoreElements()) {

15. NetworkInterface iface = interfaceList.nextElement();

16. System.out.println("Interface " + iface.getName() + ":")

;

17. Enumeration addrList = iface.getInetAddress

es();

18.if (!addrList.hasMoreElements()) {

19. System.out.println("\t(No addresses for this interfa

ce)");

20. }

21.while (addrList.hasMoreElements()) {

22. InetAddress address = addrList.nextElement();

23. System.out.print("\tAddress "+ ((address instanceof

Inet4Address ? "(v4)": (address instanceof Inet6Address ? "(v6)": "(?)"))));

24. System.out.println(": " + address.getHostAddress());

25. }

26. }

27. }

28. } catch (SocketException se) {

29. System.out.println("Error getting network interfaces:"+ se.getMe

ssage());

30. }

31.

32.// Get name(s)/address(es) of hosts given on command line

33.for (String host : args) {

34.try {

35. System.out.println(host + ":");

36. InetAddress[] addressList = InetAddress.getAllByName(host);

37.for (InetAddress address : addressList) {

38. System.out.println("\t" + address.getHostName() + "/"+ a

ddress.getHostAddress());

39. }

40. } catch (UnknownHostException e) {

41. System.out.println("\tUnable to find address for " + host);

42. }

43. }

44. }

45.}

运行结果:

% java InetAddressExample https://www.doczj.com/doc/391444706.html, blah.blah 129.35.69.7

Interface lo:

Address (v4): 127.0.0.1

Address (v6): 0:0:0:0:0:0:0:1

Address (v6): fe80:0:0:0:0:0:0:1%1

Interface eth0:

Address (v4): 192.168.159.1

Address (v6): fe80:0:0:0:250:56ff:fec0:8%4

https://www.doczj.com/doc/391444706.html,:

https://www.doczj.com/doc/391444706.html,/129.35.69.7

blah.blah:

Unable to find address for blah.blah

129.35.69.7:

129.35.69.7/129.35.69.7

地址解析器在放弃对一个主机名的解析之前,会到多个不同的地方查找该主机名。如果由于某些原因使名字服务失效(例如由于程序所运行的机器并没有连接到所有的网络),试图通过名字来定位一个主机就可能失败。而且这还将耗费大量的时间,因为系统将尝试各种不同的方法来将主机名解析成IP地址,因此最好能直接使用点分形式的IP地址来访问一个主机

InetAddress: 创建和访问

static InetAddress[ ] getAllByName(String host)

static InetAddress getByName(String host)

static InetAddress getLocalHost()

byte[] getAddress()

InetAddress: 字符串表示

String toString()

String getHostAddress()

String getHostName()

String getCanonicalHostName()

InetAddress: 检测属性

boolean isAnyLocalAddress()

boolean isLinkLocalAddress()

boolean isLoopbackAddress()

boolean isMulticastAddress()

boolean isMCGlobal()

boolean isMCLinkLocal()

boolean isMCNodeLocal()

boolean isMCOrgLocal()

boolean isMCSiteLocal()

boolean isReachable(int timeout)

boolean isReachable(NetworkInterface netif, int ttl, int timeout)

最后两个方法检查是否真能与InetAddress地址确定的主机进行数据报文交换。注意,与其他句法检查方法不一样的是,这些方法引起网络系统执行某些动作,即发送数据报文。系统不断尝试发送数据报文,直到指定的时间(以毫秒为单位)用完才结束。后面这种形式更详细:它明确指出数据报文必须经过指定的网络接口(NetworkInterface),并检查其是否能在指定的生命周期(time-to-live,TTL)内联系上目的地址。TTL限制了一个数据报文在网络上能够传输的距离。后面两个方法的有效性通常还受到安全管理配置方面的限制。

NetworkInterface: 创建,获取信息

static EnumerationNetworkInterface getNetworkInterfaces()

static NetworkInterface getByInetAddress(InetAddress addr)

static NetworkInterface getByName(String name)

EnumerationInetAddress getInetAddresses()

String getName()

String getDisplayName()

上面第一个方法非常有用,使用它可以很容易获取到运行程序的主机的IP地址:通过getNetworkInterfaces()方法可以获取一个接口列表,再使用实例的getInetAddresses()方法就可以获取每个接口的所有地址。注意:这个列表包含了主机的所有接口,包括不能够向网络中的其他主机发送或接收消息的虚拟回环接口。同样,列表中可能还包括外部不可达的本地链接地址。由于这些列表都是无序的,所以你不能简单地认为,列表中第一个接口的第一个地址一定能够通过互联网访问,而是要通过前面提到的InetAddress类的属性检查方法,来判断一个地址不是回环地址,不是本地链接地址等等。getName()方法返回一个接口(interface)的名字(不是主机名)。这个名字由字母字符串加上一个数字组成,如eth0。在很多系统中,回环地址的名字都是lo0。

TCP套接字

TCP客户端

客户端向服务器发起连接请求后,就被动地等待服务器的响应。典型的TCP客户端要经过下面三步:

1.创建一个Socket实例:构造器向指定的远程主机和端口建立一个TCP连接。

2. 通过套接字的输入输出流(I/O streams)进行通信:一个Socket连接实例包括一个InputStream和一个OutputStream,它们的用法同于其他Java输入输出流。

3. 使用Socket类的close()方法关闭连接。

TCPEchoClient.java(这是一个通过TCP协议与回馈服务器(echo server)进行通信的客户端)

[java]view plaincopy

1.import https://www.doczj.com/doc/391444706.html,.Socket;

2.import https://www.doczj.com/doc/391444706.html,.SocketException;

3.import java.io.IOException;

4.import java.io.InputStream;

5.import java.io.OutputStream;

6.

7.public class TCPEchoClient {

8.public static void main(String[] args) throws IOException {

9.if ((args.length < 2) || (args.length > 3)) // Test for correct # of

args

10.throw new IllegalArgumentException("Parameter(s):

> []");

11. String server = args[0]; // Server name or IP address

12.// Convert argument String to bytes using the default character enco

ding

13.byte[] data = args[1].getBytes();

14.int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7;

15.// Create socket that is connected to server on specified port

16. Socket socket = new Socket(server, servPort);

17. System.out.println("Connected to server...sending echo string");

18. InputStream in = socket.getInputStream();

19. OutputStream out = socket.getOutputStream();

20. out.write(data); // Send the encoded string to the server

21.// Receive the same string back from the server

22.int totalBytesRcvd = 0; // Total bytes received so far

23.int bytesRcvd; // Bytes received in last read

24.while (totalBytesRcvd < data.length) {

25.if ((bytesRcvd = in.read(data, totalBytesRcvd, data.length- tota

lBytesRcvd)) == -1)

26.throw new SocketException("Connection closed prematurely");

27. totalBytesRcvd += bytesRcvd;

28. } // data array is full

29. System.out.println("Received: " + new String(data));

30. socket.close(); // Close the socket and its streams

31. }

32.}

为什么不只用一个read方法呢?TCP协议并不能确定在read()和write()方法中所发送信息的界限,也就是说,虽然我们只用了一个write()方法来发送回馈字符串,回馈服务器也可能从多个块(chunks)中接受该信息。即使回馈字符串在服务器上存于一个块中,在返回的时候,也可能被TCP协议分割成多个部分。对于初学者来说,最常见的错误就是认为由一个write()方法发送的数据总是会由一个read()方法来接收。

Socket: 创建

Socket(InetAddress remoteAddr, int remotePort)

Socket(String remoteHost, int remotePort)

Socket(InetAddress remoteAddr, int remotePort, InetAddress localAddr, int localPort) Socket(String remoteHost, int remotePort, InetAddress localAddr, int localPort)

Socket()

前两个构造函数没有指定本地地址和端口号,因此将采用默认地址和可用的端口号。在有多个接口的主机上指定本地地址是有用的。指定的目的地址字符串参数可以使用与InetAddress构造函数的参数相同的型式。最后一个构造函数创建一个没有连接的套接字,在使用它进行通信之前,必须进行显式连接(通过connect()方法)。

Socket: 操作

void connect(SocketAddress destination)

void connect(SocketAddress destination, int timeout)

InputStream getInputStream()

OutputStream getOutputStream()

void close()

void shutdownInput()

void shutdownOutput()

connect()方法将使指定的终端打开一个TCP连接。SocketAddress抽象类代表了套接字地址的一般型式,它的子类InetSocketAddress是针对TCP/IP套接字的特殊型式。与远程主机的通信是通过与套接字相关联的输入输出流实现的。可以使用get...Stream()方法来获取这些流。close()方法关闭套接字及其关联的输入输出流,从而阻止对其的进一步操作。shutDownInput()方法关闭TCP流的输入端,任何没有读取的数据都将被舍弃,包括那些已经被套接字缓存的数据、正在传输的数据以及将要到达的数据。后续的任何从套接

字读取数据的尝试都将抛出异常。shutDownOutput()方法在输出流上也产生类似的效果,但在具体实现中,已经写入套接字输出流的数据,将被尽量保证能发送到另一端。注意:默认情况下,Socket是在TCP连接的基础上实现的,但是在Java中,你可以改变Socket的底层连接。

Socket: 获取/检测属性

InetAddress getInetAddress()

int getPort()

InetAddress getLocalAddress()

int getLocalPort()

SocketAddress getRemoteSocketAddress()

SocketAddress getLocalSocketAddress()

Socket类实际上还有大量的其他相关属性,称为套接字选项(socket options)。这些属性对于编写基本应用程序是不必要的

InetSocketAddress: 创建与访问

InetSocketAddress(InetAddress addr, int port)

InetSocketAddress(int port)

InetSocketAddress(String hostname, int port)

static InetSocketAddress createUnresolved(String host, int port)

boolean isUnresolved()

InetAddress getAddress()

int getPort()

String getHostName()

String toString()

createUnresolved()静态方法允许在不对主机名进行解析情况下创建实例

TCP服务器端

服务器端的工作是建立一个通信终端,并被动地等待客户端的连接。典型的TCP服务器有如下两步工作:

1. 创建一个ServerSocket实例并指定本地端口。此套接字的功能是侦听该指定端口收到的连接。

2. 重复执行:

a. 调用ServerSocket的accept()方法以获取下一个客户端连接。基于新建立的客户端连接,创建一个Socket实例,并由accept()方法返回。

b. 使用所返回的Socket实例的InputStream和OutputStream与客户端进行通信。

c. 通信完成后,使用Socket类的close()方法关闭该客户端套接字连接。TCPEchoServer.java(为我们前面的客户端程序实现了一个回馈服务器。这个服务器程序非常简单,它将一直运行,反复接受连接请求,接收并返回字节信息。直到客户端关闭了连接,它才关闭客户端套接字。)

[java]view plaincopy

1.import https://www.doczj.com/doc/391444706.html,.*; // for Socket, ServerSocket, and InetAddress

2.import java.io.*; // for IOException and Input/OutputStream

3.

4.public class TCPEchoServer {

5.

6.private static final int BUFSIZE = 32; // Size of receive buffer

7.

8.public static void main(String[] args) throws IOException {

9.if (args.length != 1) // Test for correct # of args

10.throw new IllegalArgumentException("Parameter(s): ");

11.int servPort = Integer.parseInt(args[0]);

12.// Create a server socket to accept client connection requests

13. ServerSocket servSock = new ServerSocket(servPort);

14.int recvMsgSize; // Size of received message

15.byte[] receiveBuf = new byte[BUFSIZE]; // Receive buffer

16.while (true) { // Run forever, accepting and servicing connections

17. Socket clntSock = servSock.accept(); // Get client connection

18. SocketAddress clientAddress = clntSock.getRemoteSocketAddress();

19. System.out.println("Handling client at " + clientAddress);

20. InputStream in = clntSock.getInputStream();

21. OutputStream out = clntSock.getOutputStream();

22.// Receive until client closes connection, indicated by -

1 return

23.while ((recvMsgSize = in.read(receiveBuf)) != -1) {

24. out.write(receiveBuf, 0, recvMsgSize);

25. }

26. clntSock.close(); // Close the socket. We are done with this cli

ent!

27. }

28./* NOT REACHED */

29. }

30.}

ServerSocket: 创建

ServerSocket(int localPort)

ServerSocket(int localPort, int queueLimit)

ServerSocket(int localPort, int queueLimit, InetAddress localAddr)

ServerSocket()

如果指定了本地地址,该地址就必须是主机的网络接口之一;如果没有指定,套接字将接受指向主机任何IP地址的连接。这将对有多个接口而服务器端只接受其中一个接口连接的主机非常有用。第四个构造函数能创建一个没有关联任何本地端口的ServerSocket实例。在使用该实例前,必须为其绑定(bind()方法)一个端口号。

ServerSocket: 操作

void bind(int port)

void bind(int port, int queuelimit)

Socket accept()

void close()

bind()方法为套接字关联一个本地端口。每个ServerSocket实例只能与唯一一个端口相关联。如果该实例已经关联了一个端口,或所指定的端口已经被占用,则将抛出IOException异常。accept()方法为下一个传入的连接请求创建Socket实例,并将已成功连接的Socket实例返回给服务器端套接字。如果没有连接请求等待,accept()方法将阻塞等待,直到有新的连接请求到来或超时。close()方法关闭套接字。调用该方法后,服务器将拒绝接受传入该套接字的客户端连接请求。

ServerSocket: 获取属性

InetAddress getInetAddress()

SocketAddress getLocalSocketAddress()

int getLocalPort()

如果在一个TCP套接字关联的输出流上进行操作,当大量的数据已发送,而连接的另一端所关联的输入流最近没有调用read()方法时,OutputStream中的方法可能会阻塞。如果不作特殊处理,这可能会产生一些不想得到的后果。在一个TCP套接字关联的输入流上没有数据可读,而又没有检测到流结束标记时,所有的read()方法都将阻塞等待,直到至少有

一个字节可读。在没有数据可读,同时又检测到流结束标记时,InputStream中的方法都将返回-1。

UDP套接字

UDP协议提供了一种不同于TCP协议的端到端服务。实际上UDP协议只实现两个功能:1)在IP协议的基础上添加了另一层地址(端口),2)对数据传输过程中可能产生的数据错误进行了检测,并抛弃已经损坏的数据。由于其简单性,UDP套接字具有一些与我们之前所看到的TCP套接字不同的特征。例如,UDP套接字在使用前不需要进行连接。TCP协议与电话通信相似,而UDP协议则与邮件通信相似:你寄包裹或信件时不需要进行"连接",但是你得为每个包裹和信件指定目的地址。类似的,每条信息(即数据报文,datagram)负载了自己的地址信息,并与其他信息相互独立。在接收信息时,UDP套接字扮演的角色就像是一个信箱,从不同地址发送来的信件和包裹都可以放到里面。一旦被创建,UDP套接字就可以用来连续地向不同的地址发送信息,或从任何地址接收信息。UDP套接字与TCP套接字的另一个不同点在于他们对信息边界的处理方式不同:UDP套接字将保留边界信息。这个特性使应用程序在接受信息时,从某些方面来说比使用TCP套接字更简单。最后一个不同点是,UDP协议所提供的端到端传输服务是尽力而为(best-effort)的,即UDP套接字将尽可能地传送信息,但并不保证信息一定能成功到达目的地址,而且信息到达的顺序与其发送顺序不一定一致(就像通过邮政部门寄信一样)。因此,使用了UDP套接字的程序必须准备好处理信息的丢失和重排。

既然UDP协议为程序带来了这个额外的负担,为什么还会使用它而不使用TCP协议呢?原因之一是效率:如果应用程序只交换非常少量的数据,例如从客户端到服务器端的简单请求消息,或一个反方向的响应消息,TCP连接的建立阶段就至少要传输其两倍的信息量(还有两倍的往返延迟时间)。另一个原因是灵活性:如果除可靠的字节流服务外,还有其他的需求,UDP协议则提供了一个最小开销的平台来满足任何需求的实现。

与TCP协议发送和接收字节流不同,UDP终端交换的是一种称为数据报文的自包含(self-contained)信息。这种信息在Java中表示为DatagramPacket类的实例。发送信息时,Java程序创建一个包含了待发送信息的DatagramPacket实例,并将其作为参数传递给DatagramSocket类的send()方法。接收信息时,Java程序首先创建一个DatagramPacket实例,该实例中预先分配了一些空间(一个字节数组byte[]),并将接收到的信息存放在该空间中。然后把该实例作为参数传递给DatagramSocket类的receive()方法。除传输的信息本身外,每个DatagramPacket实例中还附加了地址和端口信息,其具体含义取决于该数据报文是被发送还是被接收。若是要发送的数据报文,

DatagramPacket实例中的地址则指明了目的地址和端口号,若是接收到的数据报文,DatagramPacket实例中的地址则指明了所收信息的源地址。

DatagramPacket: 创建

DatagramPacket(byte[ ] data, int length)

DatagramPacket(byte[ ] data, int offset, int length)

DatagramPacket(byte[ ] data, int length, InetAddress remoteAddr, int remotePort) DatagramPacket(byte[ ] data, int offset, int length, InetAddress remoteAddr, int remotePort)

DatagramPacket(byte[ ] data, int length, SocketAddress sockAddr)

DatagramPacket(byte[ ] data, int offset, int length, SocketAddress sockAddr)

以上构造函数都创建一个数据部分包含在指定的字节数组中的数据报文,前两种形式的构造函数主要用来创建接收的端的DatagramPackets实例,因为没有指定其目的地址(尽管可以通过setAddress() 和setPort()方法,或setSocketAddress()方法来指定)。后四种形式主要用来创建发送端的DatagramPackets实例。如果指定了offset,数据报文的数据部分将从字节数组的指定位置发送或接收数据。length参数指定了字节数组中在发送时要传输的字节数,或在接收数据时所能接收的最多字节数。length参数可能比data.length小,但不能比它大。

DatagramPacket: 地址处理

InetAddress getAddress()

void setAddress(InetAddress address)

int getPort()

void setPort(int port)

SocketAddress getSocketAddress()

void setSocketAddress(SocketAddress sockAddr)

DatagramPacket: 处理数据

int getLength()

void setLength(int length)

int getOffset()

byte[ ] getData()

void setData(byte[ ] data)

void setData(byte[ ] buffer, int offset, int length)

UDP客户端

UDP客户端首先向被动等待联系的服务器端发送一个数据报文。一个典型的UDP客户端主要执行以下三步:

1. 创建一个DatagramSocket实例,可以选择对本地地址和端口号进行设置。

2. 使用DatagramSocket类的send() 和receive()方法来发送和接收DatagramPacket实例,进行通信。

3. 通信完成后,使用DatagramSocket类的close()方法来销毁该套接字。

与Socket类不同,DatagramSocket实例在创建时并不需要指定目的地址。这也是TCP 协议和UDP协议的最大不同点之一。在进行数据交换前,TCP套接字必须跟特定主机和另一个端口号上的TCP套接字建立连接,之后,在连接关闭前,该套接字就只能与相连接的那个套接字通信。而UDP套接字在进行通信前则不需要建立连接,每个数据报文都可以发送到或接收于不同的目的地址。(DatagramSocket类的connect()方法确实允许指定远程地址和端口,但该功能是可选的。)

使用UDP协议的一个后果是数据报文可能丢失。在我们的回馈协议中,客户端的回馈请求信息和服务器端的响应信息都有可能在网络中丢失。回顾前面所介绍的TCP回馈客户端,其发送了一个回馈字符串后,将在read()方法上阻塞等待响应。如果试图在我们的UDP回馈客户端上使用相同的策略,数据报文丢失后,我们的客户端就会永远阻塞在receive()方法上。为了避免这个问题,我们在客户端使用DatagramSocket类的setSoTimeout()方法来指定receive()方法的最长阻塞时间,因此,如果超过了指定时间仍未得到响应,客户端就会重发回馈请求。我们的回馈客户端执行以下步骤:

1. 向服务器端发送回馈字符串。

2. 在receive()方法上最多阻塞等待3秒钟,在超时前若没有收到响应,则重发请求(最多重发5次)。

3. 终止客户端。

UDPEchoClientTimeout.java(UDP版本的回馈客户端,在客户端使用DatagramSocket 类的setSoTimeout()方法来指定receive()方法的最长阻塞时间,因此,如果超过了指定时间仍未得到响应,客户端就会重发回馈请求)

[java]view plaincopy

1.import https://www.doczj.com/doc/391444706.html,.DatagramSocket;

2.import https://www.doczj.com/doc/391444706.html,.DatagramPacket;

3.import https://www.doczj.com/doc/391444706.html,.InetAddress;

4.import java.io.IOException;

5.import java.io.InterruptedIOException;

6.

7.public class UDPEchoClientTimeout {

8.

9.private static final int TIMEOUT = 3000; // Resend timeout (milliseconds

)

10.private static final int MAXTRIES = 5; // Maximum retransmissions

11.

12.public static void main(String[] args) throws IOException {

13.if ((args.length < 2) || (args.length > 3)) { // Test for correct #

of args

14.throw new IllegalArgumentException("Parameter(s):

> []");

15. }

16. InetAddress serverAddress = InetAddress.getByName(args[0]); // Serve

r address

17.// Convert the argument String to bytes using the default encoding

18.byte[] bytesToSend = args[1].getBytes();

19.int servPort = (args.length == 3) ? Integer.parseInt(args[2]) : 7;

20. DatagramSocket socket = new DatagramSocket();

21. socket.setSoTimeout(TIMEOUT); // Maximum receive blocking time (mill

iseconds)

22. DatagramPacket sendPacket = new DatagramPacket(bytesToSend,bytesToSe

nd.length, serverAddress, servPort); // Sending packet

23. DatagramPacket receivePacket =new DatagramPacket(new byte[bytesToSen

d.length], bytesToSend.length);// Receiving packet

24.int tries = 0; // Packets may be lost, so we have to keep trying

25.boolean receivedResponse = false;

26.do {

27. socket.send(sendPacket); // Send the echo string

28.try {

29. socket.receive(receivePacket); // Attempt echo reply recepti

on

30.if (!receivePacket.getAddress().equals(serverAddress)) {// C

heck source

31.throw new IOException("Received packet from an unknown s

ource");

32. }

33. receivedResponse = true;

34. } catch (InterruptedIOException e) { // We did not get anything

35. tries += 1;

36. System.out.println("Timed out, " + (MAXTRIES - tries)+ " mor

e tries...");

37. }

38. } while ((!receivedResponse) && (tries < MAXTRIES));

39.if (receivedResponse) {

40. System.out.println("Received: "+ new String(receivePacket.getDat

a()));

41. } else {

42. System.out.println("No response -- giving up.");

43. }

44. socket.close();

45. }

46.}

receive()方法将阻塞等待,直到收到一个数据报文或等待超时。超时信息由InterruptedIOException异常指示。一旦超时,发送尝试计数器(tries))加1,并重新发送。若尝试了最大次数后,仍没有接收到数据报文,循环将退出。如果receive()方法成功接收了数据,我们将循环标记receivedResponse设为true,以退出循环。由于数据报文可能发送自任何地址,我们需要验证所接收的数据报文,检查其源地址和端口号是否与所指定的回馈服务器地址和端口号相匹配。

DatagramSocket: 创建

DatagramSocket()

DatagramSocket(int localPort)

DatagramSocket(int localPort, InetAddress localAddr)

以上构造函数将创建一个UDP套接字。可以分别或同时设置本地端口和地址。如果没有指定本地端口,或将其设置为0,该套接字将与任何可用的本地端口绑定。如果没有指定本地地址,数据包(packet)可以接收发送向任何本地地址的数据报文。

DatagramSocket: 连接与关闭

void connect(InetAddress remoteAddr, int remotePort)

void connect(SocketAddress remoteSockAddr)

void disconnect()

void close()

电路实验报告1--叠加原理

电路实验报告1-叠加原理的验证 所属栏目:电路实验- 实验报告示例发布时间:2010-3-11 实验三叠加原理的验证 一、实验目的 验证线性电路叠加原理的正确性,加深对线性电路的叠加性和齐次性的认识和理解。 二、原理说明 叠加原理指出:在有多个独立源共同作用下的线性电路中,通过每一个元件的电流或其两端的电压,可以看成是由每一个独立源单独作用时在该元件上所产生的电流或电压的代数和。 线性电路的齐次性是指当激励信号(某独立源的值)增加或减小K 倍时,电路的响应(即在电路中各电阻元件上所建立的电流和电压值)也将增加或减小K倍。 三、实验设备 高性能电工技术实验装置DGJ-01:直流稳压电压、直流数字电压表、直流数字电流表、叠加原理实验电路板DGJ-03。 四、实验步骤 1.用实验装置上的DGJ-03线路, 按照实验指导书上的图3-1,将两路稳压电源的输出分别调节为12V和6V,接入图中的U1和U2处。 2.通过调节开关K1和K2,分别将电源同时作用和单独作用在电路中,完成如下表格。 表3-1

3.将U2的数值调到12V,重复以上测量,并记录在表3-1的最后一行中。 4.将R3(330 )换成二极管IN4007,继续测量并填入表3-2中。 表3-2 五、实验数据处理和分析 对图3-1的线性电路进行理论分析,利用回路电流法或节点电压法列出电路方程,借助计算机进行方程求解,或直接用EWB软件对电路分析计算,得出的电压、电流的数据与测量值基本相符。验证了测量数据的准确性。电压表和电流表的测量有一定的误差,都在可允许的误差范围内。 验证叠加定理:以I1为例,U1单独作用时,I1a=8.693mA,,U2单独作用时,I1b=-1.198mA,I1a+I1b=7.495mA,U1和U2共同作用时,测量值为7.556mA,因此叠加性得以验证。2U2单独作用时,测量值为-2.395mA,而2*I1b=-2.396mA,因此齐次性得以验证。其他的支路电流和电压也可类似验证叠加定理的准确性。 对于含有二极管的非线性电路,表2中的数据不符合叠加性和齐次性。 六、思考题 1.电源单独作用时,将另外一出开关投向短路侧,不能直接将电压源短接置零。 2.电阻改为二极管后,叠加原理不成立。

《Java范例开发大全》

下面是377个Java的例子。如果你是牛人,看看你能做出多少? 如果有人不相信这些例子都是Java做的,可以看看清华大学的《Java范例开发大全》实例1开发第一个Java程序 实例2自动提升 实例3自动转换 实例4常用基础类型之强制转换 实例5算术运算符 实例6关系运算符 实例7逻辑运算符 实例8位运算符 实例9移位运算符 实例10转型运算符 实例11常量与变量 实例12各种进制的转换 实例13 Java中的进制与移位运算符 实例14判断输入的年份是否为闰年 实例15抽奖活动 实例16xx乘法表 实例17如何列出素数 实例18 Java中的递归 实例19男生女生各多少人

实例20求xx数 实例21求任意一个正数的阶乘 实例22求n的n次方 实例23利用for循环输出几何图形 实例24xx 实例25求1到100之间的和 实例26存上100元需要多少天 实例27输出100之间的所有偶数 实例28如何判断回文数字 实例29输出100之间的所有奇数 实例30求最大的随机数 实例31判断字母分类 实例32优良及差 实例33打印任意一年日历 实例34一年四季的划分 实例35除0发生的算术异常(ArithmeticException) 实例36数组下标越界异常(ArrayIndexOutOfBoundsException)实例37数组元素类型不匹配异常(ArrayStoreException) 实例38强制类型转换异常(ClassCastException) 实例39索引越界异常(IndexOutOfBoundsException) 实例40空指针异常(NullPointerException)

如何用记事本编写一个简单的java代码

如何用记事本编写一个简单的j a v a代码 Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】

一:怎么用记事本写第一个java代码 第一步:新建txt文档 首先我们在F盘新建一个txt文档,并命名为,如下图所示: 第二步:编写代码 我们双击打开:如下图所示 第三步:编写好代码 我们在记事本中写代码,写好后如下所示:

然后我们同时按Ctrl+s键保存,然后关闭记事本即可 上面的源代码如下: public class Test{//这里的Test为类名,这里类名要与我们刚才新建的记事本的名字必须一致,首字母大写 public static void main(String[] args){//java中的主函数的写法 "HelloWorld");//java中的输出语句写法 } } 第三步:打开控制台界面 我们在计算机中,打开如下图界面,

然后在这里,输入cmd,并按回车,然后弹出如图所示

第四步:在控制台中运行并输出 我们用鼠标点击一下里面黑色部分,然后输入F:然后回车,然后再输入javac 然后回车,最后输入java Test,就可以看到结果了,如下图所示:

红色圈出来部分就是结果了 二:温馨提示: 1,上面演算中在控制台中首先输入F:的原因是因为我在F盘建立一个文本文档,并命名为,如果你是把你的文档文档建立在D盘,则应该输入D: 以此类推。 2,如果你是在F盘下的CH文件夹建立一个记事本,并命名为,则输入的情况如下, cd CH表示转到CH这个文件夹下,然后再输入回车,再输入java Test 就可以看到运行结果了

通信工程制图与概预算教案部分TXCAD

第四章通信工程施工图绘制要求 4.1 施工图绘制要求及注意事项 4.1.1绘制通信施工图的要求及注意事项 (1) 线路图中必须有图框; (2) 线路图中必须有指北针; (3) 如需要反应工程量,要在图纸中绘制工程量表。 4.1.2 绘制机房平面图的要求 (1) 机房平面图中内墙的厚度规定为240 mm; (2) 机房平面图中必须有出入口,例如:门; (3) 必须按图纸要求尺寸将设备画进图中; (4) 图纸中如有馈孔,勿忘将馈孔加进去; (5) 图中主设备加尺寸标注(必须有主设备尺寸以及主设备到墙的尺寸); (6) 平面图中必须标有“XX层机房”字样; (7) 平面图中必须有指北针、图例、说明; (8) 机房平面图中必须加设备配置表; (9) 根据图纸、配置表将编号加进设备中; (10) 要在图纸外插入标准图衔,并根据要求在图衔中加注单位比例、设计阶段、日期、图名、图号等。 注:建筑平面图、平面布置图以及走线架图必须在单位比例中加入单位mm。 4.1.3 出设计时图纸中的常见问题 通信建设工程设计中一般包括以下几大部分:设计说明、概预算说明及表格、附表、图纸。当完成一项工程设计时,在绘制工程图方面,根据以往的经验,常会出现以下问题: (1) 图纸说明中序号会排列错误;

(2) 图纸说明中缺标点符号; (3) 图纸中出现尺寸标注字体不一或标注太小; (4) 图纸中缺少指北针; (5) 平面图或设备走线图在图衔中缺少单位mm; (6) 图衔中图号与整个工程编号不一致; (7) 出设计时前后图纸编号顺序有问题; (8) 出设计时图衔中图名与目录不一致; (9) 出设计时图纸中内容颜色有深浅之分。 4.2 施工图设计阶段图纸内容及应达到的深度 4.2.1 有线通信线路工程 1、有线通信线路工程施工图设计阶段图纸内容及应达到的深度如下。 (1) 批准初步设计线路路由总图。 (2) 长途通信线路敷设定位方案的说明,并附在比例为1/2000的测绘地形图上绘制线路位置图,标明施工要求,如埋深、保护段落及措施、必须注意的施工安全地段及措施等;地下无人站内设备安装及地面建筑的安装建筑施工图;光缆进城区的路由示意图和施工图以及进线室平面图、相关机房平面图。 (3) 线路穿越各种障碍点的施工要求及具体措施。每个较复杂的障碍点应单独绘制施工图。 (4) 水线敷设、岸滩工程、水线房等施工图及施工方法说明。水线敷设位置及埋深应有河床断面测量资料为根据。 (5) 通信管道、人孔、手孔、光(电)缆引上管等的具体定位位置及建筑形式,孔内有关设备的安装施工图及施工要求;管道、人孔、手孔结构及建筑施工采用定型图纸,非定型设计应附结构及建筑施工图;对于有其他地

如何写一个正确的JAVA程序

若在定义中出现了常数初始化字符,则大写基本类型标识符中地所有字母.这样便可标志出它们属于编译期地常数.个人收集整理勿做商业用途 包()属于一种特殊情况:它们全都是小写字母,即便中间地单词亦是如此.对于域名扩展名称,如,,或者等,全部都应小写(这也是和地区别之一).个人收集整理勿做商业用途() 为了常规用途而创建一个类时,请采取“经典形式”,并包含对下述元素地定义:() () () ()( ) () 对于自己创建地每一个类,都考虑置入一个(),其中包含了用于测试那个类地代码.为使用一个项目中地类,我们没必要删除测试代码.若进行了任何形式地改动,可方便地返回测试.这些代码也可作为如何使用类地一个示例使用.个人收集整理勿做商业用途() 应将方法设计成简要地、功能性单元,用它描述和实现一个不连续地类接口部分.理想情况下,方法应简明扼要.若长度很大,可考虑通过某种方式将其分割成较短地几个方法.这样做也便于类内代码地重复使用(有些时候,方法必须非常大,但它们仍应只做同样地一件事情). () 设计一个类时,请设身处地为客户程序员考虑一下(类地使用方法应该是非常明确地).然后,再设身处地为管理代码地人考虑一下(预计有可能进行哪些形式地修改,想想用什么方法可把它们变得更简单).个人收集整理勿做商业用途 () 使类尽可能短小精悍,而且只解决一个特定地问题.下面是对类设计地一些建议:■一个复杂地开关语句:考虑采用“多形”机制 ■数量众多地方法涉及到类型差别极大地操作:考虑用几个类来分别实现 ■许多成员变量在特征上有很大地差别:考虑使用几个类. () 让一切东西都尽可能地“私有”——.可使库地某一部分“公共化”(一个方法、类或者一个字段等等),就永远不能把它拿出.若强行拿出,就可能破坏其他人现有地代码,使他们不得不重新编写和设计.若只公布自己必须公布地,就可放心大胆地改变其他任何东西.在多线程环境中,隐私是特别重要地一个因素——只有字段才能在非同步使用地情况下受到保护.个人收集整理勿做商业用途 () 谨惕“巨大对象综合症”.对一些习惯于顺序编程思维、且初涉领域地新手,往往喜欢先写一个顺序执行地程序,再把它嵌入一个或两个巨大地对象里.根据编程原理,对象表达地应该是应用程序地概念,而非应用程序本身.个人收集整理勿做商业用途() 若不得已进行一些不太雅观地编程,至少应该把那些代码置于一个类地内部. () 任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作(参见第章小节地“用内部类改进代码”).个人收集整理勿做商业用途() 尽可能细致地加上注释,并用注释文档语法生成自己地程序文档. () 避免使用“魔术数字”,这些数字很难与代码很好地配合.如以后需要修改它,无疑会成为一场噩梦,因为根本不知道“”到底是指“数组大小”还是“其他全然不同地东西”.所以,我们应创建一个常数,并为其使用具有说服力地描述性名称,并在整个程序中都采用常数标识符.这样可使程序更易理解以及更易维护.个人收集整理勿做商业用途 () 涉及构建器和异常地时候,通常希望重新丢弃在构建器中捕获地任何异常——如果它造成了那个对象地创建失败.这样一来,调用者就不会以为那个对象已正确地创建,从而盲目地继续.个人收集整理勿做商业用途

《通信工程制图》课程标准

《绘图与CAD》课程标准 一、课程概况 (一)制定依据 本标准依据《通信网络与设备专业人才培养方案》中对《通信工程制图》课程培养目标的要求制定。 (二)课程的性质和作用 课程的性质:《通信工程制图》课程是通信网络与设备专业必修的专业优质课程,是校企合作开发的基于工作过程系统化的学习领域课程。 课程的作用:《通信工程制图》课程使工程施工技术人员通过阅读图纸就能够了解工程规模、工程内容,统计出工程量及编制工程概预算。只有绘制出准确的通信工程图纸,才能对通信工程施工具有正确的指导性意义。因此,通信工程技术人员必须要掌握通信制图的方法。通过本课程的学习使学生对通信工程制图与设计有一个比较全面清晰的认识具体要体现:课程要符合高技能人才培养目标和专业相关技术领域职业岗位(群)的任职要求;本课程对学生职业能力培养和职业素养养成要起主要支撑或明显的促进作用,要反映本课程与前、后续课程的衔接关系。 本门课程的先修课程包括:《计算机应用基础》、《数模电子技术》、后续课程有:《移动通信设备安装及配置》。通过学习,学生应达绘制工程制图的要求。 2、课程标准设计思路 《通信工程制图》根据“实验化教学、工学相结合”原则,要求根据订单班学生数周的顶岗学习,有针对性的完成与通信工程制图有关的移动通信技术知识,了解实际应用软件中的关键知识在课程中的定位,达到学生学以致用的基本要求。强调以“以本专业够用”为度,同时要扩宽学生的相关知识面,适当增加移动通信领域中新技术的介绍与讲解。 以职业能力和职业素质培养为主线组织教学内容;加强实践教学环节,增加实训学时,少讲多练,以提高学生的绘图及识图能力。 《通信工程制图》课程是体现以学生为主体的、以行动为导向,基于工作过程系统化的学习领域课程,在学习过程中,学生首先要获得的是关于职业内容和工作环境的感性认识,进而获得与职业相关的专业知识和技能。强调以学生直接参与项目任务的形式——行动导向,来掌握融合于实践行动中的新知识、新技能,而不是以往那种理论加上机的教学模式,真正落实教、学、做一体化课程的实施,切实提高人才培养质量。

看完这30个技巧让你写好Java代码

看完这30个技巧让你写好Java代码 2019.8整理 成为一个优秀的Java程序员,有着良好的代码编写习惯是必不可少的。下面就让我们来看看代码编写的30条建议吧。 (1) 类名首字母应该大写。字段、方法以及对象(句柄)的首字母应小写。对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。例如: 若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。 Java包(Package)属于一种特殊情况:它们全都是小写字母,即便中间的单词亦是如此。对于域名扩展名称,如com,org,net或者edu等,全部都应小写(这也是Java 1.1和Java 1.2的区别之一)。 (2) 为了常规用途而创建一个类时,请采取”经典形式”,并包含对下述元素的定义:

(3) 对于自己创建的每一个类,都考虑置入一个main(),其中包含了用于测试那个类的代码。为使用一个项目中的类,我们没必要删除测试代码。若进行了任何形式的改动,可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。 (4) 应将方法设计成简要的、功能性单元,用它描述和实现一个不连续的类接口部分。理想情况下,方法应简明扼要。若长度很大,可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用(有些时候,方法必须非常大,但它们仍应只做同样的一件事情)。 (5) 设计一个类时,请设身处地为客户程序员考虑一下(类的使用方法应该是非常明确的)。然后,再设身处地为管理代码的人考虑一下(预计有可能进行哪些形式的修改,想想用什么方法可把它们变得更简单)。 (6) 使类尽可能短小精悍,而且只解决一个特定的问题。下面是对类设计的一些建议: ?一个复杂的开关语句:考虑采用”多形”机制 ?数量众多的方法涉及到类型差别极大的操作:考虑用几个类来分别实现 ?许多成员变量在特征上有很大的差别:考虑使用几个类 (7) 让一切东西都尽可能地”私有”–private。可使库的某一部分”公共化”(一个方法、类或者一个字段等等),就永远不能把它拿出。若强行拿出,就可能破坏其他人现有的代码,使他们不得不重新编写和设计。若只公布自己必须公布的,就可放心大胆地改变其他任何东西。在多线程环境中,隐私是特别重要的一个因素–只有private字段才能在非同步使用的情况下受到保护。 (8) 谨惕”巨大对象综合症”。对一些习惯于顺序编程思维、且初涉OOP领域的新手,往往喜欢先写一个顺序执行的程序,再把它嵌入一个或两个巨大的对象里。根据编程原理,对象表达的应该是应用程序的概念,而非应用程序本身。 (9) 若不得已进行一些不太雅观的编程,至少应该把那些代码置于一个类的内部。 (10) 任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作(参见第14章14.1.2小节的”用内部类改进代码”)。 (11) 尽可能细致地加上注释,并用javadoc注释文档语法生成自己的程序文档。

叠加方式的组合体图形的绘制

一、叠加方式的组合体图形的绘制 以下图支架为例说明以叠加为主要形成方式的组合体的画图步骤。 1.形体分析 ⑴分析所画组合体是由哪些基本几何体组成的? ⑵分析各基本几何体的相对位置和相邻表面的关系,如是否平齐?相 交?相切? 2.视图选择 (1)首先将组合体摆平放正,尽量使组合体的对称面、主要轴线或大的端面与投影面平行或垂直。 (2)选择主视图,将最能反映所画组合体形体特征的投影方向作为主视图的投影方向。(3)兼顾其它视图,尽量使俯、左视图中的虚线最少。 3.布置图面 (1)根据所画组合体的实际尺寸,选取适当的比例和图幅大小。 (2)画作图基线,以确定组合体三视图的位置。一般用作图基线表示组合体的主要端面、对称面或中心线、主要轴线等的投影位置。 (3)三视图之间应距离恰当,留有足够的标注尺寸的空间。整张图面力求匀称、协调。4.画底稿(用H或2H型铅笔画底稿) (1)根据形体分析,先画主要形体(大形体),后画次要形体(小形体)。 (2)各形体均应先画其基本轮廓,后完成局部细节。 (3)每一局部均应先画反映其形体特征的那个投影,后完成其它两投影。 (4)三个视图一起画。 5.检查、清理和加深图面(用B或2B型铅笔加深粗实线,用HB 或H型铅笔加深细实线、细点画线、标注尺寸、写字等) (1)检查底稿,认真校核。查看各视图是否符合投影规律?表面相交、相切关系是否表达正确等? (2)清理图面,擦去不需要的作图线,拾遗补缺。 (3)加深图线。其加深步骤为:先曲后直、先上后下、先左后右、最后加深斜线。同类线型应一起加 6.最后完成的支架三视图见下图 (1)支架分析:

(2)布置图面: (3)画底稿

《Java程序设计》题目样例

【题目样例】 一、单选题 1.下面哪个特性不是Java具有的(D )。 A、“纯”面向对象 B、安全性高 C、可移植性好 D、运行速度快 2.下面哪个类型是Java中不支持的(C )。 A、布尔类型 B、字符串 C、指针 D、数组 3.下面哪个不属于Java语言的关键字(B )。 A、native B、const C、final D、finally 4.下面关于数组的使用,不正确的是(C )。 A、int a[] = {1, 2, 3}; B、int a[][] = {{ 1, 2 }, { 3, 4} }; C、int a = new int[6] for (int i=0; i<6; i++) a[i] = i * i; D、int a[][] =new int[2][ ]; int a[1] = new int [4]; int a[2] = new int[5]; 5.应用程序的main方法中有以下语句,则输出的结果是(A )。 String obj = new String("abcxyz"); for(int i = obj.length() - 1; I > 0; i--) System.out.print(obj.charAt(i)); A、zyxcba B、xyz C、zyxcb D、abcxyz 6.下面函数,哪一组不属于方法重载(A )。 A、int fun(int a, int b, float c) { … } float fun(int b, int a, float c) { … } B、int fun(int a, int b) { … } int fun(int a, int a, float c) { … } C、int fun(int a) { … } int fun(int a, int b) { … } D、int fun(int a, float b) { … } int fun(float b, int a) { … } 7.若创建RandomAccessFile类对象raf2: RandomAccessFile raf2 = new RandomAccessFile("1.txt", "rw"),该语句的功能是(B )。 A、打开当前目录下的文件1.txt,但只能向文件写入数据,不能从文件读取数据。 B、打开当前目录下的文件1.txt,既可以向文件写入数据,也可以从文件读取数据。 C、打开当前目录下的文件1.txt,但不能向文件写入数据,只能从文件读取数据。 D、以上说法都不对。 8.应用程序main方法中有以下语句,则输出的结果是(A )。 String s = "java@123456@"; int n = s.indexOf("@"); int k = s.indexOf("@", 5); String s2 = s.substring(n + 1, k);

Photoshop实例简单步骤

Lesson1 ●选择:选区可为圆,方,一行,一列,选择模式可以+、-、交叉,选区 可以移动,在单一选区情况下,鼠标放在选区中就可以移动(可以看到鼠标变形)。 ●填充:油漆桶和渐变工具,对选区上前景色(最好新建一层来做)。 ●层:图象由许多层组成,每层上面可以有不同的元素,这样便于对一幅 图象中的各个元素分别操作。 ●移动:移动一层中图象的位置。 Eg1 球,阴影,倒影. 1、新建一画布(400*400象素), 注意选择”RGB模式”(绘制的图中可以出现彩 色,如果是”灰度模式”则图中只有黑白色),用渐变色填充(上蓝下黑,线 形填充)形成背景 2、新建一个图层,选出一正圆区域(按住shift),用径向填充(白灰)画一球。 3、选取图层中刚才画出的小球(按住ctrl鼠标点图层),新建一图层后在刚才的 选区中用黑色填充(前景色变黑,用油漆桶填充). 4、在图层中用自由变换功能拖动图案,使其出现倒影效果,在选取的情况下降低 透明度. Eg2 圆环,羽化,亮度调整 1、新建一画布(400*400象素),注意选择”灰度模式”(绘制的图中只有黑白 色,如果是”RGB模式”则图中可以出现彩色),使用白色背景。 2、新建一图层,选出一正圆形选区用灰色填充 3、在在同一图层上选取一圆,比刚才圆小,放在大圆正中,删去小圆中选种部 分,显示出一环型. 4、选中该环型图层中的圆环,使用选择菜单中的羽化命令,目的是接下来的颜 色过度平滑. 5、向斜上方移动选取,露出部分圆环边缘,后进行反选,对反选区域执行图象 菜单--调整命令里面的亮度和对比度调整,把亮度调暗. 6、选中该环型图层中的圆环,再次使用选择菜单中的羽化命令

JAVA编程实例大全及详解答案(50例)

JA V A编程实例大全及详解答案(50例) 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 public class lianxi01 { public static void main(String[] args) { System.out.println("第1个月的兔子对数: 1"); System.out.println("第2个月的兔子对数: 1"); int f1 = 1, f2 = 1, f, M=24; for(int i=3; i<=M; i++) { f = f2; f2 = f1 + f2; f1 = f; System.out.println("第" + i +"个月的兔子对数: "+f2); } } } 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 public class lianxi02 { public static void main(String[] args) { int count = 0; for(int i=101; i<200; i+=2) { boolean b = false; for(int j=2; j<=Math.sqrt(i); j++) { if(i % j == 0) { b = false; break; } else { b = true; } } if(b == true) {count ++;System.out.println(i );} } System.out.println( "素数个数是: " + count);

通信工程CAD制图流程

通信工程CAD制图流程 1.1 工程设计图纸基本幅面尺寸图纸基本幅面尺寸表序号幅面代号 B X L a c 1 A0 841X1189 2 A1 594X841 3 A2 420X594 10 4 A3 297X420 5 A4 210X297 25 5 1.2 工程图纸幅面和图框大小应符合国家标准GB 6988.2《电气制图一般规则》的规定,一般应采用A0、A1、A2、A3、A4 及其加长的图纸幅面。 当上述幅面不能满足要求时,可按照 GB 4457.1《机械制图图纸幅面及格式》的规定加大幅面。也可在不影响整体视图效果的情况分割成若干张图绘制。 对于 A0、A2、A4 幅面的加长应按 A0 幅面长边的八分之一的倍数增加;A1、A3 幅面的加长应按A0 短边的四分之一的倍数增加。 1.3 根据表述对象的规模大小、复杂程度、所要表达的详细程度、有无图衔及注释的数量来选择较小的合适幅面。 2.1 线形分类及用途应符合表3.2.1 的规定: 图线名称图线型式一般用途实线基本线条:图纸主要内容用线,可见轮廓线虚线辅助线条:屏蔽线,机械连接线、不可见轮廓线、计划扩展内容用线点划线图框线:表示分界线、结构图框线、功能图框线、分级图框线双点划线辅助图框线:表示更多的功能组合或从某种图框中区分不属于它的功能部件折断线建筑断开线。 波浪线断列处的边界线注:移动通信的图形符号暂未贴如上表

中,详见附件 1: 2.2 图线宽度一般从一下系列中选用: 0.25mm,0.3mm,0.35mm,0.5mm,0.6mm,0.7mm,1.0mm,1.2mm, 1.4mm。 2.3 通常只选用两种宽度的图线,粗线的宽度为细线宽度的两倍,主要图线粗些,次要图线细些。。 对复杂的图纸也可采用粗、中、细三种线宽,线的宽度按 2 的倍数递增。但线宽种类不宜过多。 2.4 图线宽度的选用应使图形比列和线宽协调恰当,重点突出,主次分明,在同一张图纸上,按不同比例绘制的图样及同类图形的图线粗细应保持一致。 2.5 细实线为最常用的线条。在以细实线为主的图纸上,粗实线主要用于主线路、图纸的图框及需要突出的线路等处。 指引线、尺寸标注线应使用细实线。 2.6 当需要区分新安装的设备时,则粗线表示新建,细线表示原有设施,虚线表示预留部分。 2.7 平行线之间的最小间距不宜小于粗线宽度的两倍,同时最小不能小于0.7mm 。 3.1 对于建筑平面图、平面布置图、管道及光电缆线路图、设备加固图及零部件加工图等图纸一般按比例绘制;方案示意图、系统图、原理图等可不按比例绘制,但应按工作顺序、线路走向、信息流向排列。

java简单图形用户界面代码

package dsr; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import https://www.doczj.com/doc/391444706.html,.Socket; public class Login extends JFrame implements ActionListener{ //定义组件 JPanel northPanel,southPanel,centerPanel,centerPanel1,centerPanel11,centerPanel12; JButton loginBtn,registerBtn,cancalBtn; JLabel userLbl,passwordLbl,titleLbl; JTextField userTxt; JPasswordField passwordPwd; static String name; public Login () { super("用户登录"); northPanel=new JPanel(); southPanel=new JPanel(); centerPanel1=new JPanel(); centerPanel11=new JPanel(); centerPanel12=new JPanel(); //标题 titleLbl=new JLabel("欢迎进入考试系统"); titleLbl.setFont(new Font("隶书",Font.BOLD,24)); northPanel.add(titleLbl); this.add(northPanel,BorderLayout.NORTH); //中间部分 centerPanel1.setLayout(new BorderLayout()); userLbl=new JLabel("用户名"); userTxt=new JTextField(12); centerPanel11.add(userLbl); centerPanel11.add(userTxt); centerPanel1.add(centerPanel11,BorderLayout.NORTH); passwordLbl=new JLabel("密码"); passwordPwd=new JPasswordField(12); centerPanel12.add(passwordLbl); centerPanel12.add(passwordPwd);

Photoshop经典实例教程3000例《免费版》

Photoshop经典实例教程3000例 1、教你打造偏色艺术色调教程 2、 ·教你打造偏色艺术色调教程 3、 Photoshop┾製造制造另类婚纱照片 4、⒈款粉帥氣de游戲做圖 5、 PS(IR)可爱的棒棒糖 6、 ps打造唯美色调 7、 PS打造超炫人物效果 8、一款比较自然的眨眼教程 9、 Photoshop最简易的磨皮法 10、Photoshop] 制作下雨的效果 11、小菱形背景和圆点背景的做法 12、[Photoshop] PS打造淡彩风格的幻眼效果 13、Photoshop] 用Photoshop滤镜打造梦幻艺术效果 14、Photoshop] 巧用PS打造镶满诱人钻石的文字 15、Photoshop] PS制作幽冥火焰 16、Photoshop] 简单的叠影制作方法 17、Photoshop] 制作冬季恋歌浪漫雪景效果 18、Photoshop] 用Photoshop设计另类树皮人体 19、Photoshop] 教你设计绚丽光芒效果 20、Photoshop] 教你设计胶片风情电影海报 21、Photoshop] 教你设计神秘炫光黑洞效果 22、Photoshop] PS特效字:闪亮钻石效果 23、[Photoshop] 巧绘晶莹剔透的水晶樱桃 24、Fireworks] QQ空间初级玩家必学的11条技巧 25、Flash] 给FLASH初学者的10点制作经验 26、Flash] Flash全屏效果全攻略 27、Photoshop] 利用PS图层样式绘制彩色玻璃立体文字 28、Photoshop] Photoshop制作逼真的洁白羽毛 29、Photoshop] 用PS把秋景照片变为冬景效果 30、[Photoshop] Photoshop教你给MM的衣服换个颜色 31、Photoshop] 用PS制作周迅的怀旧效果图 32、Photoshop] 转用PS轻松给MM衣服添加图案 33、Photoshop] 用PS的动态画笔制作鞭炮 34、Photoshop] 教你做天使翅膀的卡通效果 35、Photoshop] 制作融化的冰淇淋 36、Photoshop] 打造宇宙场景爆炸星球特效 37、Photoshop] 教你设计恐怖电影海报 Photoshop] 制作奔驰中的汽车 [Photoshop] 蝴蝶结边框 [Photoshop] Photoshop高级柔化处理人物照片Photoshop] 神奇的Photoshop修图美容--很实用

通信工程制图规范概要

第二章通信工程制图规范 第一节概述 通信工程图纸是通过图形符号、文字符号、文字说明及标注表达的。为了读懂图纸就必须了解和掌握图纸中各种图形符号、文字符号等所代表的含义。 专业人员通过图纸了解工程规模、工程内容、统计出工程量、编制出工程概、预算。阅读图纸、统计工程量的过程就称为识图。 为了使通信工程的图纸做到规格统一、画法一致、图面清晰,符合施工、存档和生产维护的要求,又利于提高设计效率、保证设计质量和适应通信工程建设的需要,要求依据以下国家级行业标准编制通信工程制图与图形符号标准: GB/T4728.1~13 《电气通用图形符号》 GB/T6988.1~7 《电气制图》 GB/T50104—2001 《建筑制图标准》 GB/T7929—1995 《1:500 1:1000 1:2000地形图图式》 GB 7159—1987 《电气技术中的文字符号制订通则》 GB 7356—1987 《电气系统说明书用简图的编制》 YD/T5015—2007 《电气工程制图与图形符号》 第二节通信工程制图的总体要求 通信工程制图的总体要求如下: (1)工程制图应根据表述对象的性质,论述的目的与内容,选取适宜的图纸及表达手段,以便完整地表述主题内容。 (2)图面应布局合理,排列均匀,轮廓清晰和便于识别。 (3)应选用合适的图线宽度,避免图中的线条过粗、过细。 (4)正确使用国标和行标规定的图形符号。派生新的符号时,应符合国标符号的派生规律,并应在合适的地方加以说明。 (5)在保证图面布局紧凑和使用方便的前提下,应选择合适的图纸幅面,使原图大小适中。 (6)应准确地按规定标注各种必要的技术数据和注释,并按规定进行书写或打印。 (7)工程图纸应按规定设置图衔,并按规定的责任范围签字。各种图纸应按规定顺序编号。 (8)总平面图、机房平面图、移动通信基站天线位置及馈线走向图应设置指北针。 (9)对于线路工程,设计图纸应按照从左往右的顺序制图,并设指北针;线路图纸分段按“起点至终点,分歧点至终点”原则划分。 第三节通信工程制图的统一规定

Java九大示例程序

JAVA面向对象九个经典例子程序 1 Hello world例子 (1) 2 类的基本组成示例 (1) 3静态与非静态变量及方法的使用 (3) 4 类继承的例子 (3) 5类的访问修饰符 (4) 6抽象类及其实现示例 (5) 7接口及其实现 (6) 8 抽象类与接口混合编程例子 (7) 9 接口回调与多态性 (8) 1 Hello world例子 package Example; //定义自己的包名 public class Example1 //定义一个类 { public static void main(String[] args) //系统可以执行的main方法,这里是一个公有静态无返回值的方法 { System.out.println("Hello world!"); //调用https://www.doczj.com/doc/391444706.html,ng包中的System类的PrintLine方法输出Hello world! } } 2 类的基本组成示例 package Example; class Person { public int age; //声明公共字段age private String name; //声明私有字段name,此时name为类的属性,下面通过公有方法进行访问 public String getName() { return name;

} public void setName(String name) { https://www.doczj.com/doc/391444706.html, = name; } public void eat() //定义无参数的eat方法 { System.out.println("Person can eat"); } public void eat(String s) //定义带参数的eat方法,实现方法重载 { System.out.println("Person can eat"+s); } public Person() //定义无参构造函数,注意无返回值定义,方法与类同名 { } public Person(int age, String name) //重写一个带参数构造函数,注意无返回值定义,方法与类同名 { this.age = age; //前一个age为对象的字段,由this指定,后一个age为函数形参 https://www.doczj.com/doc/391444706.html, = name; //前一个name为对象的属性,由this指定,因为在本类中可直接访问,后一个name为函数形参 } } public class Example2 { public static void main(String[] args) { Person person1 = new Person(); //调用类的无参构造函数 person1.age = 20; //给对象的公有字段直接赋值 person1.setName("zhangsan"); //必须使用公共方法才能给对象的属性赋值 System.out.println("第一个人信息,姓名:"+person1.getName()+"年 龄:"+person1.age); person1.eat(); //调用对象的无参方法 Person person2 = new Person(18, "lisi");//调用类的有参构造函数 System.out.println("第二个人信息,姓名:"+ person2.getName() + "年龄:"+ person2.age); person2.eat(" 馒头"); //调用对象的有参方法 } }

简单叠加示例

组织结构图 最初的JQuery组织结构图插件。 这是一个小的JQuery插件,它从一个嵌套的无序列表生成一个分层的orginisational图表。 由于使用嵌套表来实现布局,html/css纯化器可能不会对这一点感到满意。 不过,它工作得很好,你可以很容易地找到漂亮的交互式组织结构图。 这已经在 Firefox 和 Chrome 上测试过了,在 Windows 上有 Firefox 和Chrome 。它也适用于 tmodel,但是由于缺少的CSS支持,这个错误的浏览器显示图表非常基本。 有关更多信息,请参见jquery-orgchart-plugin。 有一些现场演示工具。 还有一些老的现场演示工具。 此外,还有一个高级实时演示插件,展示集成和一种导航交互式图表的方法。 一些新教程可用。 新建:2015/02/20 添加一个"附加"节点 inside 你的列表项,一个附件可以以用于表示图表中的"助手。"关系。使用adjunct很简单,只需向列表项添加一个" <附加>"元素即可。 adjunct元素可以包含 HTML 。 如果你已经创建了一些公开或者有趣的图表,请发送链接或者屏幕快照至: mark [dot] [at] capricasoftware [dot] [dot] 英国 特性 ?HTML标记,包括点击超链接,inside 图表节点; ?源列表中的所有属性都将烘焙到相应的图表节点( 比如。你可以使用自己的"数据"属性对节点进行注释 ?可以选择将"附加"节点添加到每个图表节点( 比如。对于"助手"类型关系) ; ?选项将图表限制到所需级别的数目,并在单个堆栈中显示剩余级别; ?从源列表( 默认情况下全部启用) 中复制CSS样式。类。HTML数据属性和标题属性( 对于工具提示或者外部工具提示插件有用)的选项; ?可选回调处理点击的图表节点;

java程序设计试卷样例

东华大学2008~ 2009学年第一学期期末试题 踏实学习,弘扬正气;诚信做人,诚实考试;作弊可耻,后果自负。课程名称JA V A程序设计使用专业计算机大类07 班级_________________ 姓名________________ 学号_______________ 一二三四五六七八总分 试题 得分 一、选择题(每题2分,共20分) 1、Java编译器和解释器所在的目录是 (A ) A、JDK 的bin 目录 B、JDK 的demo 目录 C、JDK 的lib 目录 D、JDK 的jre 目录 2、A类定义如下,设a是A类的一个实例,下列语句调用中错误的是 ( C ) class A { int i; static String s; void method1() { } static void method2() { } } A、System.out.println(a.i); B、a.method1(); C、A.method1(); D、A.method2(); 3、关于方法main()的说法哪个正确?(A ) A、main()方法只能放在公共类中 B、main()的头定义可以根据情况任意更改 C、一个编译单元中允许一个以上的类具有main()方法 D、所有对象的创建都必须放在main()方法中 4、关于对象成员占用内存的说法哪个正确?(B) A、同一个类的对象共用同一段内存 B、同一个类的对象使用不同的内存段,但静态成员共享相同的内存空间 1

C、对象的方法不占用内存 D、以上都不对 5、关于下列程序,正确的是(C)A public class IfTest { public static void main(String[]args) { String x = "Hello "; String y = x; if (x != y) System.out.println("Not equal"); else System.out.println("Equal"); } . } A、输出是“Equal” B、输出是“Not Equal” C、不允许用==测试两个String对象是否相等 D、以上都不对 6、下列程序的执行结果是( B { public void run() { int a=0; do{ System.out.print(a+" "); a++; }while(a<3); } } public class ex14{ public static void main(String[ ]args) { T1 t=new T1( ); t.start( ); } } A、1 2 3 B、0 1 2 C、0 0 0 D、1 1 1 2

相关主题
文本预览
相关文档 最新文档