用java寫websocket客戶端
阿新 • • 發佈:2018-12-31
最近用websocket寫一個通訊的系統,伺服器用tocmat,客戶端使用android,為了在android端用java進行websocket通訊在網上找個很久的資料,搜客戶端出來的很多都是js實現的客戶端,最合適的就是一個叫java-websocket的開源專案,用起來很簡單,在這分享一下自己的一些收穫
步驟
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.3.4</version>
<scope>test</scope>
</dependency>
```
2.
實現 WebSocketClient 介面,我為了偷懶用了匿名內部類的形式,下面是完整程式碼
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
import java.nio.channels.NotYetConnectedException;
import org.java_websocket.WebSocket.READYSTATE;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft_17;
import org.java_websocket.handshake.ServerHandshake;
public class Client {
public static WebSocketClient client; public static void main(String[] args) throws URISyntaxException, NotYetConnectedException, UnsupportedEncodingException { client = new WebSocketClient(new URI("ws://localhost:8080/zhihui/connect.html"),new Draft_17()) { @Override public void onOpen(ServerHandshake arg0) { System.out.println("開啟連結"); } @Override public void onMessage(String arg0) { System.out.println("收到訊息"+arg0); } @Override public void onError(Exception arg0) { arg0.printStackTrace(); System.out.println("發生錯誤已關閉"); } @Override public void onClose(int arg0, String arg1, boolean arg2) { System.out.println("連結已關閉"); } @Override public void onMessage(ByteBuffer bytes) { try { System.out.println(new String(bytes.array(),"utf-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }; client.connect(); while(!client.getReadyState().equals(READYSTATE.OPEN)){ System.out.println("還沒有開啟"); } System.out.println("打開了"); send("hello world".getBytes("utf-8")); client.send("hello world"); } public static void send(byte[] bytes){ client.send(bytes); }
}
特別要注意的就是
client = new WebSocketClient(new URI("ws://localhost:8080/zhihui/connect.html"),new Draft_17())
這個地方,我剛開始的時候
構造方法中沒有傳入new Draft_17(),連線一直不成功,最後知道Dratf的很多子類分表表示不同的websocket協議版本,加上之後執行成功。