建立一個簡單的socket連線
阿新 • • 發佈:2018-12-26
1、建立一個簡單的socket連線。
當客戶端與服務端進行通訊時,服務端首先監聽埠,程式中監聽本地8000埠,通過while(true)輪詢,不斷地去accept方法(阻塞的)連線,這時客戶端如果建立連線,服務端都能拿到這個連線,對應扔給處理器去處理客戶端連線,這個連線建立完成之後,客戶端就將資料寫入服務端,那麼對於服務端就是接收資料過程,服務端接收到資料要進行一系列的處理。
2、啟動服務端。
package com.waylau.Netty; /** * socketDemo */ public class SocketDemo { private static final int PORT = 8000; public static void main(String[] args) { //建立服務端,傳入監聽的PORT埠號 Server server = new Server(PORT); server.start(); } }
3、服務端。
package com.waylau.Netty; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { private ServerSocket serverSocket; public Server(int port) { try { this.serverSocket = new ServerSocket(port); System.out.println("服務端啟動成功,埠:" + port); } catch (IOException exception) { System.out.println("服務端啟動失敗"); } } public void start() { new Thread(new Runnable() { @Override public void run() { doStart(); } }).start(); } private void doStart() { while (true) { try { //accpet阻塞的 Socket client = serverSocket.accept(); new ClientHandler(client).start(); } catch (IOException e) { System.out.println("服務端異常"); } } } }
4、客戶端。
package com.waylau.Netty; import java.io.IOException; import java.net.Socket; public class Client { private static final String HOST = "127.0.0.1"; private static final int PORT = 8000; private static final int SLEEP_TIME = 5000; public static void main(String[] args) throws IOException { final Socket socket = new Socket(HOST, PORT); new Thread(new Runnable() { @Override public void run() { System.out.println("客戶端啟動成功!"); while (true) { try { String message = "hello world"; System.out.println("客戶端傳送資料: " + message); socket.getOutputStream().write(message.getBytes()); } catch (Exception e) { System.out.println("寫資料出錯!"); } sleep(); } } }).start(); } private static void sleep() { try { Thread.sleep(SLEEP_TIME); } catch (InterruptedException e) { e.printStackTrace(); } } }
5、服務端處理客戶端資料的物件。
package com.waylau.Netty;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
public class ClientHandler {
public static final int MAX_DATA_LEN = 1024;
private final Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
public void start() {
System.out.println("新客戶端接入");
new Thread(new Runnable() {
@Override
public void run() {
doStart();
}
}).start();
}
private void doStart() {
try {
//通過InputStream獲得客戶端傳來的資料
InputStream inputStream = socket.getInputStream();
while (true) {
byte[] data = new byte[MAX_DATA_LEN];
int len;
while ((len = inputStream.read(data)) != -1) {
String message = new String(data, 0, len);
System.out.println("客戶端傳來訊息: " + message);
socket.getOutputStream().write(data);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
5、結果。