socket编程中服务器端不能接收多个客户端发信

baishengjie 2009-11-18 10:08:36
问题如题,要是单一客户端可以收到信息,但多个的话就不能收到信息,请大家帮忙看看,代码不完善的地方指点指点。本来服务器还要连接一个接收客户端的,那个就不贴出来了,这样也可以运行。

服务器端

class Server
{
#region 定义初始化全局变量

int port = 81;

IPAddress ip = IPAddress.Parse("127.0.0.1");

TcpListener listener;

TcpListener sendListener;

ArrayList clients;

ArrayList sendClients;

Socket socket;

Socket sendSocket;

int flag = 0;

int sendFlag = 0;

byte[] buffer;

int rec;

string[] messageStr = new string[500];

Hashtable socketMessage = new Hashtable();

#endregion

public Server()
{
Thread receiveThread = new Thread(new ThreadStart(receive));
Thread sendThread = new Thread(new ThreadStart(send));
receiveThread.Start();
sendThread.Start();

}


//监听客户端口
public void receive()
{
clients = new ArrayList();

try
{
listener = new TcpListener(ip, port);

listener.Start();

Console.WriteLine("Server start listenning : ");

while (true)
{

socket = listener.AcceptSocket();

Console.WriteLine("port[{0}]已连接" , this.getPort(socket));

if (!clients.Contains(socket))
{
clients.Add(socket);

Thread listenThread = new Thread(new ThreadStart(listen));

listenThread.Start();
}
}
}
catch (Exception e)
{
Console.WriteLine("无客户端可连接");
return;
}

}


public void listen()
{
int CurrentSocketNo = flag;

Console.WriteLine("*****************Thread{0} is running*******************",CurrentSocketNo);

flag++;

//用死循环控制监听
while (true)
{
try
{
messageStr[CurrentSocketNo] = "";

Socket clientSocket = (Socket)clients[CurrentSocketNo];

buffer = new byte[256];

int rec = clientSocket.Receive(buffer);

messageStr[CurrentSocketNo] = Encoding.ASCII.GetString(buffer);

Console.WriteLine("*******************************New message****************************** " + CurrentSocketNo);

if (rec < messageStr[CurrentSocketNo].Length)
{
messageStr[CurrentSocketNo] = messageStr[CurrentSocketNo].Substring(0, rec);
}

Console.WriteLine("No.{0} Message : {1}",CurrentSocketNo , messageStr[CurrentSocketNo]);

if (sendClients != null && sendClients.Count != 0)
{
Thread sendThread = new Thread(new ParameterizedThreadStart(send_listen));

sendThread.Start(messageStr[CurrentSocketNo]);
}

}
catch (Exception e)
{

//clients = this.DeleteClosedSocket(clients);

flag--;

if (clients.Count == 0 || clients == null)
{
Console.WriteLine("无客户端连接,等待连接");
}

return;
}
}
}

//监听收信客户端
public void send()
{
sendClients = new ArrayList();

try
{

sendListener = new TcpListener(ip, 91);

sendListener.Start();

Console.WriteLine("Server is listening Send_Port...");

while (true)
{

sendSocket = sendListener.AcceptSocket();

Console.WriteLine("port : " + this.getPort(sendSocket));

if (!sendClients.Contains(sendSocket))
{
sendClients.Add(sendSocket);

}

sendClients = this.DeleteClosedSocket(sendClients);

foreach (Socket s in sendClients)
{
Console.WriteLine(this.getPort(s));
}
}

}
catch (Exception e)
{
Console.WriteLine(e.ToString());

sendClients = this.DeleteClosedSocket(sendClients);
}
}


public void send_listen(object obj)
{

string sendMessage = obj as string;

if (sendClients != null && sendClients.Count != 0)
{
//用循环控制向接收客户端发送信息
for (int i = 0; i < sendClients.Count; i++)
{
//向接收客户端发送数据代码
Console.WriteLine("正在向接收客户端发送信息...[{0}]" ,i);

try
{
Socket clientSocket = (Socket)sendClients[i];

IPEndPoint clientip = (IPEndPoint)clientSocket.RemoteEndPoint;

buffer = Encoding.ASCII.GetBytes(sendMessage.ToCharArray());

clientSocket.Send(buffer, buffer.Length, SocketFlags.None);

}
catch (Exception e)
{
return;
}
}
}
}


#region Get IP by socket
public string getIp(Socket socket)
{
IPEndPoint sip = (IPEndPoint)socket.RemoteEndPoint;
string socketIP = sip.Address.ToString();
return socketIP;
}
#endregion

#region Get Port by socket
public string getPort(Socket socket)
{
IPEndPoint sip = (IPEndPoint)socket.RemoteEndPoint;
string socketPort = sip.Port.ToString();
return socketPort;
}
#endregion

#region GetNowTime

public string GetNowTime()
{
DateTime dt = DateTime.Now;
string time = dt.ToString() + " . " + dt.Millisecond.ToString();
return time;
}

#endregion

#region Delete socket in Arraylist which is closed

public ArrayList DeleteClosedSocket(ArrayList socketlist)
{
ArrayList slist = new ArrayList();

foreach (Socket s in socketlist)
{
if (s.Poll(10, SelectMode.SelectRead))
{
slist.Add(s);
}
}

foreach (Socket s in slist)
{
socketlist.Remove(s);
}

return socketlist;

}

#endregion

static void Main(string[] args)
{
Server server = new Server();
}
}


