什么是Socket
所谓“Socket”通常也被称作套接字,应用程序通常通过套接字向网络发出请求或者应答网络请求,在Socket编程中有两个重要的概念:ServerSocket和Socket。ServerSocket用于服务端,Socket是建立网络连接时服务端和客户端都要使用的,在连接成功时,应用程序两端都会产生一个Socket实例,程序员操作这个实例,完成所需的会话。
SOCKET连接过程
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址
和端口号,然后就向服务器端套接字提出连接请求。
连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
开发原理
服务端:
使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
建立服务端:
public class Server {
private ServerSocket ss ;
private Socket socket ;
private BufferedReader in ;
private PrintWriter out ;
public Server(){
try{
ss = new ServerSocket(10000);
socket = ss.accept(); //产生阻塞,直到接受一个连接
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket .getOutputStream(), true);
String line = in.readLine();
System. out.println("服务端接收到的信息为: " +line);
out.close();
in.close();
socket.close();
ss.close();
} catch(IOException e){
e.printStackTrace();
}
}
public static void main(String[] args) {
System. out.println("服务启动" );
new Server();
System. out.println("服务关闭" );
}
}
客户端:
使用Socket对网络上服务端指定的端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。
建立客户端:
public class Client {
Socket socket;
BufferedReader in;
PrintWriter out;
public Client(){
try{
socket = new Socket("127.0.0.1" , 10000);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket .getOutputStream() , true);
BufferedReader line = new BufferedReader(new InputStreamReader(System.in ));
out.println(line.readLine());
line.close();
out.close();
in.close();
socket.close();
} catch(IOException e){
e.printStackTrace();
}
}
public static void main(String[] args) {
new Client();
}
}
注:服务端一次只能接受一个客户连接。