.net 网络编程的一些疑问

dingyaguang117 2010-10-03 02:43:42
小弟最近在为这学期的实验做准备~
可怜被.net的网络编程困扰了,有一些东西搞不明白,希望各位大侠帮帮俺~

前言:我要做的是一个C/S聊天室,所以要客户端有人发言,都要提交上去,然后服务器处理应答,服务器接收到发言要通知每个客户端啥的。

过程中遇到以下疑问:

1.客户端和服务器端,都是随机的(有需要的时候)向对方发消息。这种情况下,是不是要客户端和服务器端,分别建立连接,和监听呢?比如:客户端监听端口1111来袭服务器的消息,服务器监听2222来自客户端的消息.




2.

while (true)
{
TcpClient client = tcpListener.AcceptTcpClient();
NetworkStream netstream = client.GetStream();
StreamReader stream = new StreamReader(netstream);

string msg = stream.ReadLine();
this.listBox1.Items.Add(msg);
stream.Close();
netstream.Close();
client.Close();
}


是不是每次客户端发来一个消息,都要建立一次tcpclient连接?也就是每个连接只能接收一句话?


3.StreamReader stream = new StreamReader(netstream);
这样产生的stream流是不是和netstream是同步的啊~~netstream收到了新的,stream也会立即更新么?

4.我看不少教程都在 string msg = stream.ReadLine();之后用netstream产生一个StreamWriter然后立即写入一个反馈信息,我有点奇怪.这个流可以既读又写么?读和写是两个独立的数据存储么?

谢谢大家乐
...全文
101 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
萨拉嘿 2010-10-03
  • 打赏
  • 举报
回复
1.看你想以何种方式通信了,TCP的话双方建立连接后只要不断开就能一直通信,只需要服务器进行监听,客户端连接,如果是UDP双方都需要监听。
2.不是,这里面的client 就相当于一个连接,每个客户端收发信息都是基于这个client.
3、4. 没这么写过。。。不是很清楚
萨拉嘿 2010-10-03
  • 打赏
  • 举报
回复
信息的读取需要新建立线程进行,不然你的程序会阻塞卡在那里。
对于服务器端,跟每个客户端的信息的接受需要开启一个线程,单这个线程的开启是在和客户端建立连接(AcceptTcpClient)后,而不是每次有请求时
dingyaguang117 2010-10-03
  • 打赏
  • 举报
回复

只要注释部分 一运行就有问题,会阻塞掉,注释掉就没问题

客户端:
try
{

client.Connect("127.0.0.1", 2222);
NetworkStream netstream = client.GetStream();
StreamWriter stream_w = new StreamWriter(netstream);
//StreamReader stream_r = new StreamReader(netstream);
stream_w.Write("hello");//向服务器发送消息

//string s = stream_r.ReadLine();//读取服务器反馈
//this.listBox1.Items.Add(s);
// stream_r.Close();

stream_w.Close();
netstream.Close();
client.Close();
}
复制代码




服务器端:

tcpListener = new TcpListener( 2222);
tcpListener.Start();
while (true)
{
TcpClient client = tcpListener.AcceptTcpClient();
NetworkStream netstream = client.GetStream();
StreamReader stream_r = new StreamReader(netstream);
// StreamWriter stream_w = new StreamWriter(netstream);
string msg = stream_r.ReadLine();//读取客户端消息
this.listBox1.Items.Add(msg);
//stream_w.Write("return val");//反馈消息
//stream_w.Close();
stream_r.Close();
netstream.Close();
client.Close();
}
复制代码
dingyaguang117 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 oonukeoo 的回复:]

1.看你想以何种方式通信了,TCP的话双方建立连接后只要不断开就能一直通信,只需要服务器进行监听,客户端连接,如果是UDP双方都需要监听。
2.不是,这里面的client 就相当于一个连接,每个客户端收发信息都是基于这个client.
3、4. 没这么写过。。。不是很清楚
[/Quote]

前面几个问题都解决了 现在遇到的问题是:

怎么在一个连接上 随机的互相发送消息?
例如:客户端有个查看资料的请求,发出后等待回应。应该是同步阻塞在那等待回应,还是不管回应不回应,继续发送下一个请求?
同样服务器有时也要主动向 客户端发送请求,显示某个系统通知啥的。


这种情况是不是要,建立非同步的机制呢?




我的想法是:
客户端:每次有请求直接写入 网络流,然后一直有一个线程在不断地读,至于读到的是哪次请求的回馈,根据回馈信息判断。
服务器端:每次有请求,直接新建一个线程去处理,结果回馈写到网络流.


不知道是否可行?
dingyaguang117 2010-10-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 oonukeoo 的回复:]

1.看你想以何种方式通信了,TCP的话双方建立连接后只要不断开就能一直通信,只需要服务器进行监听,客户端连接,如果是UDP双方都需要监听。
2.不是,这里面的client 就相当于一个连接,每个客户端收发信息都是基于这个client.
3、4. 没这么写过。。。不是很清楚
[/Quote]

谢谢还有几个问题哈~
监听的时候,如果有连接请求就会被接受..

是不是一般的做法是,另开一个线程去,处理这个连接?

TcpClient client = tcpListener.AcceptTcpClient();
但是以后,我怎么才能知道 这个连接 又来了新的消息呢?
while(true)循环么读流?



111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