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。

猜你喜欢

转载自my.oschina.net/u/875122/blog/1793733