一個關於Java Socket的問題,大家看一下

xuechen0721發表於2006-04-29
一個關於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();
	}
  } 
}
<p class="indent">

相關文章