1. 程式人生 > >websocket的那些事 - java client/server Hello World例項

websocket的那些事 - java client/server Hello World例項

       此例項使用java netty-socketio進行服務端開發, 客戶端使用socket.io-client-java一般網上例項客戶端都使用socket.io-clientnetty-socketio自帶的Demo project也是使用的socket.io-client, 畢竟socket.io-client-java是參照socket.io-client移植過來的,費話不多說,上菜 #_#

一、不帶Namespace例項

  • 引入maven jar
        <dependency>
			<groupId>com.corundumstudio.socketio</groupId>
			<artifactId>netty-socketio</artifactId>
			<version>1.7.7</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-simple</artifactId>
			<version>1.7.7</version>
		</dependency>

		<dependency>
			<groupId>io.socket</groupId>
			<artifactId>socket.io-client</artifactId>
			<version>0.9.0</version>
		</dependency>

        <!-- socket.io-client support -->
		<dependency>
			<groupId>org.json</groupId>
			<artifactId>json</artifactId>
			<version>20180130</version>
		</dependency>
  • 服務端CODE
import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.listener.ConnectListener;
import com.corundumstudio.socketio.listener.DataListener;
import com.corundumstudio.socketio.protocol.Packet;
import com.corundumstudio.socketio.protocol.PacketType;
import com.itdreamer.util.DataUtil;

import io.socket.client.Socket;

public class Server {
	public static void main(String[] args) throws InterruptedException {
		 
        Configuration config = new Configuration();
        config.setHostname("localhost");
        config.setPort(8090);
 
        final SocketIOServer server = new SocketIOServer(config);
 
        server.addConnectListener(new ConnectListener() {
            @Override
            public void onConnect(SocketIOClient client) {
                System.out.println(DataUtil.getCurrentDataTime() + ":client connection, sessionId:" + client.getSessionId());
                Packet packet = new Packet(PacketType.MESSAGE);
                packet.setData("hello client,Welcome to connect!");
                client.send(packet);
            }
        });
 
 
        server.addEventListener(Socket.EVENT_MESSAGE, String.class, new DataListener<String>() {
            @Override
            public void onData(SocketIOClient client, String data, AckRequest ackSender) throws Exception {
                System.out.println(DataUtil.getCurrentDataTime() + ":client data:" + data);
                
                server.getBroadcastOperations().sendEvent(Socket.EVENT_MESSAGE, "my too client!");
            }
        });
 
        server.start();
        Thread.sleep(Integer.MAX_VALUE);
        server.stop();
    }
	
}
  • 客戶端CODE
import java.net.URISyntaxException;
import java.util.Scanner;

import com.itdreamer.util.DataUtil;

import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;

public class Client {
	
	 public static void main(String[] args) throws URISyntaxException, InterruptedException {
	        IO.Options options = new IO.Options();
	        options.transports = new String[]{"websocket"};
	        options.reconnectionAttempts = 2;
	        //失敗重連的時間間隔
	        options.reconnectionDelay = 1000;
	        //連線超時時間(ms)
	        options.timeout = 500;			
	 
	        final Socket socket = IO.socket("http://localhost:8090", options);
	 
	        socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
	            @Override
	            public void call(Object... args) {
	            	System.out.println(DataUtil.getCurrentDataTime() + ":client connect! ");
	            	
	                socket.send("hello server, my name is client");
	            }
	        });
	 
	        socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
	            @Override
	            public void call(Object... args) {
	                System.out.println(DataUtil.getCurrentDataTime() + ":client disconnect!");
	            }
	        });
	 
	        socket.on(Socket.EVENT_MESSAGE, new Emitter.Listener() {
	            @Override
	            public void call(Object... args) {
	                for (Object obj : args) {
	                    System.out.println(DataUtil.getCurrentDataTime() + ":receive server message="+obj);
	                }
	            }
	        });
	        socket.connect();
	        
	        System.out.println(DataUtil.getCurrentDataTime() + ":client console input......");
			Scanner sc = new Scanner(System.in);
	        while (sc.hasNext()) {
	            String message = sc.next();
	            System.out.println(DataUtil.getCurrentDataTime() + ":client console send data="+message);
	            
				socket.send(message);
	        }
	    }
}
  • 支援工具CODE
