首页 新闻 会员 周边 捐助

c/s数据传输问题求助

0
悬赏园豆:5 [待解决问题]

一项目,客户端和服务端是两个单独的程序。 求如下简要示例:

 

客户端向服务器端发送用户名、密码。服务器端检测是否正确,并向客户端返回消息。

 

private void button1_Click(object sender, EventArgs e)
        {
            int port = 2000;
            string host = "127.0.0.1";
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IPv4);
            IPAddress ip=IPAddress.Parse(host);
            IPEndPoint ipe = new IPEndPoint(ip, port);

            byte[] bytes = Encoding.ASCII.GetBytes(this.textBox1.Text.Trim() + "&" + this.textBox2.Text.Trim());
            socket.Connect(ipe);
            socket.Send(bytes, bytes.Length, 0);
        }

如上代码,客户端只是做到了向服务端发送用户名和密码本身,服务端即使接收到了该数据,也不知道该如何处理。

求教大家,客户端如何调用服务端某个具体方法。一定不考虑wcf!

快乐鸟的主页 快乐鸟 | 初学一级 | 园豆:7
提问于:2013-09-01 02:10
< >
分享
所有回答(3)
0

服务端监听本机的2000号端口,等待连接呗。

幻天芒 | 园豆:37205 (高人七级) | 2013-09-01 02:28

服务端监听2000的端口号之后只能收到用户名和密码这个数据。服务端怎么知道客户端想干什么?是验证用户名密码对不对还是想删除这个用户或是其他?

支持(0) 反对(0) 快乐鸟 | 园豆:7 (初学一级) | 2013-09-01 02:41

@快乐鸟: 你再多传一个参数不就得了。

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2013-09-01 02:56

@幻天芒: 亲,你没开玩笑吧?怎么多传一个参数?socket.Send()这个方法的所有重载中,就没有能指定要调用服务端某个具体方法的参数。

支持(0) 反对(0) 快乐鸟 | 园豆:7 (初学一级) | 2013-09-01 03:02

@快乐鸟: 一般客户端不让调用服务器方法的。可能有,但一定很复杂。一般这种通信问题,都要设定协议,就是上面说的,加个参数,也是加到byte[]里面。

支持(0) 反对(0) angelshelter | 园豆:9914 (大侠五级) | 2013-09-01 08:17

@angelshelter: 

  byte[] bytes = Encoding.ASCII.GetBytes(this.textBox1.Text.Trim() + "&" + this.textBox2.Text.Trim());

这里不就可以多传一个吗???

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2013-09-01 23:40

@幻天芒: 我传递的是字符串啊。难道接收端要这么判断

static void Main(string[] args)
        {
            int port = 2000;
            string host = "127.0.0.1";
 
            //创建终结点
            IPAddress ip = IPAddress.Parse(host);
            IPEndPoint ipe = new IPEndPoint(ip,port); 
 
            //创建Socket并开始监听
 
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //创建一个Socket对象,如果用UDP协议,则要用SocketTyype.Dgram类型的套接字
            s.Bind(ipe);    //绑定EndPoint对象(2000端口和ip地址)
            s.Listen(0);    //开始监听
 
            Console.WriteLine("等待客户端连接");
 
            //接受到Client连接,为此连接建立新的Socket,并接受消息
            Socket temp = s.Accept();   //为新建立的连接创建新的Socket
            Console.WriteLine("建立连接");
            string recvStr = "";
            byte[] recvBytes = new byte[1024];
            int bytes;
            bytes = temp.Receive(recvBytes,recvBytes.Length,0); //从客户端接受消息
            recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
 
            if(recvStr.Splt(',')[0] == "Check")
           {
                 //检测用户名密码。recvStr.Splt(',')[0] 为约定的协议(暗号)如果值为“Check”,则执行检测用户名密码工功能。
            }
             //无数个if判断。或者写成swich循环
        }
    }
支持(0) 反对(0) 快乐鸟 | 园豆:7 (初学一级) | 2013-09-02 10:23

@快乐鸟: 有何不可???

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2013-09-02 12:52
0

先定义协议,如登陆[ESC]L[ESC]UsrName[ESC]Password[ESC][nil],查询好友列表[ESC]F[ESC]UseID[ESC][nil],这样的话,发第一个就可以确认是否登,发第二个就可以获取好友列表了。

sinhbv | 园豆:2579 (老鸟四级) | 2013-09-01 13:25
0

如果你不想用WCF的话 就用Shuttler.net吧  
调用很简单  开源中国可以下载到源码
其实最简单的数据交互方式为  JSON和XML
打个简单的比方
你要登陆 就把你登陆的实体序列化成JSON传给服务端  服务器解析JSON为对象 在进行业务操作
并且把结果返回给客户端

落幕残情 | 园豆:34 (初学一级) | 2013-09-01 22:10

能给个简单的示例吗?

支持(0) 反对(0) 快乐鸟 | 园豆:7 (初学一级) | 2013-09-02 09:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册