Socket例子

javaSE中,如果需要建立服务器与客户端之间的通信,可以使用Socket。

ServerSocket类:对应服务器

Socket类:对应客户端

上面两个类并没有继承关系,它们中都拥有一个SocketImpl类的成员变量,事实上两者的工作都由这个变量去执行。在应用程序中,我们可以通过改变SocketImplFactory来定制特定的SocketImpl类应对本地的防火墙。

 

Socket类:

构造方法:(有多个,只说一个)

public Socket(String host,int port,InetAddress localAddr,int localPort) throws IOException

host - 远程地址,为null则表示回环地址。
port - 远程端口。
localAddr - 本地地址,会被socket绑定;如果是null,则会选择任意一个本地地址。
localPort - 本地端口,会被socket绑定;如果是0 ,则系统会选择一个空闲的端口。

 

ServerSocket类:

构造方法:(有多个,只说一个)

public ServerSocket(int port,int backlog,InetAddress bindAddr) throws IOException

参数:
port - 端口。如果是值是0,则会自动分配一个端口号。
backlog - 在连接队列中所允许的最大连接数目,可限制客户端数目。
bindAddr - 本地地址,会被服务器绑定。

重要方法:

public Socket accept() throws IOException

解释:这个方法会监听一个向它发来的连接,然后会接受这个连接。这个方法会被阻塞,直到连接产生。并且返回一个客户端的Socket对象实例。该Socket对象绑定了客户程序的IP地址或端口号。

 

如何通信:

客户端工作过程步骤:

  1. 创建Socket(主要是设置远程地址和端口等信息)
  2. 打开连接到Socket的输入/出流
  3. 按照一定的协议对Socket进行读/写操作
  4. 关闭Socket

服务器工作过程步骤:

  1. 创建ServerSocket(主要是设置本地地址和端口等信息)
  2. 接受连接,获取Socket(调用accept方法,已绑定了客户端的地址和端口,无需设置)
  3. 打开连接到Socket的输入/出流
  4. 按照一定的协议对Socket进行读/写操作
  5. 关闭ServerSocket和Socket

 

一个简单例子(没怎么考虑异常)

客户端代码:

View Code
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStreamReader;
 4 import java.io.PrintWriter;
 5 import java.net.Socket;
 6 import java.net.UnknownHostException;
 7 
 8 public class Client {
 9     public static void main(String[] args) {
10         Socket client = null;
11         BufferedReader remoteRead = null;
12         PrintWriter remoteWriter = null;
13         BufferedReader reader = null;
14         try {
15             client = new Socket((String) null, 10000);// 远程地址参数值为null,则对应回环地址
16             remoteRead = new BufferedReader(new InputStreamReader(
17                     client.getInputStream()));
18             remoteWriter = new PrintWriter(client.getOutputStream(), true);
19             reader = new BufferedReader(new InputStreamReader(System.in));
20             System.out.println("client:在控制台输入信息");
21             String writeMsg = reader.readLine();// 读取控制台输入的信息
22             remoteWriter.println(writeMsg);// 向远程服务器传送信息
23             System.out.println("client:已向服务器发送信息-----" + writeMsg);
24             String readMsg = remoteRead.readLine();// 向远程服务器读取响应信息
25             System.out.println("client:从服务器获得信息为-----" + readMsg);
26 
27             reader.close();
28             remoteRead.close();
29             remoteWriter.close();
30             client.close();
31             System.out.println("client:关闭");
32         } catch (UnknownHostException e) {
33             e.printStackTrace();
34         } catch (IOException e) {
35             e.printStackTrace();
36         }
37     }
38 
39 }

服务器代码:

View Code
 1 import java.io.BufferedReader;
 2 import java.io.IOException;
 3 import java.io.InputStreamReader;
 4 import java.io.PrintWriter;
 5 import java.net.ServerSocket;
 6 import java.net.Socket;
 7 
 8 public class Server {
 9 
10     public static void main(String[] args) {
11         ServerSocket server = null;
12         Socket client = null;
13         BufferedReader remoteRead = null;
14         PrintWriter remoteWriter = null;
15         try {
16             server = new ServerSocket(10000);
17             System.out.println("server:等待连接");
18             client = server.accept();// 会阻塞,直到有连接
19             remoteRead = new BufferedReader(new InputStreamReader(
20                     client.getInputStream()));
21             remoteWriter = new PrintWriter(client.getOutputStream(), true);
22             String readMsg = remoteRead.readLine();// 读取客户端的信息
23             System.out.println("server:客户端传送来的信息---" + readMsg);
24             remoteWriter.println("已收到");
25 
26             remoteRead.close();
27             remoteWriter.close();
28             client.close();
29             server.close();
30             System.out.println("server:关闭");
31         } catch (IOException e) {
32             e.printStackTrace();
33         }
34 
35     }
36 
37 }


posted @ 2012-10-28 01:19  Dann  阅读(310)  评论(0编辑  收藏  举报