怎么實現客戶端與服務器端 不停的相互發消息
//服務器端
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){//死循環重復
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) {//死循環重復步驟
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();
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();
br.close();
isr.close();
is.close();
bw.close();
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
為什么這樣寫死循環 在客戶機發給服務器消息 服務器回復后就出現這樣的異常?
怎么修改才正確呢?
2017-04-18
錯誤異常意思是socket被關閉了。按你的代碼while(true)死循環里的socket.shutdownOutput();socket.shutdownInput();其實際意思是當前socket的輸入和輸出已經被關閉,不管服務器輸入或客戶端輸出數據都不行了,因此程序會崩掉。
按照一樓的回答,就是要在while循環里把這兩句代碼刪了就可以;或者我的另一個想法就是把Socket socket = new Socket("127.0.0.1", 8888);這句代碼放進while循環中,讓它每循環一次都建新的socket對象,但這種做法較耗內存資源。
2017-04-18
提前關閉了一次socket.刪除這行試試