客户端

class Client
{
string ip = "127.0.0.1";

int port = 81;

TcpClient clientSocket;

NetworkStream ns;

StreamReader sr;

bool connected;

string message;

Thread connectThread;

int id;

public Client()
{
connected = true;

DateTime dt = DateTime.Now;
id = dt.Millisecond;

connectThread = new Thread(new ThreadStart(connection));
connectThread.Start();
}


public void connection()
{

while (connected)
{
try
{
clientSocket = new TcpClient(ip, port);

ns = clientSocket.GetStream();

sr = new StreamReader(ns);

connected = false;

this.SendMessage();

}
catch (Exception e)
{
Console.WriteLine("Could not connect to Server! Next connection later.");

connected = true;

Thread.Sleep(5000);

}
}

}


public void SendMessage()
{
//循环发送message
while(true)
{
DateTime dt = DateTime.Now;
string time = dt.ToString() + "." + dt.Millisecond.ToString();
message = id + " at " + time ;
Console.WriteLine(message);

try
{
Byte[] bytes = Encoding.ASCII.GetBytes(message.ToCharArray());
ns.Write(bytes, 0, bytes.Length);
}
catch (Exception e)
{
Console.WriteLine("服务器断开");

break;
}
Thread.Sleep(1234);
}

}

public static void Main(string[] args)
{
Client client = new Client();
}

}
...全文
486 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzsh0622 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 cqsfd 的回复:]
19楼的可以提供些UDP传输文件的资料吗?
[/Quote]

你用私信给我发个邮箱地址。项目中用到过,我稍微整理一下,给你发过去。


PS: 技术外的信息,本人不感兴趣,不再回复。
qldsrx 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 lzsh0622 的回复:]
引用 13 楼 qldsrx 的回复:
鄙视上来就要别人用UDP的,难道看不出楼主是个新手吗?新手适合用UDP吗?我都用不好UDP呢,相信你也是,就不要随便叫别人用UDP了,那个数据同步校验需要自己处理,很麻烦的。


UDP和TCP是一个层次,哪个适合用哪个,和新手不新手有关系吗? 你用不好,见议你多看看,自己还没用好的技术点,给别人介绍经验时慎重。
[/Quote]
你就用得好了吗?别只复制些人家的代码来,你贴点自己的可行代码出来看看,只有嘴上工夫有什么用。
cqsfd 2009-11-18
  • 打赏
  • 举报
回复
我之前也做过服务器端的,但是不能公开给你
给你一个我认为非常有价值的链接吧,自己好好体会下
http://topic.csdn.net/u/20091014/16/523754e5-8897-4223-9bf1-f44bcbdc082c.html

