东晋皇朝却没有对孙恩打开建康城门。相反,东晋任司马元显为中军将军,命令世族头面人物,徐州刺史、卫将军谢琰(谢安之子)兼督吴兴、义兴军事,率军东征。北府兵著名将领,南徐、南兖二州刺史刘牢之,也从京口发兵。起义军在无准备的情况下猝然应战,首战即告失利,谢琰于隆年三年(399)十二月攻下义兴,杀害义军将领许允之;接着又攻破吴兴,起义军将领丘尩被迫后撤。谢琰与刘牢之步步紧逼,所征必克。谢琰为稳妥起见,屯兵乌程(今浙江吴兴南二十五里),遣司马高素率兵配合已攻克吴郡的刘牢之,向钱塘江推进。
孙恩闻讯,既不组织反攻,又未积极设防。他寄希望于钱塘江天险,企图仿效越王勾践,保有会稽,割据江东。结果刘牢之很快就率军渡江。孙恩马上就作出放弃浙东根据地的决定,并用曹操被周瑜击败后所说的“孤不羞走”的话为自己的指挥无能开脱。起义军和家属二十余万人仓促东撤,不得不丢掉大量辎重、宝器和女子。追击的官军竞相争夺宝物和女子,孙恩因而幸免于全军覆灭,率众登船逃到海岛。起义军却丧失了浙东地区,留守的义军将领陆瑰、丘尩、沈穆夫等均遇害。刘牢之纵军烧杀抢掠,致使东土郡县“城中无复人迹,月余乃稍有还者”。这样,旬日间占有八郡,人数达数十万的起义军,在晋军的进攻下,几乎未进行任何有效的抵抗,就被击溃。起义军所取得的大好局面也几乎丧失殆尽。究其因,与孙恩的骄傲轻敌,无战略眼光和指挥失误不无关系。
孙恩撤回海岛,重整军事,“伺人形便”。东晋王朝担心他再次登陆,任命谢琰为会稽太守、都督会稽临海东阳永嘉新安五郡军事,率徐州文武将吏戍守浙东沿海地区。谢琰凭借资望,骄奢淫逸,无“绥抚之能”,又“不为武备”(《晋书·谢琰传》)。因此,隆安四年(400)五月,孙恩率军从浃口(今浙江镇海东南)一举登陆成功,直指余姚,攻破上虞,进至距山阴县以北仅三十五里的邢浦。谢琰派参军刘宣之拒战,义军失利。数日后,义①《资治通鉴》卷一一一安帝隆安三年。
军再攻邢浦,打败上党太守张虔硕,乘胜向山阴进军。谢琰亲自出战。在山阴之役中,孙恩首次表现出他的军事指挥才能。他抓住谢琰骄傲自持、急于求胜的心理,诱敌深入到狭隘的塘路,使官军不得不鱼贯而进,难以发挥步骑优势。义军则可充分发挥擅长水战的特点,在兵舰上发箭猛射,切断官军的进退之路,继而加以围歼。结果官军大败,谢琰和其二子均死于阵中。山阴之战的胜利,使起义军士气大振,沉重地打击了东晋皇朝的统治。
东晋皇朝为了防止“郡民复应恩”,加紧了对起义军的镇压活动。吴兴太守庾桓残杀男女数千人,以削弱起义军在吴兴的群众基础,迫使孙恩转攻临海。朝廷派冠军将军桓不才、辅国将军孙无终、宁朔将军高雅之围攻堵截。五月至十月,两军相峙,不分胜负。十一月孙恩在余姚击败高雅之。高雅之丧众十之六七,退守山阴。朝廷任命刘牢之为都督会稽等五郡军事,率军征讨。孙恩避开强敌,又撤回海岛。刘牢之屯兵于会稽上虞,派部将刘裕戍守句章(今浙江宁波市南);吴国内史袁山松筑沪渎垒(今上海市),以备孙恩。浙东又重新被官军所控制。
由于义军在富庶的浙东地区未有立足之地,不仅人员和物资补充发生困难,而且其影响的范围也比较有限。孙恩为改变这一局面,于隆安五年(401)二月再次出浃口,攻句章。刘裕带领守军拼死抵抗,刘牢之及时增兵解围,孙恩复撤回海岛。三月,孙恩又北上海盐(今江苏海盐)。刘裕亦沿海岸线北上,于海盐筑城。孙恩轻举攻城,失利,部将孙盛被杀。刘裕寡众,恐久战难支,遂空城设伏。孙恩中计,大败于海盐,不得不转攻沪渎。刘裕也弃海盐,追踪北上,与义军纠缠。孙恩为摆脱刘裕牵制,猛攻裕军,全歼其先锋,刘裕所部亦死伤且尽,损失惨重,一时无力再与义军对抗。