Socket服务器学习(一)

目标:实现一个简单的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服务器学习(一)

时间: 2024-11-05 06:11:15

Socket服务器学习(一)的相关文章

Android Socket编程学习笔记

通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务. 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定. 在java中,Socke

Socket.IO学习日志

说到学习Socket.IO,就不得不先说说WebSocket. WebSocket可以说是一种协议,它建立在无状态的HTTP协议基础之上.从字面的意思来理解,就是将TCP的Socket(套接字)应用在了HTTP中,从而使通信双方建立起一个保持在活动状态连接通道,并且是一个全双工(两个设备之间同时进行双向通信). 与Ajax不同,它并非面向请求和响应,而是可以直接通过send方法进行消息传递.WebSocket可以说是Socket.IO的一个子集,Socket.IO的底层实现其实有5种方式,Web

Socket编程学习之道:揭开Socket编程的面纱

对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP? 2.         Socket在哪里呢? 3.         Socket是什么呢? 4.         你会使用它们吗? 什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为

如何用PHP实现Socket服务器

想要构建聊天应用,或者甚至是游戏吗?那么,socket服务器将成为你迈出的第一步.一旦你了解了创建服务器的基本功能,那么后续的优化步骤就会变得同样简单. socket服务器的工作方式是这样的,不间断地运行以等待客户端的连接.一旦客户端连接上了,服务器就会将它添加到客户名单中,然后开始等待来自客户端的消息. 不要走开,下面是完整的源代码: // Set time limit to indefinite execution set_time_limit (0); // Set the ip and

java 利用NIO建立Socket服务器

Socket的Channel在Selector上注册某一种动作,Selector通过select操作,监视所有在该Selector注册过的Channel的对应的动作,如果监测到某一对应的动作,则返回selectedKeys,自己手动取到各个SelectionKey进行相应的处理.当然NIO不仅可以接受Socket的Channel,还有文件操作等其他IO操作. AD: WOT2015 互联网运维与开发者大会 热销抢票 传统的Java 的IO,利用Socket建立服务器,接收客户端连接,一般都是为每

游戏服务器学习笔记

linux命令行环境 linux常用命令用法,软件的安装,vim的用法,在特定的linux版本安装了epel源,学会用SSH配置公钥.私钥,通过SSH来远程登录linux主机,如在windows下用putty来远程登录linux主机. 版本控制工具 svn/git,git可以和gitlab配合使用. C/C++语言 python语言 学习python编程规范(PEP8),了解python的相关模块用法,如:django,twisted,yaml,json,pymongo,markdown,pyl

JavaWeb学习总结(三)——Tomcat服务器学习和使用(二) 包含https 非对称秘钥 NB

JavaWeb学习总结(三)--Tomcat服务器学习和使用(二) 一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下: 范例:将JavaWebDemoProject这个JavaWeb应用打包成war包 执行完之后,就可以得到一个文件,平时开发完JavaWeb应用后,一般都会将JavaWeb应用打包成一个war包,然后将这个war包放到Tomcat服务器的webapps目录下,当Tomcat服务器启动时,就会自动

Socket异步通信学习三

接下来是客户端部分,采用同步接收模式,在SocketClient项目中新建了一个SynServer类,用于存放socket服务器代码,和AsynServer类似,主要有4个方法: 有一个全局socket,下面四个方法中都用到. Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 类框架如下: 1.构造方法 public SynClient(IPEndPoint s

C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)

原创性申明 本文作者:小竹zz  博客地址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879转载请注明出处 引言 我一直在探寻一个高性能的Socket客户端代码.以前,我使用Socket类写了一些基于传统异步编程模型的代码(BeginSend.BeginReceive,等等)也看过很多博客的知识,在linux中有poll和epoll来实现,在windows下面 微软MSDN中也提供了SocketAsyncEventArgs这个类来