码迷,mamicode.com
首页 > 其他好文 > 详细

Socket服务器学习(一)

时间:2014-07-07 19:20:24      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   color   width   数据   

目标:实现一个简单的Socket聊天服务器

服务端环境:NodeJS

客户端:Mac终端+NodeJS,Unity

 

一、服务器程序

var net = require(‘net‘);
var timeout = 60000;
var mess="";
var clientlist=[];
//超时
var listenPort = 1234;
//监听端口
function sendall(socket,message){
        for(var i=0;i<clientlist.length;i++){
                if(clientlist[i].writable){
                        if(clientlist[i]!=socket)
                                clientlist[i].write(socket.remotePort+‘:‘+message);
                }else{
                        clientlist[i].destroy();
                }
        }
}

var server = net.createServer(function(socket) {
        clientlist.push(socket);
// 我们获得一个连接 - 该连接自动关联一个socket对象
        mess=socket.remoteAddress + ‘:‘ + socket.remotePort;
        console.log(‘start连接>> ‘ + mess);
//      socket.setEncoding(‘binary‘);
        //超时事件
        socket.setTimeout(timeout, function() {
                console.log(‘连接超时‘);
                socket.end();
        });
        //接收到数据
        socket.on(‘data‘, function(data) {
                sendall(socket,data);
                console.log(data.toString(‘utf8‘));
        });
        //数据错误事件
        socket.on(‘error‘, function(exception) {
                console.log(‘socket error:‘ + exception);
                socket.end();
        });
        //客户端关闭事件
        socket.on(‘end‘, function(data) {
                console.log(‘  end连接>> ‘ + mess);
        });
        socket.on(‘close‘, function(data) {
                console.log(‘close连接>> ‘ + mess);
                console.log(‘**********************************‘);
        });
}).listen(listenPort);
//服务器监听事件
server.on(‘listening‘, function() {
        console.log("server listening:" + server.address().port);
});
//服务器错误事件
server.on("error", function(exception) {
        console.log("server error:" + exception);
});

 

二、Mac终端 客户端程序

var net = require(‘net‘);
var host = process.argv[2];
var port =Number(process.argv[3]);

var socket = net.connect(port,host);
var inbuffer;
socket.on(‘connect‘,function(){
process.stdin.resume();
process.stdin.setEncoding(‘utf8‘);
process.stdin.on(‘data‘, function (chunk) {  
      socket.write(chunk);  
});  


});
//socket.setEncoding(‘utf8‘);
socket.on(‘data‘,function(data){
    console.log(data.toString(‘utf8‘));
});
socket.on(‘end‘,function(){
    process.stdin.pause();
});

 

三、Unity客户端程序C#脚本

using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary; 

public class TestSocket : MonoBehaviour {

    string say="";

    string mes="";

    string rec="";

    Socket clientSocket;

    public void ConncetServer(){
        IPAddress ip = IPAddress.Parse ("127.0.0.1");
        IPEndPoint endpoint = new IPEndPoint (ip, 1234);
        if (clientSocket!=null&&clientSocket.Connected) {
                        Debug.Log ("connected already");    
                        mes="connected already";
                } else {

            if(clientSocket!=null){
                IAsyncResult result=clientSocket.BeginConnect(endpoint,new AsyncCallback(connectCallback),clientSocket);
                
                bool success=result.AsyncWaitHandle.WaitOne(5000,true);
                
                if(!success){
                    clientSocket.Close ();
                    Debug.Log("connection timed out");
                    mes="connection timed out";
                }else{
                    Thread thread=new Thread(new ThreadStart(receiveSocket));
                    thread.IsBackground=true;
                    thread.Start();
                }
            }

        }
    }

    void Send(){

        if (clientSocket.Connected) {
            try{
                byte[] sendmsg = Encoding.UTF8.GetBytes (say);
                
                clientSocket.Send (sendmsg);

                rec+="me:  "+say+"\n";
            }    catch (Exception e){
                Debug.Log("exception happend during sending message :  "+e);
            }        

                } else {
            Debug.Log("need connection");
            mes="need connection";
        }

    }

    void CloseSocket(){
        clientSocket.Close ();
        mes = "closed.";
    }

    void connectCallback(IAsyncResult connect){
        Debug.Log ("connection started");
    }

    void receiveSocket(){
        while (clientSocket.Connected) {
            try{
                byte[] bytes=new byte[4096];
                clientSocket.Receive(bytes);
                rec+=Encoding.UTF8.GetString(bytes)+"\n";


                                     }    catch (Exception e){
                    mes="exception: "+e;
                    clientSocket.Close();
                    Debug.Log("exception;  "+e);
                }
        }
    }

    // Use this for initialization
    void Start () {
        clientSocket = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    }
    
    // Update is called once per frame
    void Update () {
    
    }

    void OnGUI(){
        say = GUI.TextField (new Rect(0.0f,Screen.height*0.5f+5.0f,Screen.width-105.0f,50.0f),say);
        if(GUI.Button(new Rect(0.0f,Screen.height * 0.5f+60.0f,100.0f,50.0f),"connect"))
            ConncetServer();
        if (GUI.Button (new Rect (Screen.width - 100.0f, Screen.height * 0.5f + 5.0f, 100.0f, 50.0f), "send")) {
            Send ();
            say="";
        }
        if(GUI.Button(new Rect(105.0f,Screen.height * 0.5f+60.0f,100.0f,50.0f),"close"))
            CloseSocket();
        GUI.Label (new Rect (220.0f, Screen.height * 0.5f + 170.0f, 100.0f, 25.0f), mes);
        GUI.TextArea (new Rect(0.0f,0.0f,Screen.width,Screen.height*0.5f),rec);
    }
}

 

Socket服务器学习(一),布布扣,bubuko.com

Socket服务器学习(一)

标签:des   style   blog   color   width   数据   

原文地址:http://www.cnblogs.com/amazonove/p/3813442.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!