刘汉帝国当时控有今河北、山东、河南、山西、陕西一带,当政者刘聪是刘渊的第四子。建武元年(公元317年)十一月,晋军将领、盘踞在洛阳一带的赵固率兵突进到刘汉帝国首都平阳近郊。刘聪迅速做出反应,派遣太子刘粲与大将刘雅生率军十万实施报复性打击。他企图一举消灭盘踞在洛阳的赵固,彻底解除这股来自南面的威胁。
十二月,刘粲不敢亲自渡过黄河,而是派征北将军刘雅生率军渡河,攻击洛阳。赵固无法坚守,往东逃奔阳城山(河南省登封市东北车岭)。赵固逃到阳城山以后,赶紧派弟弟飞马前往新郑,请求上司李矩派兵救援。
公元318年年初,也就是在刘琨被段匹磾所杀、司马睿登基前后,李矩命令自己的外甥、扬武将军郭诵与河内郡(河南省沁阳市)太守郭默一起率军西进,屯兵于洛口(河南省巩义市东北)。郭默、郭诵派遣手下将领耿稚、张皮等选拔精锐敢死之士一千多人,趁夜渡过黄河。屯兵于厘城的侦查部队发现了渡河而来的这支部队,向刘粲报告。刘粲毫不在意,回复说:“我军渡河以后,赵固望风逃窜,敌人正自顾不暇,焉敢前来?”
夜幕降临,耿稚、张皮将这一千名勇士分为十队,每队约一百人,从十个方向如暴风骤雨一般向刘粲的中军大营杀来。一时间,刘粲的中军大营四面受敌,在黑暗中乱作一团,被杀伤者超过了半数。刘粲仓皇而逃,一直逃到阳乡,留下了数不胜数的兵仗辎重军马,最后其大营也被晋军占领。
黄河以南的刘雅生听说这一消息,立刻领兵从洛阳撤出,火速渡河回救。他在营外构筑工事,与耿稚、张皮军相持。天明以后,刘粲等人发现晋军突击部队人数少得可怜,于是率领全军向晋军大营发起猛烈攻击。这时,刘聪也听说了刘粲兵败的消息,派遣太尉范隆率领骑兵前来增援。
这场一千对十万的苦战就此展开。然而,这样一场实力极其悬殊的战斗,双方竟然一直打了二十多天,匈奴十万大军硬是无法攻下这座堡垒!关于这场战斗,《晋书·李矩传》与《晋书·刘聪载记》的记载差异很大。《晋书·刘聪载记》称,晋将听说范隆的增兵以后,十分害怕。他们率五千兵马突围,被匈奴军追击,于河阳被歼灭三千五百人,投河而死的有一千多人,几乎全军覆灭。
不过,根据《晋书·李矩传》的记载,晋军突击部队总共才一千人。听说匈奴来了援兵,李矩又选拔了三千壮士前往救援,乘船渡河迎接耿稚、张皮。刘聪命令部队临河列阵,用长钩钩船,不让船只靠岸。双方连战数日,使这支救援部队一直无法渡河。李矩只好又选择部将格增率众从其他地方偷偷渡过黄河,进入张皮的大营。
可能耿稚在听说刘汉大军增兵围攻以后,就率众突围了,但张皮却仍然坚守在营垒中待援。格增到来之后,与张皮一同组建一支一千人的精锐骑兵部队,将营垒中剩下带不走的牛、马、粮草、兵仗等全部付之一炬,又一次趁着深夜杀出重围,投奔到虎牢(河南省荥阳市汜水镇)。刘汉大军追之不及,只好撤回。
这次洛口之战是一次以少击众的著名战例。虽然由于后援不继,最终没能保住战果,但此战对于刘汉帝国打击很大,尤其是张皮等人最后成功突围,让刘聪又气又急,颜面尽失。因为此战,李矩被东晋司马睿任命为都督河南三郡诸军事(即河南郡、荥阳郡、弘农郡)、安西将军、荥阳太守,封修武县侯。
洛口之战深深地刺激了刘聪,而紧接着的一件天灾又让刘聪悲痛欲绝、精神恍惚。就在洛口激战正酣之时,刘聪后宫失火,二十一个小皇子全部被烧死了!一夜之间痛失了二十一个儿子,这对刘聪的打击比洛口惨败还要大。消息传来,刘聪当即昏倒到御床上,哽咽气绝,经过众人抢救很久,才苏醒过来。
痛定过后,刘聪便想再娶妻生子,他听说中常侍(宦官)王沈、宣怀都有美貌的养女,就将王沈14岁的女儿立为左皇后,宣怀的女儿立为中皇后。尚书令王鉴、中书监崔懿之、中书令曹恂等朝廷大臣们联名上书劝谏,以为王沈等不过是刑余小丑,他家的婢女不能奉宗庙。刘聪看后大怒,立即命令儿子刘粲将三位大臣全部拉出去斩首。
新婚过后的刘聪也很快感到自己将不久于人世。他将儿子刘粲叫来说,这几天你死去的弟弟白天总来,可能是来接我的吧?刘聪临死前的打算是让手握重兵的刘曜和石勒前来辅政。因此,他晋封刘曜为丞相、录尚书,任命石勒为大将军,由二人共同辅政。