服务端
ServerSocket serverSocket = new ServerSocket(8080);//只是监听8080端口
System.out.println("服务器启动成功");
while (!serverSocket.isClosed()) {
Socket request = serverSocket.accept(); //获取socket对象,是阻塞方法(如果没有新的连接过来,会一直等待,直到有一个连接被创建)
//socket对象,可以获取客户端请求,以及给客户端发送响应数据
System.out.println("收到新连接 : " + request.toString());
try{
//需要I/O操作
InputStream inputStream = request.getInputStream();//获取到socket的InputStream对象
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
String msg;
while((msg = reader.readLine() )!= null){//没有数据,阻塞
if(msg.lengtg() == 0){
break;
}
System.out.println(msg);
}
System.out.println("收到数据,来自:"+ request.toString());
}catch(Exception e){
e.printStackTrace();
}finally {
try {
request.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
serverSocket.close();
客户端
Socket client = new Socket("localhost", 8080);//两个参数,host和端口
OutputStream out = client.getOutputStream;
String msg = "hello world";
out.write(msg.getBytes(“UTF-8”));//是阻塞方法,只有写完,才会返回
clinet.close();
处理多连接
使用线程池,多线程技术
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("tomcat 服务器启动成功");
while (!serverSocket.isClosed()) {
Socket request = serverSocket.accept();
System.out.println("收到新连接 : " + request.toString());
threadPool.execute(() -> {//启动线程池,防止由于下面的while阻塞语句,导致程序不能继续执行
try {
// 接收数据、打印
InputStream inputStream = request.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
String msg;
while ((msg = reader.readLine()) != null) { // 阻塞
if (msg.length() == 0) {
break;
}
System.out.println(msg);
}
System.out.println("收到数据,来自:"+ request.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
request.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
serverSocket.close();
HTTP协议
浏览器和服务端交互的时候,使用的http协议。
请求数据包解析
响应数据包解析
响应状态码
协议开发—http协议
添加以下代码,可以与浏览器进行交互。
OutputStream outputStream = request.getOutputStream();
outputStream.write("HTTP/1.1 200 OK\r\n".getBytes());
outputStream.write("Content-Length: 11\r\n\r\n".getBytes());
outputStream.write("Hello World".getBytes());
outputStream.flush();
想在Socket之上,支撑更多的功能,而不是简单的数据收发,需要在TCP之上,开发更多协议,例如:http协议
协议:客户端、服务端之间交互的特定规范。请求数据和响应数据,都需要遵循这个协议进行开发
Socket是不支持高级功能的,需要高级的协议,即应用层协议。