你程序是: 服務(wù)端有不斷的向客服端寫(xiě)信息,客戶端有不斷的讀來(lái)自服務(wù)端的信息。 但是反過(guò)來(lái),客戶端沒(méi)有不斷的向服務(wù)端寫(xiě)信息。服務(wù)端也沒(méi)有不斷的讀來(lái)自客戶端的信息。 用線程解決: 在客戶端新加一條線程,專(zhuān)門(mén)用來(lái)讀取來(lái)自服務(wù)端的信息。 在服務(wù)端新加一條線程,專(zhuān)門(mén)用來(lái)讀取來(lái)自客戶端的信息。 而在各自的main()函數(shù)中只負(fù)責(zé)不斷接收system.in信息,然后發(fā)送信息.. 其實(shí)不用線程的。。我也改了下,改的好像較多。 運(yùn)行步驟: 開(kāi)server端,開(kāi)kehu端??头慷讼葘?xiě)入信息。。然后,你一句我一句。只能按這順序。。這就是沒(méi)用線程的結(jié)果。 代碼如下: 服務(wù)端: import java點(diǎn)虐 .*; import java.io.*; public class Server { public static void main(String[] args) { System.out.println("我是服務(wù)器"); try { ServerSocket ss=new ServerSocket(8000); Socket sk=ss.accept(); OutputStream os=sk.getOutputStream(); BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os)); bw.write("你好,我是服務(wù)器,有什么需要我服務(wù)的嘛?\n"); bw.flush(); InputStream is=sk.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); while(true) { String str=br.readLine(); if(str.equals("bye")||str==null)break; System.out.println("客戶端說(shuō):"+str); String sr=""; BufferedReader br1=new BufferedReader(new InputStreamReader(System.in)); sr=br1.readLine(); bw.write(sr+"\n"); bw.flush(); } } catch (Exception e) { System.out.println("客用戶機(jī)己斷開(kāi)"); } } } 客戶端: import java點(diǎn)虐 .*; import java.io.*; public class kehu { public static void main(String[] args) { System.out.println("我是客戶"); try { Socket s=new Socket(InetAddress.getByName(null),8000); InputStream is=s.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); OutputStream os=s.getOutputStream(); BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os)); String sr=""; while(true) { sr=br.readLine(); if(sr.equals("bye")||sr==null)break; System.out.println("服務(wù)器說(shuō)"+sr); BufferedReader br1=new BufferedReader(new InputStreamReader(System.in)); sr=br1.readLine(); bw.write(sr+"\n"); bw.flush(); } } catch (Exception e) { System.out.println("服務(wù)器未開(kāi)戶或己關(guān)閉~"); } } }
湖濱網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)于2013年開(kāi)始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
你這個(gè)在輸入整數(shù)是可以完美結(jié)束的,死循環(huán)是因?yàn)槟爿斎氲牟皇菙?shù)字!
造成異常捕捉,然后你又沒(méi)有處理異常,也就是說(shuō)你這個(gè)in一直處于一個(gè)異常的狀態(tài)
它肯定是會(huì)一直進(jìn)行捕捉的;
你在這里初始化一下就可以解決問(wèn)題的所在了!
catch (Exception e) {
System.out.println("請(qǐng)輸入整數(shù)?。?!");
in=new Scanner(System.in);//這里是核心,你初始化一下即可;
continue;
java 停止一個(gè)死循環(huán),可以使用break關(guān)鍵字,跳出循環(huán),如下代碼:
package?com.qiu.lin.he;
public?class?Ceshi?{
public?static?void?main(String[]?args)?{
for?(int?i?=?2;?i??0;?i++)?{
if?(i?==?80)?{
System.out.println("死循環(huán)退出了");
break;
}
}
}
}
運(yùn)行結(jié)果如下:
是這樣的,ss.accept()方法是阻塞的,也就是說(shuō)ss所在的線程運(yùn)行到accept()函數(shù)就會(huì)一直等待,直到ss接收到了一個(gè)Socket請(qǐng)求。正因?yàn)閍ccept()是阻塞的,所以一般會(huì)把這個(gè)函數(shù)放在一個(gè)單獨(dú)的線程,這樣就不會(huì)影響主線程(例如程序界面)的運(yùn)行,Socket編程幾乎是肯定和多線程編程一起用的。accept()放進(jìn)了單獨(dú)的線程了自然就不會(huì)影響后面代碼的執(zhí)行,因?yàn)檫@時(shí)accept()的時(shí)間片和后續(xù)代碼的時(shí)間片會(huì)由JVM調(diào)配,而不是按照代碼編排的先后順序了。
另外你對(duì)死循環(huán)的理解有偏差,所謂死循環(huán)是指循環(huán)條件永遠(yuǎn)為真而導(dǎo)致循環(huán)一直不結(jié)束,而由于循環(huán)內(nèi)部的方法阻塞導(dǎo)致的循環(huán)不結(jié)束不屬于死循環(huán),這兩個(gè)有本質(zhì)的差別。通常Socket.accept()是該放進(jìn)一個(gè)死循環(huán)的,也就是你的while(true);