`
seara
  • 浏览: 648539 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java网络编程从入门到精通(25):创建ServerSocket对象

阅读更多
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 11"> <meta name="Originator" content="Microsoft Word 11"> <link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> <!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if !mso]> <style> st1":*{behavior:url(#ieooui) } </style> <![endif]--><style> <!-- /* Font Definitions */ &#64;font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} &#64;font-face {font-family:""&#64;宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ &#64;page {} &#64;page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} </style> <![endif]-->

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Java网络编程从入门到精通(24):实现HTTP断点续传下载工具(附源代码)

ServerSocket类的构造方法有四种重载形式,它们的定义如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicServerSocket()throwsIOException
publicServerSocket(intport)throwsIOException
publicServerSocket(intport,intbacklog)throwsIOException
publicServerSocket(intport,intbacklog,InetAddressbindAddr)throwsIOException

在上面的构造方法中涉及到了三个参数:portbacklogbindAddr。其中portServerSocket对象要绑定的端口,backlog是请求队列的长度,bindAddrServerSocket对象要绑定的IP地址。

一、通过构造方法绑定端口

通过构造方法绑定端口是创建ServerSocket对象最常用的方式。可以通过如下的构造方法来绑定端口:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicServerSocket(intport)throwsIOException

如果port参数所指定的端口已经被绑定,构造方法就会抛出IOException异常。但实际上抛出的异常是BindException。从图4.2异常类继承关系图可以看出,所有和网络有关的异常都是IOException类的子类。因此,为了ServerSocket构造方法还可以抛出其他的异常,就使用了IOException

如果port的值为0,系统就会随机选取一个端口号。但随机选取的端口意义不大,因为客户端在连接服务器时需要明确知道服务端程序的端口号。可以通过ServerSockettoString方法输出和ServerSocket对象相关的信息。下面的代码输入了和ServerSocket对象相关的信息。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->ServerSocketserverSocket=newServerSocket(1320);
System.out.println(serverSocket);

运行结果:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=1320]

上面的输出结果中的addr是服务端绑定的IP地址,如果未绑定IP地址,这个值是0.0.0.0,在这种情况下,ServerSocket对象将监听服务端所有网络接口的所有IP地址。port永远是0localportServerSocket绑定的端口,如果port值为0(不是输出结果的port,是ServerSocket构造方法的参数port),localport是一个随机选取的端口号。

在操作系统中规定1 ~ 1023为系统使用的端口号。端口号的最小值是1,最大值是65535。在Windows中用户编写的程序可以绑定端口号小于1024的端口,但在Linux/Unix下必须使用root登录才可以绑定小于1024的端口。在前面的文章中曾使用Socket类来判断本机打开了哪些端口,其实使用ServerSocket类也可以达到同样的目的。基本原理是用ServerSocket来绑定本机的端口,如果绑定某个端口时抛出BindException异常,就说明这个端口已经打开,反之则这个端口未打开。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package server;

importjava.net.*;

publicclassScanPort
{
publicstaticvoidmain(String[]args)
{
if(args.length==0)
return;
intminPort=0,maxPort=0;
Stringports[]
=args[0].split("[-]");
minPort
=Integer.parseInt(ports[0]);
maxPort
=(ports.length>1)?Integer.parseInt(ports[1]):minPort;
for(intport=minPort;port<=maxPort;port++)
try
{
ServerSocketserverSocket
=newServerSocket(port);
serverSocket.close();
}
catch(Exceptione)
{
System.err.println(e.getClass());
System.err.println(
"端口"+port+"已经打开!");
}
}
}

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 11"><meta name="Originator" content="Microsoft Word 11"><link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"><!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><style> <!-- /* Font Definitions */ &#64;font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0;} &#64;font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} &#64;font-face {font-family:""&#64;宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ &#64;page {} &#64;page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} /* List Definitions */ &#64;list l0 {} &#64;list l0:level1 { margin-left:21.0pt; text-indent:-21.0pt; font-family:Wingdings;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} --> </style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman";} </style> <![endif]-->

在上面的代码中输出了创建ServerSocket对象时抛出的异常类的信息。ScanPort通过命令行参数将待扫描的端口号范围传入程序,参数格式为:minPort-maxPort,如果只输入一个端口号,ScanPort程序只扫描这个端口号。

测试

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->javaserver.ScanPort1-1023
运行结果
<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->classjava.net.BindException
端口80已经打开!
classjava.net.BindException
端口135已经打开!
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="ProgId" content="Word.Document"> <meta name="Generator" content="Microsoft Word 11"> <meta name="Originator" content="Microsoft Word 11"> <link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> <!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if !mso]> <style> st1":*{behavior:url(#ieooui) } </style> <![endif]--><style> <!-- /* Font Definitions */ &#64;font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0;} &#64;font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} &#64;font-face {font-family:""&#64;宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ &#64;page {} &#64;page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} /* List Definitions */ &#64;list l0 {} &#64;list l0:level1 { margin-left:21.0pt; text-indent:-21.0pt; font-family:Wingdings;} &#64;list l0:level2 { margin-left:39.75pt; text-indent:-18.75pt;} &#64;list l1 {} &#64;list l1:level1 { margin-left:21.0pt; text-indent:-21.0pt; font-family:Wingdings;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman";} </style> <![endif]-->

二、设置请求队列的长度

在编写服务端程序时,一般会通过多线程来同时处理多个客户端请求。也就是说,使用一个线程来接收客户端请求,当接到一个请求后(得到一个Socket对象),会创建一个新线程,将这个客户端请求交给这个新线程处理。而那个接收客户端请求的线程则继续接收客户端请求,这个过程的实现代码如下:


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->ServerSocketserverSocket=newServerSocket(1234);//绑定端口
//处理其他任务的代码
while(true)
{
Socketsocket=serverSocket.accept();//等待接收客户端请求
//处理其他任务的代码
newThreadClass(socket).start();//创建并运行处理客户端请求的线程
}

上面代码中ThreadClass类是Thread类的子类,这个类的构造方法有一个Socket类型的参数,可以通过构造方法将Socket对象传入ThreadClass对象,并在ThreadClass对象的run方法中处理客户端请求。这段代码从表面上看好象是天衣无缝,无论有多少客户端请求,只要服务器的配置足够高,就都可以处理。但仔细思考上面的代码,我们可能会发现一些问题。如果在第2行和第6行有足够复杂的代码,执行时间也比较长,这就意味着服务端程序无法及时响应客户端的请求。

假设第2行和第6行的代码是Thread.sleep(3000),这将使程序延迟3秒。那么在这3秒内,程序不会执行accept方法,因此,这段程序只是将端口绑定到了1234上,并未开始接收客户端请求。如果在这时一个客户端向端口1234发来了一个请求,从理论上讲,客户端应该出现拒绝连接错误,但客户端却显示连接成功。究其原因,就是这节要讨论的请求队列在起作用。

在使用ServerSocket对象绑定一个端口后,操作系统就会为这个端口分配一个先进先出的队列(这个队列长度的默认值一般是50),这个队列用于保存未处理的客户端请求,因此叫请求队列。而ServerSocket类的accept方法负责从这个队列中读取未处理的客户端请求。如果请求队列为空,accept则处于阻塞状态。每当客户端向服务端发来一个请求,服务端会首先将这个客户端请求保存在请求队列中,然后accept再从请求队列中读取。这也可以很好地解释为什么上面的代码在还未执行到accept方法时,仍然可以接收一定数量的客户端请求。如果请求队列中的客户端请求数达到请求队列的最大容量时,服务端将无法再接收客户端请求。如果这时客户端再向服务端发请求,客户端将会抛出一个SocketException异常。

ServerSocket类有两个构造方法可以使用backlog参数重新设置请求队列的长度。在以下几种情况,仍然会采用操作系统限定的请求队列的最大长度:

  • backlog的值小于等于0
  • backlog的值大于操作系统限定的请求队列的最大长度。
  • ServerSocket构造方法中未设置backlog参数。

下面积代码演示了请求队列的一些特性,请求队列长度通过命令行参数传入SetRequestQueue

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package server;

importjava.net.*;

classTestRequestQueue
{
publicstaticvoidmain(String[]args)throwsException
{
for(inti=0;i<10;i++)
{
Socketsocket
=newSocket("localhost",1234);
socket.getOutputStream().write(
1);
System.out.println(
"已经成功创建第"+String.valueOf(i+1)+"个客户端连接!");
}
}
}
publicclassSetRequestQueue
{
publicstaticvoidmain(String[]args)throwsException
{
if(args.length==0)
return;
intqueueLength=Integer.parseInt(args[0]);
ServerSocketserverSocket
=newServerSocket(1234,queueLength);
System.out.println(
"端口(1234)已经绑定,请按回车键开始处理客户端请求!");
System.in.read();
intn=0;
while(true)
{
System.out.println(
"<准备接收第"+(++n)+"个客户端请求!");
Socketsocket
=serverSocket.accept();
System.out.println(
"正在处理第"+n+"个客户端请求");
Thread.sleep(
3000);
System.out.println(
""+n+"个客户端请求已经处理完毕!>");
}
}
}

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 11"><meta name="Originator" content="Microsoft Word 11"><link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C02%5Cclip_filelist.xml"><!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><style> <!-- /* Font Definitions */ &#64;font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0;} &#64;font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} &#64;font-face {font-family:""&#64;宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ &#64;page {} &#64;page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} /* List Definitions */ &#64;list l0 {} &#64;list l0:level1 { margin-left:21.0pt; text-indent:-21.0pt; font-family:Wingdings;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} --> </style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman";} </style> <![endif]-->

测试(按着以下步骤操作)
1. 执行如下命令(在执行这条命令后,先不要按回车键):

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->java server.SetRequestQueue2


运行结果:

端口(1234)已经绑定,请按回车键开始处理客户端请求!
2. 执行如下命令:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->javaserver.TestRequestQueue

运行结果:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->已经成功创建第1个客户端连接!
已经成功创建第2个客户端连接!
Exceptioninthread
"main"java.net.SocketException:Connectionresetbypeer:socketwriteerror
atjava.net.SocketOutputStream.socketWrite0(NativeMethod)
atjava.net.SocketOutputStream.socketWrite(SocketOutputStream.java:
92)
atjava.net.SocketOutputStream.write(SocketOutputStream.java:
115)
at server.TestRequestQueue.main(SetRequestQueue.java:
12)


3. 按回车键继续执行SetRequestQueue后,运行结果如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->端口(1234)已经绑定,请按回车键开始处理客户端请求!
<准备接收第1个客户端请求!
正在处理第1个客户端请求
第1个客户端请求已经处理完毕!>
<准备接收第2个客户端请求!
正在处理第2个客户端请求
第2个客户端请求已经处理完毕!>
<准备接收第3个客户端请求!

从第二步的运行结果可以看出,当TestRequestQueue创建两个Socket连接之后,服务端的请求队列已满,并且服务端暂时无法继续执行(由于System.in.read()的原因而暂停程序的执行,等待用户的输入)。因此,服务端程序无法再接收客户端请求。这时TestRequestQueue抛出了一个SocketException异常。在TestRequestQueue已经创建成功的两个Socket连接已经保存在服务端的请求队列中。在这时按任意键继续执行SetRequestQueueaccept方法就会从请求队列中将这两个客户端请求队列中依次读出来。从第三步的运行结果可以看出,服务端处理完这两个请求后(一个<…>包含的就是一个处理过程),请求队列为空,这时accept处理阻塞状态,等待接收第三个客户端请求。如果这时再运行TestRequestQueue,服务端会接收几个客户端请求呢?如果将请求队列的长度设为大于10的数,TestRequestQueue的运行结果会是什么呢?读者可以自己做一下这些实验,看看和自己认为的结果是否一致。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="ProgId" content="Word.Document"><meta name="Generator" content="Microsoft Word 11"><meta name="Originator" content="Microsoft Word 11"><link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C02%5Cclip_filelist.xml"><!--[if gte mso 9]><xml> Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 </xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if !mso]> <style> st1":*{behavior:url(#ieooui) } </style> <![endif]--><style> <!-- /* Font Definitions */ &#64;font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} &#64;font-face {font-family:""&#64;宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ &#64;page {} &#64;page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} --> </style><!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable { mso-style-parent:""; font-size:10.0pt; font-family:"Times New Roman";} </style> <![endif]-->三、绑定IP地址

在有多个网络接口或多个IP地址的计算机上可以使用如下的构造方法将服务端绑定在某一个IP地址上:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicServerSocket(intport,intbacklog,InetAddressbindAddr)throwsIOException

bindAddr参数就是要绑定的IP地址。如果将服务端绑定到某一个IP地址上,就只有可以访问这个IP地址的客户端才能连接到服务器上。如一台机器上有两块网卡,一块网卡连接内网,另一块连接外网。如果用Java实现一个Email服务器,并且只想让内网的用户使用它。就可以使用这个构造方法将ServerSocket对象绑定到连接内网的IP地址上。这样外网就无法访问Email服务器了。可以使用如下代码来绑定IP地址:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->ServerSocketserverSocket=new
ServerSocket(
1234,0,InetAddress.getByName("192.168.18.10"));

上面的代码将IP地址绑定到了192.168.18.10上,因此,服务端程序只能使用绑定了这个IP地址的网络接口进行通讯。
四、默认构造方法的使用

除了使用ServerSocket类的构造方法绑定端口外,还可以用ServerSocketbind方法来完成构造方法所做的工作。要想使用bind方法,必须得用ServerSocket类的默认构造方法(没有参数的构造方法)来创建ServerSocket对象。bind方法有两个重载形式,它们的定义如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->publicvoidbind(SocketAddressendpoint)throwsIOException
publicvoidbind(SocketAddressendpoint,intbacklog)throwsIOException

bind方法不仅可以绑定端口,也可以设置请求队列的长度以及绑定IP地址。bind方法的作用是为了在建立ServerSocket对象后设置ServerSocket类的一些选项。而这些选项必须在绑定端口之前设置,一但绑定了端口后,再设置这些选项将不再起作用。下面的代码演示了bind方法的使用及如何设置ServerSocket类的选项。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->ServerSocketserverSocket1=newServerSocket();
serverSocket1.setReuseAddress(true);
serverSocket1.bind(newInetSocketAddress(1234));
ServerSocketserverSocket2=newServerSocket();
serverSocket2.setReuseAddress(true);
serverSocket2.bind(newInetSocketAddress("192.168.18.10",1234));
ServerSocketserverSocket3=newServerSocket();
serverSocket3.setReuseAddress(true);
serverSocket3.bind(newInetSocketAddress("192.168.18.10",1234),30);

在上面的代码中设置了SO_REUSEADDR 选项(这个选项将在后面的文章中详细讨论)。如果使用下面的代码,这个选项将不起作用。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->ServerSocketserverSocket3=newServerSocket(1234);
serverSocket3.setReuseAddress(
true);

在第6行绑定了IP地址和端口。使用构造方法是无法得到这个组合的(想绑定IP地址,必须得设置backlog参数),因此,bind方法比构造方法更灵活。

下一篇:
Java网络编程从入门到精通(26):在服务端接收和发送数



国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

    java网络编程从入门到精通

    Java网络编程是开发分布式应用...通过阅读"Java网络编程从入门到精通"这本书,你将系统地学习到以上所有内容,并通过实例和练习加深理解,从而在实际项目中灵活运用这些知识,成为一名精通Java网络编程的专业开发者。

    Java网络编程从入门到精通

    本教程"Java网络编程从入门到精通"旨在帮助初学者和有经验的开发者深入理解这一领域,从基础知识到高级主题,提供了一套全面的学习资源。 在Java中,网络编程主要涉及以下核心知识点: 1. **Socket编程**:Java的...

    java 网络编程从入门到精通

    Java编程语言提供了丰富的API来处理网络编程任务,例如`java.net`包中的`InetAddress`用于处理IP地址和主机名,`Socket`和`ServerSocket`用于实现客户端和服务器间的TCP连接,`DatagramSocket`和`DatagramPacket`...

    JAVA网络编程从入门到精通

    ### JAVA网络编程从入门到精通知识点详解 #### 一、Internet地址概述 互联网中的每一台设备都需要有一个唯一的标识符——IP地址。当前广泛使用的IPv4地址由四个字节组成,而未来的趋势是采用16个字节的IPv6地址。 ...

    JAVA基础入门到精通pdf

    Java编程语言是全球范围内广泛应用的开发工具,尤其在企业级应用和互联网开发中占据着重要地位。本资源“JAVA基础入门到精通pdf”提供了一条系统学习Java的路径,适合初学者作为入门教程。以下是对Java基础知识的...

    Java开发实战从入门到精通视频教程下载第19章 Java网络编程.zip

    Java开发实战从入门到精通的第19章聚焦于Java网络编程,这是一个至关重要的主题,因为网络编程是现代软件开发中的基石。Java以其强大的网络功能和API,为开发者提供了构建网络应用的强大工具。本章教程将深入讲解...

    Java从入门到精通的课程PPT

    【Java编程语言基础】 ...总结,本套"Java从入门到精通的课程PPT"涵盖了Java语言的基础概念、语法特性、核心结构以及进阶主题,通过PPT形式呈现,有助于学习者系统性地掌握Java编程,为实际开发打下坚实基础。

    java书籍从入门到精通.rar

    Java编程语言是世界上最流行的编程语言之一,以其跨平台、面向对象和强大的库支持而闻名。这份"java书籍从入门到精通.rar"压缩包文件显然包含了丰富的学习资源,旨在帮助初学者掌握Java技术,逐步成长为精通Java的...

    《Java从入门到精通》第4版全书完整PPT课件

    《Java从入门到精通》第四版是一本深受Java初学者和进阶者欢迎的教材,其PPT课件是学习Java编程的重要参考资料。这本教材全面覆盖了Java的基础语法、面向对象编程、集合框架、多线程、网络编程、数据库操作、Swing...

    Java_2从入门到精通

    【Java_2从入门到精通】是一套完整的Java学习资源,PDG版可能指的是PDF电子版,适合初学者系统地掌握Java编程语言。本教程涵盖了Java的基础知识到高级特性的全面讲解,旨在帮助读者从零基础逐渐晋升为熟练的Java...

    java基础 Java开发入门到精通PPT课件 共353页.ppt

    Java的基础知识包括语法基础、面向对象编程以及高级编程接口,这些内容构成了Java开发入门到精通的核心。 **Java语法基础**是学习Java的第一步,涵盖了变量、数据类型、运算符、控制流(如if语句、for循环、while...

    java从入门到精通教程

    本教程“Java从入门到精通”旨在为初学者提供一个全面的学习路径,覆盖了从基础语法到高级特性的各个层面。以下是这个教程中涵盖的关键知识点: 1. **Java语法基础**:学习Java首先需要掌握基本的语法结构,包括...

    java 课程课件 从入门到精通

    这个“Java课程课件 从入门到精通”涵盖了Java学习的核心内容,非常适合编程初学者。以下是根据提供的压缩包文件名称所涉及的知识点的详细说明: 1. **Lesson6 鞍合类(组合类)**: - 组合是面向对象编程中的一个...

    java 从入门到精通.zip

    Java编程语言自1995年发布以来,一直保持着其在软件开发领域的核心地位,尤其在企业级应用、安卓移动开发以及互联网服务方面表现出色。本资料“Java从入门到精通”旨在帮助初学者系统地学习Java语言,逐步掌握其核心...

    java 从入门到精通

    《Java 从入门到精通》是一本全面而深入的学习指南,专为初学者设计,旨在帮助读者快速掌握Java编程语言的基础知识并逐步提升至高级技巧。这个压缩包包含了几百个精心编写的可运行类实例,这些实例覆盖了Java语言的...

    JAVA学习从入门到精通

    Java编程语言是全球范围内广泛应用的开源编程语言,以其平台无关性、安全性以及强大的面向对象特性而闻名。"JAVA学习从入门到精通"是一本旨在帮助初学者掌握Java核心技术的书籍,通过深入浅出的方式,引领读者逐步...

    Java从入门到精通(项目案例版)【代码源文件】

    《Java从入门到精通(项目案例版)》是一本旨在帮助初学者系统学习并掌握Java编程语言的专业书籍。这本书通过丰富的项目案例,让读者在实践中理解并应用Java基础知识,从而达到精通的目的。提供的代码源文件是书中...

    java 网络编程入门实例总结

    你可以通过阅读和运行提供的HTML文档"java网络编程入门实例.html"来进一步理解这些概念。这个文档可能包含了详细的代码注释,解释了如何创建UDP和TCP服务器与客户端,以及如何在它们之间交换数据。通过实践这些示例...

    从O开始学JAVA,从入门到精通!

    在“从零开始学Java编程”中,我们首先会接触到的是Java环境的搭建,包括安装Java Development Kit(JDK)和配置环境变量。接着,我们将学习Java的基本语法,例如数据类型(如整型、浮点型、字符型和布尔型)、变量...

Global site tag (gtag.js) - Google Analytics