怎么實現(xiàn)客戶端與服務(wù)器端 不停的相互發(fā)消息
//服務(wù)器端
package 通訊;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class server {
public static void main(String[] args) {
try {
ServerSocket serversocket = new ServerSocket(8888);
System.out.println("正在等待連接。。。。。。。");
Socket socket = serversocket.accept();
while(true){//死循環(huán)重復(fù)
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String s;
while ((s = br.readLine()) != null) {
System.out.println("客戶端說" + s);
}
socket.shutdownInput();
OutputStream os = socket.getOutputStream();
PrintStream bw = new PrintStream(os);
Scanner input = new Scanner(System.in);
System.out.println("你想對對面的客戶機說些什么");
bw.print(input.next());//從鍵盤輸入讀取一行打印到輸出流
bw.flush();
socket.shutdownOutput();
bw.close();
os.close();
br.close();
isr.close();
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//客戶端
package 通訊;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class client {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 8888);
while (true) {//死循環(huán)重復(fù)步驟
OutputStream os = socket.getOutputStream();
PrintStream bw = new PrintStream(os);
Scanner input = new Scanner(System.in);
System.out.println("你想對對面的服務(wù)器說些什么");
bw.print(input.next());//從鍵盤輸入讀取一行 打印到輸出流
bw.flush();
socket.shutdownOutput();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String s;
while ((s = br.readLine()) != null) {
System.out.println("服務(wù)器端說:" + s);
}
socket.shutdownInput();
br.close();
isr.close();
is.close();
bw.close();
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
為什么這樣寫死循環(huán) 在客戶機發(fā)給服務(wù)器消息 服務(wù)器回復(fù)后就出現(xiàn)這樣的異常?
怎么修改才正確呢?
2017-04-18
錯誤異常意思是socket被關(guān)閉了。按你的代碼while(true)死循環(huán)里的socket.shutdownOutput();socket.shutdownInput();其實際意思是當(dāng)前socket的輸入和輸出已經(jīng)被關(guān)閉,不管服務(wù)器輸入或客戶端輸出數(shù)據(jù)都不行了,因此程序會崩掉。
按照一樓的回答,就是要在while循環(huán)里把這兩句代碼刪了就可以;或者我的另一個想法就是把Socket socket = new Socket("127.0.0.1", 8888);這句代碼放進(jìn)while循環(huán)中,讓它每循環(huán)一次都建新的socket對象,但這種做法較耗內(nèi)存資源。
2017-04-18
提前關(guān)閉了一次socket.刪除這行試試