另外,19楼的前辈可以提供些UDP传输文件的资料吗?100分求,可直接运行,带说明的300分+
满衣兄 2009-11-18
  • 打赏
  • 举报
回复
tcplistener本身就应该是多线程,你接到新连接的时候是否需要再创建线程?
建议先找几个可以正确运行的例子看一下。
lzsh0622 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 qldsrx 的回复:]
鄙视上来就要别人用UDP的,难道看不出楼主是个新手吗?新手适合用UDP吗?我都用不好UDP呢,相信你也是,就不要随便叫别人用UDP了,那个数据同步校验需要自己处理,很麻烦的。
[/Quote]

UDP和TCP是一个层次,哪个适合用哪个,和新手不新手有关系吗? 你用不好,见议你多看看,自己还没用好的技术点,给别人介绍经验时慎重。
baishengjie 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 hack95 的回复:]
C# code listener.Bind(new IPEndPoint(aryLocalAddr[0], nPortListen));
listener.Listen(50000);
[/Quote]

楼上这个是什么意思,可否解释下
柳晛 2009-11-18
  • 打赏
  • 举报
回复
            listener.Bind(new IPEndPoint(aryLocalAddr[0], nPortListen));
listener.Listen(50000);
baishengjie 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yuxuanji 的回复:]
C# codeif (!clients.Contains(socket))
{
clients.Add(socket);

Thread listenThread=new Thread(new ThreadStart(listen));

listenThread.Start();
}

你这个socket对所有客户端来说都是同一个实例,当然只有一个运行listen的线程跑起来了
[/Quote]

我这么写是为了监听一个客户端开一个线程去执行接收信息。调试的时候也能跑起来多个线程监听不同端口,可就是收到信息有错误,显示出来时空的
baishengjie 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yfqvip 的回复:]
TcpListener t = new TcpListener(。。。);
t.Start(20);//这个参数应该是指定最大挂起连接数的,也就是允许的最大连接数。你试一下吧。
[/Quote]
我试了,也不是这个问题
baishengjie 2009-11-18
  • 打赏
  • 举报
回复
恩,我知道了。我原先也看了有关异步的资料,我写这个例子是先学习同步,然后在学习异步的。你给的例子我下载好了,我先把我这个程序的问题排除了在学习异步的,感谢 qldsrx 和每个给与帮助的人
qldsrx 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lzsh0622 的回复:]
单一客户端可以收到信息,但多个的话就不能收到信息  用UDP
[/Quote]
鄙视上来就要别人用UDP的,难道看不出楼主是个新手吗?新手适合用UDP吗?我都用不好UDP呢,相信你也是,就不要随便叫别人用UDP了,那个数据同步校验需要自己处理,很麻烦的。

这里有个例子我上传Socket的例子,如果你是VS2008的话,可以下载了运行下,同时开多个客户端没任何问题。C#实现简单的Socket文件传输示例 主要看服务器端是如何异步接受请求的,以及客户端又是如何异步创建连接的。连接创建后为了保持接收发送的顺序,我采用的同步收发,如果是传输消息,不需要考虑顺序的话,数据收发也可以采用异步。

想要更多Socket的示例,就到MSDN上找。
满衣兄 2009-11-18
  • 打赏
  • 举报
回复
TcpListener t = new TcpListener(。。。);
t.Start(20);//这个参数应该是指定最大挂起连接数的,也就是允许的最大连接数。你试一下吧。
LutzMark 2009-11-18
  • 打赏
  • 举报
回复
   if (!clients.Contains(socket))
{
clients.Add(socket);

Thread listenThread = new Thread(new ThreadStart(listen));

listenThread.Start();
}


你这个socket对所有客户端来说都是同一个实例,当然只有一个运行listen的线程跑起来了
满衣兄 2009-11-18
  • 打赏
  • 举报
