------- 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就可以使用一个流接口:打开-读-写-关闭。所有的
发送的信息都会在另一端以同样的顺序被接收。面向连接的操
作比无连接的操作效率更低,但是数据的安全性更高。