netty学习笔记02——java如何使用socket通信呢
传统的BIO通信模型是这样的:
服务端接受连接,把连接封装成为socket,把这个socket对象交给新的线程处理。
服务端接受连接的代码:
public class BIOTimeServer {
public static void main(String[] args) {
int port = 8080;
if(args!=null && args.length > 0 ){
try{
port = Integer.valueOf(args[0]);
}catch(NumberFormatException e){
port = 8080;
}
}
try(ServerSocket serverSocket = new ServerSocket(port);){//创建一个阻塞式socket服务器,绑定了端口
System.out.println("The time server is start in port: " + port);
Socket socket = null;
while(true){
socket = serverSocket.accept();//服务端程序会在这里阻塞,一直等到对应的端口有socket访问为止
new Thread(new BIOTimeHandler(socket)).start();//把接收到的socket给一个线程处理
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务端处理的逻辑:
public class BIOTimeHandler implements Runnable {
private Socket socket;
public BIOTimeHandler(Socket socket){
this.socket = socket;
}
@Override
public void run(){
try(BufferedReader in = new BufferedReader(
new InputStreamReader(
this.socket.getInputStream()));//构造一个数据源读取
PrintWriter out = new PrintWriter(
this.socket.getOutputStream(), true);){//构造一个输出打印
String currentTime = null;
String body = null;
while(true){
body = in.readLine();
if(body == null){
break;
}
System.out.println("The Time server receive order: " + body);
currentTime = "QUERY TIME ORDER".equals(body)?
new Date(System.currentTimeMillis()).toString()
:"BAD ORDER";//判断输入是否合法
out.println(currentTime);//打印响应内容
}
}catch (Exception e) {
}
}
}
客户端建立连接的代码:
public class BIOTimeClient {
public static void main(String[] args){
int port = 8080;
if(args!=null && args.length > 0 ){
try{
port = Integer.valueOf(args[0]);
}catch(NumberFormatException e){
port = 8080;
}
}
try(Socket socket = new Socket("127.0.0.1", port);//绑定一个socket
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));//构建一个reader
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);){//构建一个打印
out.println("QUERY TIME ORDER");//输出内容
System.out.println("send order to server succeed.");
String resp = in.readLine();//读取响应
System.out.println("Now is: " + resp);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}