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地址或端口号。
如何通信:
客户端工作过程步骤:
- 创建Socket(主要是设置远程地址和端口等信息)
- 打开连接到Socket的输入/出流
- 按照一定的协议对Socket进行读/写操作
- 关闭Socket
服务器工作过程步骤:
- 创建ServerSocket(主要是设置本地地址和端口等信息)
- 接受连接,获取Socket(调用accept方法,已绑定了客户端的地址和端口,无需设置)
- 打开连接到Socket的输入/出流
- 按照一定的协议对Socket进行读/写操作
- 关闭ServerSocket和Socket
一个简单例子(没怎么考虑异常)
客户端代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
服务器代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }