| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2078 人关注过本帖
标题:[求助]Sock还是NetWorkStream验证?
只看楼主 加入收藏
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
收藏
得分:0 
刚才出的错误是在服务器端发生的。
它不能同时进行
socketForClinet = tcpListener.AcceptSocket()怎么办?

2007-02-01 15:08
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
收藏
得分:0 

服务器不能同时对同一端口进行两个Listen!
哎就这句话出错了啊!
socketForClinet = tcpListener.AcceptSocket()


2007-02-01 15:12
swc
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:394
专家分:83
注 册:2006-4-7
收藏
得分:0 
以下是引用jockey在2007-2-1 15:06:12的发言:
谢谢两位!
swc:是这样的,因为客户端发送密文Stream时,首先要连接服务器成功后,GetStream后才能Write密文发给服务器。

服务器验证密文后,发送Stream给客户端。这个时候客户端根据收到的Stream再进行别的操作(接收数据流),也要用到GetStream啊,也就是第一次的GetStream是用来传送密文的Stream。第二次Stream是用来收取服务器发送的Stream的。
两个Stream是不一样的!


客户端与服务器连接成功后就等于两端建立了一个联系的通道.stream可以说就是这样的一个通道,不是你所说的"发送Stream给客户端".比如你跟我通电话.我拨你的电话,你接了(也就相当于我连接你的电话成功),之后我们两个人就可以沟通了.我把我的名字告诉你(相当于发密文给你确认身份),确认后你才说话.也就是说你要跟我说话不需要再打电话给我,用原来的连接就可以了.


实践、学习、再实践、再学习......
2007-02-01 15:57
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
收藏
得分:0 

老大:你还是帮我看看代码吧:
private TcpListener tcpListener=new TcpListener(1234);

private void Listen()
{
tcpListener.Start();
socketForClinet = tcpListener.AcceptSocket();
try
{
if (socketForClinet.Connected)
{
while (true)
{
sl = true;
networkStream = new NetworkStream(socketForClinet);
streamReader = new StreamReader(networkStream);
string ss=streamReader.ReadLine();
//验证密文
if (ss !="888")

{
socketForClinet.Close();
return;
}

socketForClinet.Send(ms.GetBuffer());//合法用户可以传送数据了
//关闭连接
socketForClinet.Close();
tcpListener.Stop();
//继续传下一个文件:

Thread SecThread = new Thread(new ThreadStart(Listen));
SecThread.IsBackground = true;
SecThread.Start();
}
}
}
catch(Exception ey)
{
MessageBox.Show(ey.ToString());
}

}


2007-02-01 16:49
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
收藏
得分:0 
现在的问题是,第一次合法用户连接好用。但如果第一个是非法用户(密码不同),则后面的连接就无效了!
也就是这个地方:
if (ss !="888")
{
socketForClinet.Close();
return;//它不能继续监听了!!!
}
如果在retrun前面加上代码:
Thread SecThread = new Thread(new ThreadStart(Listen));
SecThread.IsBackground = true;
SecThread.Start();
那就出错了!

2007-02-01 16:55
swc
Rank: 3Rank: 3
等 级:论坛游民
威 望:6
帖 子:394
专家分:83
注 册:2006-4-7
收藏
得分:0 

监听到不合法的用户后,你没有停止监听。那么在你开始新线程时就重复开启监听了。

PS:你这样子的线程起到了什么作用?我觉得有问题,虽然不敢肯定。我以前都是直接在线程里面循环等待接收客户端的。


实践、学习、再实践、再学习......
2007-02-01 17:35
jockey
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:977
专家分:52
注 册:2005-12-4
收藏
得分:0 
老大!
其实我也不想这样用线程的,但是我现在需要连接成功后,不断发送数据流给客户端,我试过,如果每发送一次不断开重新连接发送的话是不行的。所以我只好采用了上面的方法,发送一个断开一次,由连接一次再发一次....

2007-02-01 20:24
快速回复:[求助]Sock还是NetWorkStream验证?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015013 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved