黑马程序员——Java 网络程序设计

 

                  ------- android培训java培训、期待与您交流! ----------
Socket介绍

       Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以
发送请求,利用它可以较为方便地编写网络上数据的传递。在Java中,有专门的Socket
类来处理用户的请求和响应。利用Socket类的方法,就可以实现两台计算机之间的通
讯。本章介绍在Java中如何利用Socket进行网络编程。

       在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象
有两个关键的方法,一个是getInputStream()方法,另一个是getOutputStream()方法。
getInputStream()方法可以得到一个输入流,客户端的Socket对象上的getInputStream()
方法得到的输入流其实就是从服务器端发回的数据流。getOutputStream()方法得到一个
输出流,客户端Socket对象上的getOutputStream()方法返回的输出流就是将要发送到
服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。

      Sockets有两种主要的操作方式:面向连接的和无连接的。面向连接的sockets操
作就像一部电话,必须建立一个连接和一人呼叫。所有的事情在到达时的顺序与它们
出发时的顺序时一样,无连接的sockets操作就像是一个邮件投递,没有什么保证,多
个邮件可能在到达时的顺序与出发时的顺序不一样。

       到底用哪种模式是由应用程序的需要决定的。如果可靠性更重要的话,用面向连
接的操作会好一些。比如文件服务器需要数据的正确性和有序性,如果一些数据丢失
了,系统的有效性将会失去。比如一些服务器间歇性地发送一些数据块,如果数据丢
了的话,服务器并不想要再重新发过一次,因为当数据到达的时候,它可能已经过时
了。确保数据的有序性和正确性需要额外的操作的内存消耗,额外的费用将会降低系
统的回应速率。

      无连接的操作使用数据报协议。一个数据报是一个独立的单元,它包含了所有的
这次投递的信息。可以把它想象成一个信封,它有目的地址和要发送的内容。这个模
式下的socket不需要连接一个目的的socket,它只是简单地投出数据报.无连接的操作
是快速的和高效的,但是数据安全性不佳。

      在Java中面向连接的类有两种形式,它们分别是客户端和服务器端。下面先看
服务器端。

     下面首先先建立服务器端程序,此服务器端程序只用于向客户端输出“hello
world!”字符串。 


01 import java.io.*;

02 import java.net.*;

03 public class HelloServer

04 {

05 public static void main(String[] args) throws IOException

06 {

07 ServerSocket serversocket=null;

08 PrintWriter out=null;

09 try

10 {

11 // 在下面实例化了一个服务器端的Socket连接

12 serversocket=new ServerSocket(9999);

13 }

14 catch(IOException e)

15 {

16 System.err.println("Could not listen on port:9999.");

17 System.exit(1);

18 }

19 Socket clientsocket=null;

20 try

21 {

22 // accept()方法用来监听客户端的连接

23 clientsocket=serversocket.accept();

24 }

25 catch(IOException e)

26 {

27 System.err.println("Accept failed.");

28 System.exit(1);

29 }

30 out=new PrintWriter(clientsocket.getOutputStream(),true);

31 out.println("hello world!");

32 clientsocket.close();

33 serversocket.close();

34 }

35 }


程序说明:

1、 程序第7行声明了一个ServerSocket的对象。

2、 程序第8行声明了一个PrintWriter的对象,用于向可户端打印输出。

3、 程序第9行~第18行实例化ServerSocket对象,在9999端口进行监听。

4、 程序第19行声明一Socket对象clientsocket,此对象用于接收客户端的Socket连
接。
5、 程序第20行~29行通过ServerSocket类中的accept()方法,接收客户端的Socket

请求,此方法返回一个客户端的Socket请求。

6、 程序第30行,通过客户端的Socket对象去实例化PrintWriter对象,此时out对
象就具备了向客户端打印信息的能力。

7、 程序第31行调用println()方法,将信息打印至客户端。

8、 第32行关闭客户端Socket连接。

9、 第33行关闭服务器端Socket连接。

 

 下面为程序的客户端程序。

 

范例:HelloClient.java

01 import java.io.*;

02 import java.net.*;

03 public class HelloClient

04 {

05 public static void main(String[] args) throws IOException

06 {

07 Socket hellosocket=null;

08 BufferedReader in=null;

09 // 下面这段程序,用来将输入输出流与socket关联

10 try

11 {

12 hellosocket=new Socket("localhost",9999);

13 in=new BufferedReader(new InputStreamReader(hellosocket.getInputStream()));

14 }

15 catch(UnknownHostException e)

16 {

17 System.err.println("Don't know about host:localhost!");

18 System.exit(1);

19 }

20 catch(IOException e)

21 {

22 System.err.println("Couldn't get I/O for the connection.");

 

23 System.exit(1);

24 }

25 System.out.println(in.readLine());

26 in.close();

27 hellosocket.close();

28 }

29 }
 

程序说明:

1、 程序第7行声明一Socket的对象hellosocket。

2、 程序第8行声明一BufferedReader的对象in,此对象用于读取服务器端发送过来
的信息。

3、 程序第12行实例化hellosocket对象,此连接在本机的9999端口上监听。

4、 程序第13行通过hellosocket对象实例化BufferedReader对象。

5、 程序第25行等待服务器端发送过来的信息并打印。

6、 程序第26行关闭BufferedReader。

7、 程序第27行关闭Socket对象。

面向连接的操作使用TCP协议。一个这个模式下的socket必须在发送数据之前与
目的地的socket取得一个连接。一旦连接建立了,sockets就可以使用一个流接口:打开-读-写-关闭。所有的
发送的信息都会在另一端以同样的顺序被接收。面向连接的操
作比无连接的操作效率更低,但是数据的安全性更高。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值