【胎教】从0开始的java websocket服务器

全文在IDEA编译器基础上完成。

此文面向未学习过java各类框架的java初学者

CSDN上绝大多数java的websocket都是采用了spring boot框架

本文未采用spring相关的任何框架,只采用了maven来导入websocket库

参考来源:https://github.com/TooTallNate/Java-WebSocket/tree/master/src/main/example

 

 

首先IDEA新建一个java maven项目

在pom.xml文件中导入以下依赖

    <dependencies>
        <dependency>
            <groupId>org.java-websocket</groupId>
            <artifactId>Java-WebSocket</artifactId>
            <version>1.5.1</version>
        </dependency>
    </dependencies>

创建ChatServer.java文件

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.util.Collections;
import org.java_websocket.WebSocket;
import org.java_websocket.drafts.Draft;
import org.java_websocket.drafts.Draft_6455;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;


public class ChatServer extends WebSocketServer {

  public ChatServer(int port) throws UnknownHostException {
    super(new InetSocketAddress(port));
  }

  public ChatServer(InetSocketAddress address) {
    super(address);
  }

  public ChatServer(int port, Draft_6455 draft) {
    super(new InetSocketAddress(port), Collections.<Draft>singletonList(draft));
  }

  @Override
  public void onOpen(WebSocket conn, ClientHandshake handshake) {//客户端连接时调用
    conn.send("Welcome to the server!");
    broadcast("new connection: " + handshake.getResourceDescriptor()); //This method sends a message to all clients connected
    System.out.println(
    conn.getRemoteSocketAddress().getAddress().getHostAddress() + " entered the room!");
  }

  @Override
  public void onClose(WebSocket conn, int code, String reason, boolean remote) {//客户端断开连接时调用
    broadcast(conn + " has left the room!");
    System.out.println(conn + " has left the room!");
  }

  @Override
  public void onMessage(WebSocket conn, String message) {//收到客户端发送的消息时调用
    broadcast(message);
    System.out.println(conn + ": " + message);
  }

  @Override
  public void onMessage(WebSocket conn, ByteBuffer message) {
    broadcast(message.array());
    System.out.println(conn + ": " + message);
  }


  public static void main(String[] args) throws InterruptedException, IOException {
    int port = 8887; // 服务器所使用的端口号
    try {
      port = Integer.parseInt(args[0]);
    } catch (Exception ex) {
    }
    ChatServer s = new ChatServer(port);
    s.start();
    System.out.println("ChatServer started on port: " + s.getPort());

    BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));
    while (true) {
      String in = sysin.readLine();
      s.broadcast(in);
      if (in.equals("exit")) {
        s.stop(1000);
        break;
      }
    }
  }

  @Override
  public void onError(WebSocket conn, Exception ex) {
    ex.printStackTrace();
    if (conn != null) {
      // some errors like port binding failed may not be assignable to a specific websocket
    }
  }

  @Override
  public void onStart() {
    System.out.println("Server started!");
    setConnectionLostTimeout(0);
    setConnectionLostTimeout(100);
  }

}

这样就简单的创建了一个java webscoket服务器

可以使用http://www.websocket-test.com/测试自己的服务器,或是用一个简单的客户端(html,java都有很多这种简单的客户端)来测试服务器的链接情况。

对于想实现的功能,可以重写其中的对应的方法即可。

另外说下可能发生的错误(面向初学者)

websocket服务器对于本机客户端能连上,外网的无法连接。

可能的原因:

1.IP地址填写错误

InetAddress addr = InetAddress.getLocalHost();
      System.out.println("Local HostAddress: 
      "+addr.getHostAddress());

java的获取IP地址方法可能获取到的是192.168的本地IP,需要在cmd中输入ipconfig来查看本机IP。另外 百度到的IP地址是不可靠的!!我之前获取自己的IP一直是百度输入IP,就能查到自己的IP地址。

2.IDEA由于防火墙原因不能联网

这个错误真的很低级,但是就是出现过。我自己写的服务器放别人电脑上,其他人死都连不上服务器,但是本机就能连上,后来发现是他IDEA防火墙设置原因不能连上外网。

3.校园网设置原因

这个看学校的设置,我们学校的校园网如果不是同一个接入点就没办法互相连接。解决方法就是客户端和服务器同时连接手机热点。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要创建一个 WebSocket 服务器,你可以使用 Java 中内置的 javax.websocket API。这个 API 允许你创建 WebSocket 服务器和客户端。 以下是创建 WebSocket 服务器的一些基本步骤: 1. 创建一个类来表示 WebSocket 服务器,这个类应该扩展 javax.websocket.Endpoint 类。 2. 在类中实现 onOpen()、onClose()、onMessage()、onError() 这些方法。这些方法分别在 WebSocket 连接建立、关闭、接收消息和出现错误时被调用。 3. 在类中创建一个 javax.websocket.server.ServerEndpoint 注解,用于指定 WebSocket 服务器的 URL。 4. 使用 javax.websocket.server.ServerEndpointConfig.Configurator 类中的 modifyHandshake() 方法,来修改 WebSocket 握手时的请求和响应。 5. 在 main() 方法中启动 WebSocket 服务器。 下面是一个简单的 WebSocket 服务器示例代码: ``` import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.io.IOException; @ServerEndpoint("/websocket") public class MyWebSocketServer { @OnOpen public void onOpen(Session session) { System.out.println("WebSocket opened: " + session.getId()); } @OnMessage public void onMessage(String message, Session session) { System.out.println("Received message: " + message); try { session.getBasicRemote().sendText("Received your message: " + message); } catch (IOException e) { e.printStackTrace(); } } @OnClose public void onClose(Session session) { System.out.println("WebSocket closed: " + session.getId()); } @OnError public void onError(Throwable error) { System.out.println("WebSocket error: " + error.getMessage()); } } ``` 在上面的代码中,我们定义了一个 WebSocket 服务器,其 URL 是 "/websocket"。在 onOpen() 方法中,我们输出了 WebSocket 连接的 ID。在 onMessage() 方法中,我们输出了接收到的消息,并把它发送回客户端。在 onClose() 方法中,我们输出了 WebSocket 连接关闭的 ID。在 onError() 方法中,我们输出了 WebSocket 错误信息。 要启动 WebSocket 服务器,我们可以使用以下代码: ``` import javax.websocket.server.ServerEndpointConfig; import org.glassfish.tyrus.server.Server; public class Main { public static void main(String[] args) { Server server = new Server("localhost", 8080, "/websocket", MyWebSocketServer.class); try { server.start(); System.out.println("WebSocket server started"); System.in.read(); } catch (Exception e) { e.printStackTrace(); } finally { server.stop(); } } } ``` 在上面的代码中,我们使用了 Tyrus 库提供的 Server 类来启动 WebSocket 服务器,并指定了服务器的 URL、端口号、WebSocket 类和配置类。我们还输出了 WebSocket 服务器已经启动的信息。最后,我们使用 System.in.read() 让程序停留在那里,以保证服务器一直运行。 以上就是使用 Java 创建 WebSocket 服务器的基本步骤。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值