Socket与ServerSocket
ServerSocket用来代表服务器端的Socket,也就是服务器端的端点
Socket就是客户端的端口
首先,当我们创建一个ServerSocket的时候,要先提供一个端口,实现端口的绑定,一旦绑定之后,这个ServerSocket就可以作为服务端的端口,服务器就会一直监听这个端口。
然后会调用一个叫accept的函数,accept是一个阻塞式的调用,所谓阻塞式的调用,就是它会等待任何一个客户端来跟它建立连接,当没有客户端来建立连接的时候,accept就会一直等待。
一旦客户端,创建一个Socket对象,是用来表达客户端的端点的,客户端生成的一个Socket可以要求跟服务端进行连接。
一旦服务端接受了客户端的连接,这个accept就会返回一个Socket,这个端点就可以跟客户端的端点进行沟通。
实现ServerSocket
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
final String QUIT = "quit";
final int DEFAULT_POST = 8888;
ServerSocket serverSocket = null;
try {
// 绑定监听端口
serverSocket = new ServerSocket(DEFAULT_POST);
System.out.println("启动服务器,监听端口" + DEFAULT_POST);
while (true){
//等待客户端连接,一旦有客户端连接上了,就会返回一个Socket,这个Socket就是客户端的端点
Socket socket = serverSocket.accept();
System.out.println("客户端[" + socket.getPort() + "]已连接");
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream())
);
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())
);
String msg = null;
while ((msg = reader.readLine()) != null){
System.out.println("客户端[" + socket.getPort() + "]:" + msg);
//回复客户发送的消息
writer.write("服务器:" + msg + "\n");
writer.flush();
//查看客户端是否退出
if (QUIT.equals(msg)){
System.out.println("客户端[" + socket.getPort() + "]已退出");
break;
}
}
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (serverSocket != null){
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}