import java.text.SimpleDateFormat;
import java.util.Date;

public class DataUtil {
	public static String FORMAT_YMD_HMS = "yyyy-MM-dd HH:mm:ss SS";
	
	public static String getCurrentDataTime() {
		SimpleDateFormat df = new SimpleDateFormat(FORMAT_YMD_HMS);
		return df.format(new Date());
	}
}

二、帶Namespace例項

** 引入maven jar 與 支援工具CODE同上 **

  • 服務端CODE
import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIONamespace;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.listener.ConnectListener;
import com.corundumstudio.socketio.listener.DataListener;
import com.corundumstudio.socketio.protocol.Packet;
import com.corundumstudio.socketio.protocol.PacketType;

import io.socket.client.Socket;

public class NamespaceServer {
	public static void main(String[] args) throws InterruptedException {
		Configuration config = new Configuration();
	    config.setHostname("localhost");
	    config.setPort(8090);
	    
		final SocketIOServer server = new SocketIOServer(config);
		
		server.addConnectListener(new ConnectListener() {
            @Override
            public void onConnect(SocketIOClient client) {
            	System.out.println("receive client onConnect");

            	Packet packet = new Packet(PacketType.MESSAGE);
                packet.setData("hello client,Welcome to connect!");
                client.send(packet);
            }
        });
		
		// 設定Namespace
		final SocketIONamespace chat1namespace = server.addNamespace("/room");
        chat1namespace.addEventListener(Socket.EVENT_MESSAGE, String.class, new DataListener<String>() {
            @Override
            public void onData(SocketIOClient client, String data, AckRequest ackRequest) {
            	System.out.println("receive client data="+data);
            	
            	client.sendEvent(Socket.EVENT_MESSAGE, "my too client!");
            }
        });
        
        server.start();
        Thread.sleep(Integer.MAX_VALUE);
        server.stop();
    }
 
}
  • 客戶端CODE
import java.net.URISyntaxException;
import java.util.Scanner;

import com.itdreamer.util.DataUtil;

import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;

public class NamespaceClient {
	public static void main(String[] args) throws URISyntaxException, InterruptedException {
        IO.Options options = new IO.Options();
        options.transports = new String[]{"websocket"};
        options.reconnectionAttempts = 2;
        //失敗重連的時間間隔
        options.reconnectionDelay = 1000;
        //連線超時時間(ms)
        options.timeout = 500;
 
        // ## 連線到指定的聊天室 【/room】########
        final Socket socket = IO.socket("http://localhost:8090/room", options);
 
        socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
            @Override
            public void call(Object... args) {
            	System.out.println(DataUtil.getCurrentDataTime() + ":client connect! ");
            	
                socket.send("hello server, my name is client");
            }
        });
 
        socket.on(Socket.EVENT_DISCONNECT, new Emitter.Listener() {
            @Override
            public void call(Object... args) {
            	System.out.println(DataUtil.getCurrentDataTime() + ":client disconnect!");
            }
        });
 
        socket.on(Socket.EVENT_MESSAGE, new Emitter.Listener() {
            @Override
            public void call(Object... args) {
            	for (Object obj : args) {
                    System.out.println(DataUtil.getCurrentDataTime() + ":receive server message="+obj);
                }
            }
        });
        
        socket.connect();
        
        System.out.println(DataUtil.getCurrentDataTime() + ":client console input......");
		Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String message = sc.next();
            System.out.println(DataUtil.getCurrentDataTime() + ":client console send data="+message);
            
			socket.send(message);
        }
    }
}

……注意

此例項socket.io-client-java版本使用的為 0.9.0,一開始使用的為最新版1.0.0,一直有不能通訊的問題,

沒細看官網說明

Socket.IO Server 1.x suppport

The current version of socket.io-client-java doesn't support socket.io server 1.x. Please use socket.io-client-java 0.9.x for that instead.

當前版本的socket.io-client-java不支援socket.io伺服器1.x. 請改用socket.io-client-java 0.9.x。