首页 新闻 会员 周边

网络编程里面的几点疑问

0
悬赏园豆:30 [待解决问题]
View Code
1 //类中一些字段
2 private Socket clientSocket;
3 private struct UserSocket
4 {
5 Socket clientSokcet;
6 public Socket ClientSokcet
7 {
8 get { return clientSokcet; }
9 set { clientSokcet = value; }
10 }
11
12 string userName;
13 public string UserName
14 {
15 get { return userName; }
16 set { userName = value; }
17 }
18 }
19 private static List<UserSocket> clientSocketList = new List<UserSocket>();
20
21 //服务器端监听客户端方法
22 protected void ListenerThread()
23 {
24 try
25 {
26 listener = new TcpListener(serverip, port);
27 listener.Start();
28 while (true)
29 {
30 clientSocket = listener.AcceptSocket();
31 NetworkStream stream = new NetworkStream(clientSocket, false);
32 Thread dealDataThread = new Thread(new ParameterizedThreadStart((new Contaction()).DealStreamData)); //这个开销挺大的。
33 dealDataThread.Start(stream);
34 }
35 }
36 catch
37 { }
38 }
39
40 //处理客户端数据方法
41 public void DealStreamData(Object netStream)
42 {
43 byte[] buffer = new byte[2048];
44 NetworkStream stream = (NetworkStream)netStream;
45 List<byte> target = new List<byte>();
46 if (stream.CanRead)
47 {
48 int numberOfBytesRead = 0;
49 do
50 {
51 numberOfBytesRead = stream.Read(buffer, 0, buffer.Length);
52 for (int i = 0; i < numberOfBytesRead; i++)
53 {
54 target.Add(buffer[i]);
55 }
56 }
57 while (stream.DataAvailable);
58 DataTrans.dataSend dataSendItem = DataTrans.ByteToData(target.ToArray());
59 new CommonData().AddIPThroughUserName(dataSendItem.UserName, dataSendItem.IP);
60 if (dataSendItem.Info.Cnt != "")
61 {
62 lock (dataToClient)
63 {
64 dataToClient.Add(dataSendItem);
65 }
66 }
67 else
68 {
69 if (clientSocket != null)
70 {
71 UserSocket userSocket = new UserSocket();
72 userSocket.UserName = dataSendItem.Info.UserID;
73 userSocket.ClientSokcet = this.clientSocket;
74 }
75 }
76 stream.Close();
77 }
78 }

 上面是代码部分。说明一下:在DealStreamData方法中我想将每个客户端的连接保存到clientSocketList中。大家注意到了每个连接都处理成一个UserSocket(已userName来标识Socket到底是个哪个客户端的连接),然后加到list中。这样的意图是想当服务器收到某一个客户端的信息包(自己定义的)后,将这个信息包发送给指定客户端(通过userName查找其对应的Socket)。  我的问题就是

在clientSocket = listener.AcceptSocket(),并且完成线程新建后,服务器肯定会去转向处理下一个客户端请求,而我在DealStreamData方法中的

View Code
1 UserSocket userSocket = new UserSocket();
2 userSocket.UserName = dataSendItem.Info.UserID;
3 userSocket.ClientSokcet = this.clientSocket;

赋值是不是会出现不同步的现象?即是不是会将后续的客户端连接赋给新建线程里的socket。如果是这样的话,我怎么实现我上面的意图???请大家帮忙

问题补充:

还有:当stream.close()后,而socket没有关闭,此时客户端向服务器端发送数据会不会出现问题

繁华fanhua的主页 繁华fanhua | 初学一级 | 园豆:175
提问于:2011-05-18 10:23
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册