回复
C++在使用tcp的时候需要指定连接个数的,也就是说当连接个数大于这个数字的时候其它连接就会被丢弃。C#应该同理,我帮你查一下看看。
baishengjie 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lzsh0622 的回复:]
单一客户端可以收到信息,但多个的话就不能收到信息  用UDP
[/Quote]
可能是我没表达清楚,是服务器可以收到单一客户端信息,收不到多个的!
baishengjie 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qldsrx 的回复:]
好糟糕的代码,我想没人愿意看它,典型的线程滥用的例子。

自己创建Thread类的对象,必须要全局捕获,在程序退出事件中好关闭所有正在运行的Thread,否则程序将不能正常退出。所以Thread不适合大量的线程操作,这种情况应该使用Socket自带的异步方法操作,让系统管理线程池。
[/Quote]
初写socket,对Thread运用还不熟练,学习中
lzsh0622 2009-11-18
  • 打赏
  • 举报
回复
单一客户端可以收到信息,但多个的话就不能收到信息 用UDP
baishengjie 2009-11-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ruby0602 的回复:]
rec > messageStr[CurrentSocketNo].Length情况没判断
[/Quote]
rec是为了后来截取messageStr[CurrentSocketNo]中有用信息的,你说这种情况就不用截取,这个地方没问题的,这个地方我试过的
qldsrx 2009-11-18
  • 打赏
  • 举报
回复
好糟糕的代码,我想没人愿意看它,典型的线程滥用的例子。

自己创建Thread类的对象,必须要全局捕获,在程序退出事件中好关闭所有正在运行的Thread,否则程序将不能正常退出。所以Thread不适合大量的线程操作,这种情况应该使用Socket自带的异步方法操作,让系统管理线程池。
lzsh0622 2009-11-18
  • 打赏
  • 举报
回复
IPAddress ip = IPAddress.Parse("127.0.0.1");

