如何正确地将推文作为JSON发送到socket.io?

时间:2012-08-09 17:38:24

标签: java regex twitter socket.io

我正在使用socket.io-java-client向我的node.js服务器发送我正在侦听的推文的JSON对象。一段时间后,套接字断开连接,我收到此错误:

io.socket.SocketIOException: 1+0
at io.socket.IOConnection.transportMessage(IOConnection.java:725)
at io.socket.WebsocketTransport.onMessage(WebsocketTransport.java:117)
at de.roderick.weberknecht.WebSocketReceiver.run(WebSocketReceiver.java:57)
Aug 9, 2012 10:05:45 AM io.socket.IOConnection cleanup
INFO: Cleanup

这个问题似乎是由某些有问题字符的推文引起的。我的程序试图发送JSON:

Aug 9, 2012 10:05:43 AM io.socket.IOConnection sendPlain
INFO: > 5:::{"args":[{"message":"#TBT #WatchTheThrone #Yeezy #JayZ #LA One of the most epic concerts of my life. ? http://t.co/6WVaZgIM","user":"ElleBxo"}],"name":"p5tweet"}
Aug 9, 2012 10:05:45 AM io.socket.IOConnection sendPlain

VS。 Twitter上的实际推文:“#TBT #WatchTheThrone #Yeezy #JayZ #LA我生命中最具史诗般的音乐会之一。http://instagr.am/p/OHXPQxxUe7/https://twitter.com/ElleBxo/status/233610010066821121

似乎有一种奇怪的差异,我的JSON在Instagram链接前看到“?”,在Twitter上只是“”。下面是我有问题的代码。我尝试对字符串执行replaceAll(),但它不保证抛出和断开我的套接字的错误。我也看到其他角色导致这个错误,所以我不确定它们是什么。

Map<String,String> mp=new HashMap<String, String>();
Status tweet = (Status)queue.get(0);
String safeTweet = tweet.text().replaceAll(" ? ", " ");
mp.put("user",tweet.user().screenName());
mp.put("message",safeTweet);
JSONObject tweetJSON = new JSONObject(mp);
socket.emit("p5tweet", tweetJSON);

如何正确转义推文字符串以防止这种情况发生?谢谢!! :)

编辑:打破连接的另一条推文。看起来链接通常会导致它:

 {"args":[{"message":"RT @Olympics: Congrats to the first woman ever to win an Olympic #Boxing gold medal - Nicola Adams of Team GBR #olympics http://t.co/Jab ...","user":"GlockQueen31"}],"name":"p5tweet"}
在Twitter上

: “祝贺有史以来第一位获得奥运会#Boxing金牌的女性 - GBR团队的Nicola Adams #olympics pic.twitter.com/JabAjIrl”

1 个答案:

答案 0 :(得分:1)

看起来像Tweet Stream中的错误。第242行

https://github.com/mccv/processing-tweet-stream/blob/master/src/main/scala/com/twitter/processing/TweetStream.scala

reader = new BufferedReader(new InputStreamReader(stream))

这不考虑编码,并使用平台默认值。如果HTTP响应的编码与您的平台匹配,则可以正常,否则会破坏非ASCII字符。