在繼續記錄NIO的學習之前,我覺得有必要先復習一下IO相關的知識。今天就說一下網絡套接字Socket
廢話不多說,先上代碼,這里實現一個最簡單的Echo功能,客戶端發送一條消息服務端直接進行返回。
服務端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Description:
* @author:xyq
* @date:2018年6月6日
*/
public class Server {
ServerSocket ss = null;
public static void main(String[] args) {
new Server().startServer();
}
public void startServer() {
Socket socket = null;
try {
ss = new ServerSocket(1234); // 監聽1234端口
while (true) {
socket = ss.accept(); // 堵塞式接受Socket
new ServerThread(socket).start(); // 放入線程進行處理
}
} catch (IOException e) {
e.printStackTrace();
}
}
class ServerThread extends Thread {
Socket socket = null;
public ServerThread(Socket socket){
this.socket = socket;
}
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
BufferedReader br = null;
PrintWriter pw = null;
try {
pw = new PrintWriter(socket.getOutputStream());
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String line = br.readLine();
System.out.println("從客戶端來的信息:" + line);
pw.println("你好,服務器已經收到您的信息!'" + line + "'\n");
pw.flush();
System.out.println("已經返回給客戶端!");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
pw.close();
br.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
客戶端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @Description:
* @author:xyq
* @date:2018年6月6日
*/
public class Client {
public static void main(String[] args) {
new Client().startClient();
}
public void startClient() {
Socket socket = null;
BufferedReader br = null;
PrintWriter pw = null;
try {
socket = new Socket("localhost", 1234);
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw = new PrintWriter(socket.getOutputStream());
String get = "客戶端" + Math.random() * 1000;
while (true) {
if (get != null && get.length() > 0) {
pw.println(get); // 寫入緩沖流
pw.flush(); // 刷新緩沖
}
if (br != null) {
String line = br.readLine();
System.out.println("從服務器來的信息:" + line);
}
Thread.sleep(2000);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
