java socket 新手提问

我聊天室发出去的消息到不了对方那里,反而显示在自己的聊天界面上,该写的代码都写了,找不出问题

https://gitee.com/00fly/spring-websocket 供参考!

我已经对照过很多代码了,发现改写的都有写,我也是大致照着教程写的

监听ip端口别搞错就没问题。仔细查查

消息是可以发到服务器的,查好久了,不知道哪里的逻辑有问题

那说明服务没问题,两个socket客户端是不是哪里搞反了。

 socket看下双方是不是在同一个频道里,调用的同一个口子,如果不是同一个频道的话信息是同步不到的

同一个频道?

回复上一条:我是每运行一次类,就开启一个客户端,然后聊天窗调动该客户端的socket,我找不出问题。

我这边项目用到的websocket的代码,你可以参考下


import java.io.IOException;

import java.util.concurrent.CopyOnWriteArraySet;


import javax.websocket.OnClose;

import javax.websocket.OnError;

import javax.websocket.OnMessage;

import javax.websocket.OnOpen;

import javax.websocket.Session;

import javax.websocket.server.PathParam;

import javax.websocket.server.ServerEndpoint;

import org.apache.log4j.Logger;

import org.springframework.stereotype.Component;


@ServerEndpoint(value = "/websocket/{sid}")

@Component

public class WebSocketServer {


static Logger logger = Logger.getLogger(WebSocketServer.class);

// 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。

private static int onlineCount = 0;

// concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。

private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();


// 与某个客户端的连接会话,需要通过它来给客户端发送数据

private Session session;

private static int timeout = 1000 * 60 * 30;

// 接收sid

private String sid = "";

private int Count;


/**

* 连接建立成功调用的方法

*/

@OnOpen

public void onOpen(Session session, @PathParam("sid") String sid) {

this.session = session;

session.setMaxIdleTimeout(timeout);

webSocketSet.add(this); // 加入set中

addOnlineCount(); // 在线数加1

this.addCount();

logger.info("有新窗口开始监听:" + sid + ",当前总在线人数为:" + getOnlineCount());

this.sid = sid;

try {

sendInfo("房间号:" + sid , sid);

} catch (IOException e) {

logger.error("websocket IO异常");

}

}


/**

* 连接关闭调用的方法

*/

@OnClose

public void onClose() {

webSocketSet.remove(this); // 从set中删除

subOnlineCount(); // 在线数减1

logger.info("有一连接关闭!当前在线人数为" + getOnlineCount());

}


/**

* 收到客户端消息后调用的方法

*

* @param message 客户端发送过来的消息

*/

@OnMessage

public void onMessage(String message, Session session) {

logger.info("收到来自窗口" + sid + "的信息:" + message);

// 群发消息

for (WebSocketServer item : webSocketSet) {

try {

item.sendInfo(message, sid);

// item.sendMessage(message);

} catch (IOException e) {

e.printStackTrace();

}

}

}


/**

*

* @param session

* @param error

*/

@OnError

public void onError(Session session, Throwable error) {

logger.error("发生错误");

error.printStackTrace();

}


/**

* 实现服务器主动推送

*/

public void sendMessage(String message) throws IOException {

this.session.getBasicRemote().sendText(message);

}


/**

* 群发自定义消息

*/

public void sendInfo(String message, @PathParam("sid") String sid) throws IOException {

logger.info("推送消息到窗口" + sid + ",推送内容:" + message);

for (WebSocketServer item : webSocketSet) {

try {

// 这里可以设定只推送给这个sid的,为null则全部推送

if (sid == null) {

item.sendMessage(message);

} else if (item.sid.equals(sid)) {

item.sendMessage(message);

}

} catch (IOException e) {

continue;

}

}

}


public static synchronized int getOnlineCount() {

return onlineCount;

}


public static synchronized void addOnlineCount() {

WebSocketServer.onlineCount++;

}


public static synchronized void subOnlineCount() {

WebSocketServer.onlineCount--;

}


public synchronized int getCount() {

return Count;

}


public synchronized void addCount() {

this.Count++;

}


public synchronized void subCount() {

this.Count--;

}

}

你可以重点看下建立连接和消息推送的方法

你应该有服务端才行,你只有客户端,没有服务端消息不会同步的

我有服务端的,消息是可以发到服务端的,我晚上再看看消息推送那块吧

看了上面代码,还是找不出问题,愿意帮我看源码的请加q1154634055