1
require('socket.io').listen(3000)
这样就是监视3000端口了,由于我用的免费服务器,没有权限打开其他端口,所以,我还是使用80了,由于80已经被express使用了,所以我只好在express使用的时候传进来了。
var server = http.createServer(app)
var socket = require('./socket/msg')(server)
然后 我在msg.js里是这样写的
var db = require('../db/mysql')
var sio = require('socket.io')
var IO = function(server) {
var io = sio.listen(server)
这样就和谐了,db是创建mysql连接的方法,不在本节内容里,略。
在socket.io里是这样的,首先创建一个io通道的连接,然后监视里面的socket的事件,nodejs是事件驱动嘛。代码如下:
io.on('connection', function(socket) {
console.log('a user connected.')
socket.on('disconnect', function() {
console.log('user disconnected.')
})
})
这时只要有用户连接上,就会进入connection中了,然后它的参数是个socket,如果是公聊,我们可以直接用
1
io.emit('chat message', {})
这种形式了。但我们这里是私聊,所以我们要临时的把这个socket对象保存在全局里,供与你私聊的对象使用找到你的socket,很绕口,其实这里的私聊,不算完全的点对点,它还是经过了服务器的,消息传给服务器,服务器再找到你要传达给的那个人的socket对象,发给他。这就是整个的过程了。这里我使用的是一个类数组对象来存储的.
var users = {},
usocket = {}
socket.on('user join', function(data) {
users[username] = username
usocket[username] = socket
})
由于我这里需要用户名登录,所以我就把用户名作为了唯一的标识,这里用类数组的形式的好处就是我不用循环也能够很快的找到它。再我给A发送私聊时,我会先在这个uscoket里面找到它,然后调用它的emit。
function sendUserMsg(data) {
if (data.to in usocket) {
console.log('================')
console.log('to' + data.to, data)
usocket[data.to].emit('to' + data.to, data)
usocket[data.user].emit('to' + data.user, data)
console.log('================')
}
}
这里我emit了两次的原因是,我发给对方消息的同时,我自己也要收到这个消息,然后把它显示出来,为什么这样?其一,接口统一了,聊天里的内容全是服务器过来的,其二,证明我发送成功了。
然后我在客户端监听时,也用我自己的用户名起了一个to+用户名的事件监听。
socket.on('to' + user, function(data) {
//console.log(data)
formatMsg(data)
})
这样,不管是我发的消息,还是我收到消息,都会进入这个事件了。最后,在用户离开的时候别忘记delete掉这个对象。
socket.on('disconnect', function() {
console.log('disconnect')
if (username) {
counter--
delete users[username]
delete usocket[username]
if (home.name == username) {
homeLeave(username)
}
sendmsg({
type: 0,
msg: "用户<b>" + username + "</b>离开聊天室",
counter: counter,
users: users
})
}
})
加个判断
if (SqlHelper.connection.State == System.Data.ConnectionState.Closed)SqlHelper.connection.Open()
else (SqlHelper.connection.State == System.Data.ConnectionState.Broken)
{
SqlHelper.connection.Close()
SqlHelper.connection.Open()
}
Asp.net中C#使用Socket发送和接收TCP数据的方法。
具体程序代码如下:
using Systemusing System.Collections.Generic
using System.Net
using System.Net.Sockets
using System.Text
namespace ConsoleApplication1
{
public static class SocketTest
{
private static Encoding encode = Encoding.Default
/// <summary>
/// 监听请求
/// </summary>
/// <param name="port"></param>
public static void Listen(int port)
{
Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
listenSocket.Bind(new IPEndPoint(IPAddress.Any, port))
listenSocket.Listen(100)
Console.WriteLine("Listen " + port + " ...")
while (true)
{
Socket acceptSocket = listenSocket.Accept()
string receiveData = Receive(acceptSocket, 5000) //5 seconds timeout.
Console.WriteLine("Receive:" + receiveData)
acceptSocket.Send(encode.GetBytes("ok"))
DestroySocket(acceptSocket) //import
}
}
/// <summary>
/// 发送数据
/// </summary>
/// <param name="host"></param>
/// <param name="port"></param>
/// <param name="data"></param>
/// <returns></returns>
public static string Send(string host, int port, string data)
{
string result = string.Empty
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
clientSocket.Connect(host, port)
clientSocket.Send(encode.GetBytes(data))
Console.WriteLine("Send:" + data)
result = Receive(clientSocket, 5000 * 2) //5*2 seconds timeout.
Console.WriteLine("Receive:" + result)
DestroySocket(clientSocket)
return result
}
/// <summary>
/// 接收数据
/// </summary>
/// <param name="socket"></param>
/// <param name="timeout"></param>
/// <returns></returns>
private static string Receive(Socket socket, int timeout)
{
string result = string.Empty
socket.ReceiveTimeout = timeout
List<byte> data = new List<byte>()
byte[] buffer = new byte[1024]
int length = 0
try
{
while ((length = socket.Receive(buffer)) > 0)
{
for (int j = 0 j < length j++)
{
data.Add(buffer[j])
}
if (length < buffer.Length)
{
break
}
}
}
catch { }
if (data.Count > 0)
{
result = encode.GetString(data.ToArray(), 0, data.Count)
}
return result
}
/// <summary>
/// 销毁Socket对象
/// </summary>
/// <param name="socket"></param>
private static void DestroySocket(Socket socket)
{
if (socket.Connected)
{
socket.Shutdown(SocketShutdown.Both)
}
socket.Close()
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)