传统的BIO编程
网络编程的基本模型是Client/Server模型,也就是两个进程之间相互通信,其中服务器端提供位置信息(Socket),客户端通过连接操作向服务器端监听的地址发起连接请求,通过三次握手建立连接,如果连接建立成功,双方就可以通过网络套接字(Socket)进行通信。
在基于传统的同步阻塞(BIO)模型开发中,ServerSocket负责绑定IP地址,启动监听端口;Socket负责发起连接操作。连接成功之后,双方通过输入流和输出流进行同步阻塞式通信。
服务器端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPSocketServerTest {
public static void main(String[] args) {
ServerSocket serversocket;
try {
//建一个服务器Socket(ServerSocket),指定30000端口开始监听
serversocket = new ServerSocket(30000);
Socket socket=serversocket.accept();
//打开输入/输出流
OutputStream os=socket.getOutputStream();
InputStream is=socket.getInputStream();
//获取客户端信息,即从输入流读取信息
String info = null;
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while(!((info = br.readLine())==null)) {
System.out.println("我是TCP服务器,服务器的响应为:" + info);
}
}
}
客户端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class TCPSocketClientTest {
public static void main(String[] args) {
Socket socket;
try {
socket = new Socket("localhost",30000);
OutputStream os=socket.getOutputStream();
InputStream is=socket.getInputStream();
String info="姓名是:xingze,年龄是:21";
os.write(info.getBytes());
socket.shutdownOutput();
String reply=null;
BufferedReader br = new BufferedReader(new InputStreamReader(is));
while(!((reply = br.readLine())==null)) {
System.out.println("我是TCP客户端,服务器的响应为:" + reply);
}
}} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行结果:
BIO编程的弊端
BIO的弊端在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接,无法满足高性能、高并发的要求。解决这种弊端的方法是采用JDK1.4中的NIO和JDK1.7中的NIO.2。