换成 : IPAddress.Any
加载更多回复(5)
有不少的同学发信给我,和我探讨java的自学过程应该是什么样的,毕竟有很多人因为各种各样的原因不能参加培训。我试着给出自己的见解,抛砖引玉吧。 这个路线图是给那些为了就业的人准备的,如果只是兴趣,不一定照这个走。 这里只是讲了路线图,关于路线的各个阶段,学到什么程度,如何学习等,可以参考后面的JAVA自学之路 七:《路线图明细》。 首先要学JavaSE,这是无庸置疑的。 与此同时,是的,与此同时,和JavaSE的学习同步,建议大家研究一下数据结构与算法。 在这儿之后,你可以选择向J2ME、或者Java GUI、Socket编程等方向努力,但是通过第一篇的办法,你可以很容易就将这方向过滤掉(永远不要忘了我们是为了就业),好吧,暂时和它们诀别,还是向着J2EE的方向前进吧。 在JavaSE完成之后,可以试着完成一些小项目,同时关注一下设计模式的内容,不必强求自己能够完全掌握各种细节,往前走吧。 掌握一种编程工具,比如说Eclipse。 数据库,可以选择使用Oracle或者MySQL开始 。 JDBC,用Java连接数据库。 可以选择在这个地方切入Hibernate,也可以选择在Struts 之后。 HTML CSS JavaScript,这些东西是做web项目必需的内容 。 Servlet JSP,服务器端必需。 XML AJAX,新的流行趋势不能不了解。 作一些小项目吧。比如BBS、留言系统、学籍管理、商城等等,随便着一些业务逻辑比较简单的来做一做。 Struts,MVC的典型应用 Hibernate,OR Mapping的典范之作。 Spring IOC + AOP, 面向对象 + 面向切面,完善的旅程。 把以前自己的小项目加入Struts、Spring、Hibernate的元素吧。 去研究各种商业项目的业务逻辑吧,才能在你的简历加入浓重的一笔。 EJB3.0,java在走了很多弯路后的回归之作,值得研究。 SOA,业界铁定的未来趋势,要紧紧跟随。 在后面,我会告诉你每一步的学习方法和学习重点。 JAVA自学之路 三:要动手 无论如何,请坚持不懈的动手实验! 学习Java要动手,仅仅是看和听是不能够学好编程的。总有同学来信问我们这样的问题,说:"老师我看了视频了,可是怎么一动手就没有任何思路呢?" 对此,我一般都会说不要着急,如果你只是看了视频就想行云流水的话,那老师这些年的锻炼真是白费了,这么多年的苦练才能略有些行云流水的感觉,你一朝一夕就想自己能够达到,不是太奢侈了吗 作为编程的过来人想一下,当年自己学编程的时候是什么时候有思路的呢?至少也是照猫画虎画了一段时间之后吧,我本人是在某一个领域画虎画了上万行代码的时候才慢慢有自己思路的。就像写作文,要有自己思路总是一般来说要经过几个阶段,首先学习词汇,然后学习造句,然后大量阅读别人的文章,自己模仿着写一些,逐渐的经验积累,才能形成自己的思路。学编程,恐怕也得慢慢的来吧,只是看一看、听一听视频,是不足以学好编程的。 所以,动手吧,跟着做,一行一行的跟着敲,一个项目敲完了,比如坦克,再试着加一些自己的功能,按照自己的思路敲一些代码,收获远比干听大的多。 如果遇到,暂时对于一些思路不能理解的同学,我一般都会劝告说,动手写,先写代码,量变会引起质变的。而这种质变的确发生过不少次。 提醒一句,要理解代码思路之后再跟着敲 ,背着敲,千万不要左边摆着别人的程序,右边自己一个一个子母的写,这就不再是程序员了,成了打字员了。 纸上得来终觉浅,所以:别问那么多,别想那么多,动手写吧。 JAVA自学之路 四:要事为先 对待人生的任何事情都要:抓大放小,要事为先 对于一个以前从来没有接触过java的人,java无疑是庞大的,似乎每个领域都可以拓展开来都是一片开阔地,每一个领域要想深入接触到每一个细节所耗费的精力都是巨大的。这个时候大家都胸怀壮志,两眼发光的盯着每一个崭新的知识点,遇见了任何一个知识点都恨不得抠的清清楚楚,明明白白。 难道这有什么不对吗? 我的意见是,没什么大毛病,但是学习效率太低了!我们推荐的学习方式是,抓大放小,要事为先。 比如说学习J2SE的时候,学到GUI这一章,有的同学认为,既然学到这儿了,我们去把SWING细细的了解一遍吧;还有的同学,遇到了在Linux下的Shell编程,就恨不得把Shell先学成专家才肯,或者是才敢,继续往下学习;有没有过这样的感觉,一本书的上册没有学好,觉着下册心里也没底儿,甚至非要把上册复习一遍才敢继续学习。如果你也是这样,要去看看心理医生啦,没准儿会有洁癖的毛病。 任何事情都要追求完美才敢继续往后进行,是一种性格缺陷 大胆的放弃一些东西吧,有失才有得,把自己有限的、宝贵的精力用在对于就业直接相关的地方,这才是最有效率的学习方式!等你参加工作,有了可持续发展的事业动力和经济基础,有时间有精力闲的没事儿干的时候,再去研究那些其它吧。 曾经有一个故事,说得是产能和产量的关系。 一个人喜欢读书,读了一辈子,无所不通,这时候要做任何工作都可以,他的产能到了极致,但是,他老了,即便每天产出大量的东西也不能维持多久了,一辈子的产量并没有多少。 另一个人直接工作,忙,天天在机器旁日复一日,做了一辈子,没时间学习和进修,可以想象,产量能有多大呢。 人的一生,要锻炼产能,也要及时产出,引擎要转,也要停下来加油,这两者平衡的越好,你的贡献和产量就会越大。如果钻研的东西和产能目标(或者说近期的产能目标)无关的话,要舍得放手。 所以,对于SWING,暂时先扔在一边吧。 对于shell,对于各种协议过于详细的细节,对于喜欢的游戏编程,对于javascript各种华而不实的效果,都暂时和它们分别吧。一切和我们的直接工作目标关联不大的东西,扔在一边或者弄清楚到足够支持下一步的学习就可以了。 那这样岂不是妨碍我成为通晓各种细节的高手了吗? 我一向不认为一个人掌握了很多很多知识点的细节就是高手了,一个人如果告诉你,回字有四种写法,你会认为他是高手吗? 毫不客气的说,现在我们所教授的所有知识细节在网上或书都可以找到,只要你肯花时间花精力去动手试,去钻研,没有什么不能掌握的。struts、spring你能掌握吗?当然能!但是如果把时间花在spring的各种细节的研究上,花在研究国企业应用不广泛地的spring mvc上,这个精力就太浪费了,而且学习的积极性会受到打击,谁愿意整天泡在细节的蜘蛛网挣扎不出来呢?谁愿意天天经历风雨却总是不能见到彩虹呢? 盖房子,要先建骨架,再谈修饰。 画山水,要先画结构,再谈润色。 认识一台结构复杂的机器,应该首先认清楚脉络,然后再逐步认识每一个关节。 为了应付从小学到大学的考试,我们背了各种各样的不应该提前掌握的细节,同时也养成了见到细节就抠的学习习惯。而现在,是到改改的时候了。 请在合适的时间,做合适的事情吧。 把时间和精力花在作项目上面,花在写作品以及锻炼解决问题的能力上面吧,这是迈向高手的正确的而且快速的方向。 我一直不认为一个课程提供了很多很多的细节就是优秀的价值高的课程了,掌握必要的细节,这个不含糊,至于其他,或者通过视频给出(这样可以给出更多的细节,但是不占上课时间,课上只讲重要的、必要的细节知识),或者在掌握了自学的能力后自己能够查出,这才是正途。 当你看书到某个地方暂时不理解的时候的,暂时放手吧,追求一些行云流水、自然而然的境界吧,只是不要停下前进的脚步,不要被大路旁边的支根末节干扰了你前进的行程,项目,真实的项目,这才是目的,就在不远的前方。 陶渊明读书,叫做“不求甚解”,但他是大诗人。 诸葛亮读书,总是“观其大略”,但他是大政治家。 作研究的,是在确定了方向之后才详细的研究深入的东西。 到了庐山,脉络形状扔在一边,盯着一棵棵小草、一粒粒石子的看,怎么样才能识得“真面目”? 作为应用型的人才,是研究回字的n种写法还是抓紧时间向着主要应用的方向努力,请自己作出抉择。 以项目驱动自己的学习吧,当把握了技术的脉络之后再去补充细节的研究,是正途。 这辈子就不研究其他的方向了吗? 当然要研究!但是在将来合适的时间再说吧。 所以,抓大放小,要事为先! 那么,在JAVA的这些课程,哪些才是大,才是要事呢?请继续读下去。 JAVA自学之路 五:问题解决之道 既然是学习,就不可能不遇到问题。 既然是自学,就没有方便的和老师探讨的机会。 那么,遇到问题之后,环境配不通,程序调不过,运行不正常,遇见这些恼人的问题的时候,该怎么办呢? 首先我要恭喜你,遇见问题,意味着你又有涨经验的机会了,每解决一个问题,你的JAVA经验值就应该上升几百点,问题遇到的越多,知识提升的越快。 但是总是解决不了也是很恼人的,怎么办呢? 我一般要求我们的学生都是这样来进行的。 当你遇到一个问题的时候: 1:要仔细的观察错误的现象,是的,要仔细 有不少同学的手非常快,在编译一个程序的时候,报了一大堆的错误,扫了一眼之后就开始盯着代码一行一行的找,看清什么错误了吗?没有!有的时候安装软件出问题了,一个对话框弹出来说出错了,马上举手问老师:“不得了了,出错了,出错了”。 “什么错误?” “还没看呢?” 这都是典型的不上心的方法!请记住,学习编程并不是一件很容易的事情,自己首先要重视,要用心才可以。 在开发,仔细观察出错信息,或者运行不正常的信息,是你要做的第一件事。 读清楚了,才能在以后的步骤有的放矢,哭了半天,总要知道哭的是谁才成。 这里又分三种情况: A:错误信息读懂了,那么请进入2步:要仔细思考问题会出在哪些环节 B:没读懂,愣是一点没看懂,进入第4步吧:google C:读了个半懂,有些眉目但是不太能确定,第2步和第4步结合着来。 2:要仔细思考问题会出在哪些环节(重要) 当你读懂了一个问题之后,要好好的思考这个问题可能会在哪些环节上出错。 一辆汽车从总成线上下来,车门子关不上! 哪错了?你怎么查? 当然是顺着生产线一站一站的查下来。 程序也是一样的,也是一系列语句完成后产生的结果。 写一个网络程序,总是发现服务器端打印不出接收的数据,有几个环节会出错? 仔细分析这个现象的环节: 客户端产生数据->按“发送”按钮->发送到服务器->服务器接收到后打印 这几个环节都有可能会出错: 有可能客户端根本就没产生数据,有可能发送按钮按下去后根本就没发出去,或者发出去的不是你产生的东西,或者根本就没连接网络,或者发送出去服务器没有接收到,或者接收到之前就打印了等等等等。 学着去这样仔细的分析程序的环节和这些环节可能会产生的问题,你的经验值定然会大幅度快速的提升,这样做很累人,但是一件事情如果做下来一点都不累的话,这个东西还有价值吗? 在网页A输入了一个人的名字,提交到B,首先存储到数据库,然后再读出来,发现乱码!怎么办?当然是分析环节: 客户输入->HTTP发送->B接收->存储到数据库->读出->展现到网页 每个环节都可能出问题,怎么才能知道哪里出的问题?继续往下读。 3:如何定位错误(重要)分析清楚有哪些环节之后,下一步就是定位到底什么环节出错了。 定位有以下三种办法: A 打印输出,比如java的System.out.println(),比如js的alert(),这种办法常用,必须掌握 B Debug,可以参考我们的视频《坦克大战》,详细讲了Eclipse的调试。 C 删掉一部分调试一部分,也就是去掉一部分的功能,做简化,然后调试剩下的功能,JSP和JavaScript常用。 4:如果还不行,google吧 还查不出来?恭喜你,你遇到的错误是值得认真对待的错误,是会影响你学习生涯的错误,问一下google或者百度吧。照着下面的方法查查看。 一般来讲,搜索引擎可以搜到各种知识点,我曾经跟同学们开玩笑说:“学会了怎么google或者baidu,其实没必要跟老师学了,自己全都搞懂了,尚学堂是没必要来的。”当然,只是玩笑,培训的作用有三个: A:系统化知识 B:真实项目锻炼经验 C:少走弯路,节省时间 不知不觉开始做广告了,请原谅,处其位谋其事,总得为尚学堂说点什么:) 言归正传,如何查搜索引擎? 先精后粗,首先先进行尽量精确的查找,比如一个错误,SocketException,你怀疑它是在connect()方法出的问题,那么当然是选这样的关键词java connect SocketException 先后英,本着以解决问题为主的想法,练习英文还是先放在一边吧,首先应该在文网页查询,还不行的话,搜索英文的吧,最近的尚学堂课程会带大家阅读英文的书籍。有很多东西就像一层窗户纸,远看灰蒙蒙怪唬人的,你壮着胆子一捅,它就破了。阅读英文的书籍就是如此,不是想象的那么困难:)宁可在沙场上战死,也不能被吓死不是吗:) 信息筛选,搜索出来的结果不见得能够完全匹配,建议大家多阅读前几页的搜索结果,多打开几个网页看看,不过,我的经验是超过3页一般就没意义了,所以超过3页还没有找到合适的答案,或许应该调整一下关键词,或者放粗整个搜索的结果了。 经常的进行知识难点的查询,如果一个问题牵扯的面比较广,就干脆到网上搜索一些相关的专题,比如“java 乱码 mysql” “oracle 创建用户”等等,如果有必要,不要犯懒,勤动手写一些小小的测试程序,来弄明白知识点的细节。这也是涨知识的重要的途径。

110,570

社区成员

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

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

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