一個關于Java Socket的問題,大家看一下:
我的目的是從client端發出一段字符串,server端接收后原樣返回給客戶端。
客戶端:ConnClient? 服務器端ConnSerer(完整源代碼附在最后)
===client端===
建了一個out流和in流:
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
??
PrintWriter Clientout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
向server端輸出:clientOut.println("hello");? clientout.close();
等待服務器端返回代碼片段:
StringBuffer sbuf = new StringBuffer();
char[] buff = new char[10];
??
int iLen = in.read(buff);
??
while (iLen>0) {?
?? sbuf.append(buff,0,iLen);
?? if (sbuf.toString().trim().equals("hello")){
?????? System.out.println(sbuf.toString());
??????? break;
?? }
??? iLen = in.read(buff);
}
?
===server端===
同樣建了一個in流和out流
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
??
PrintWriter Serverout = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
接收client端信息和原樣返回信息:
StringBuffer sbuf = new StringBuffer();
????
char[] buff = new char[10];
int iLen = in.read(buff);
?????????
while(iLen>0){?
?sbuf.append(buff,0,iLen);
?if (sbuf.toString().trim().equals("hello")){
?
?System.out.println("Echoing: " + sbuf.toString());
?serverout.println(sbuf.toString());?????? //此處為server端輸出流,返回給client端
?break;
??????? }
?iLen = in.read(buff);
}
問題來了:
1、如果按以上代碼運行,server端可以收到client的信息,但client端卻收不到返回的信息。為什么?
2、后來我把client端的clientout.close()注釋掉后,一切正常,client端能收到server端返回的信息。這又為什么?
難道server端和client端用的是一個out流?為什么client端把out流關掉后(clientout.close()),server端就不能返回信息呢?
以我以前的理解,server端和client端建的兩個輸出流應該是獨立的。不會因為我把client端的out流關掉后,server端out流就不能返回了?不會吧!呵呵!
還有一個問題:server端怎么判斷client端數據已經發送完畢?
一開始,我用clientout.print("hello"),運行后,server端顯示已經連接成功但一直偵聽,沒有收到信息,認為client端還沒有發送完成。
后來,我改用clientout.println("hello"),運行后,一切正常,服務器端也收到信息(hello)。
從上看出server的地判定就是一個回車符,不知道這樣認識對不對?大家指點!
經過我試驗,如果client端print后,用clientout.close()也可以使server端接收到信息。但卻不能返回信息。也就是我發現上面說述的問題來由。
以上幾個問題,請大家和banq大哥多加指點!
源代碼如下:
client端:
package com.socket;
import java.net.*;
import java.io.*;
public class ConnClient {
? public static void main(String[] args) throws IOException {
?InetAddress addr = InetAddress.getByName(null);
?
?System.out.println("addr = " + addr);
?
?Socket socket = new Socket(addr, 8080);
?//socket.setSoTimeout(5000);
?
?try {
?? System.out.println("socket = " + socket);
?? BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
??
?? PrintWriter clientout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
??
?? String strSend = "hello";
??
? ?
?? clientout.println(strSend);
?? //clientout.println("\r\n");
?? //clientout.println();
?? //clientout.close();
?? StringBuffer sbuf = new StringBuffer();
??
?char[] buff = new char[10];
??
?int iLen = in.read(buff);
??
?while (iLen>0) {?
??sbuf.append(buff,0,iLen);
??if (sbuf.toString().trim().equals(strSend)){
???System.out.println(sbuf.toString());
????? break;
???? }
?? iLen = in.read(buff);
?}
?
?}catch(Exception e){
??e.printStackTrace();
?} finally {
?? System.out.println("closing...");
?? socket.close();
?}
?
}
}
server端代碼:
package com.socket;
import java.io.*;
import java.net.*;
public class ConnServer {?
?
? public static final int PORT = 8080;
? public static void main(String[] args) throws IOException {
?ServerSocket s = new ServerSocket(PORT);
?System.out.println("Started: " + s);
?try {
?? Socket socket = s.accept();
?? try {
?System.out.println("Connection accepted: "+ socket);
?BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
?PrintWriter serverout = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
??
????? StringBuffer sbuf = new StringBuffer();
???????
?char[] buff = new char[10];
?iLen = in.read(buff);
?????????
?while(iLen>0){?
?sbuf.append(buff,0,iLen);
?if(sbuf.toString().trim().equals("hello")){
?
?System.out.println("Echoing: " + sbuf.toString());
?serverout.println(sbuf.toString());
??????? }
?????????? iLen = in.read(buff);
}??
?? }catch(Exception e) { e.printStackTrace();}
??? finally {
???System.out.println("closing...");
???
???socket.close();
?? }
?
?} finally {
?? s.close();
?}
? }
}