一個關於Java Socket的問題,大家看一下
一個關於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端:
我的目的是從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"> |
相關文章
- 請教一個關於JAVA SOCKET程式設計中的問題Java程式設計
- 請教大家關於java效能的問題Java
- 一個關於Java Excel的問題JavaExcel
- 請教大家一個JAVA的問題Java
- 遇到一個關於session id的問題,向大家請教!Session
- 一個關於java.net.URL的問題.Java
- 關於教程的一個問題
- 又是關於prepareStatement提高效能的問題,請幫忙看一下!REST
- 請問一下關於socket跟頁面請求的問題
- 關於repaint()問題,大家請指點AI
- 關於Integer面試的一個問題面試
- 一個關於SessionBean呼叫的問題。SessionBean
- 一個關於prototype模式的問題?模式
- 關於一個CMP關係的問題,很可能被忽略,不知道大家知道嘛
- Java,InputStream,Socket阻塞.(關於HTTP請求的IO問題自我總結)JavaHTTP
- 丁奇:關於 AliSQL 開源大家關心的問題SQL
- 丁奇:關於AliSQL開源大家關心的問題SQL
- 問一個關於hibernate的OracleDialect問題Oracle
- 求助關於EJB的部署問題(小弟是初學者,請各位大哥看一下)
- opensessioninviewfilter不起作用,請大家看一下是否哪裡配置有問題?SessionViewFilter
- 關於一個歸檔問題?
- 求助關於JdonFrameworkTest的一個問題Framework
- 關於系統效能的一個問題
- 一個關於jdbc2的問題JDBC
- 關於jdbc的一個問題,高手解惑JDBC
- 關於抽象工廠的一個問題?抽象
- 爭用!!!!一個關於JDBC的問題!JDBC
- 關於singleton模式的一個問題?模式
- 碰到一個棘手的問題——關於httpclient。HTTPclient
- banq,你好問一個關於《java使用系統開發指南》的問題Java
- 關於jsp拒絕訪問的問題,謝謝大家JS
- 關於Java NIO的一些問題,求助。Java
- 大家看看這個問題能否解決?關於無線應用
- 一個關於mysql方面的問題,希望斑竹和大家能幫忙,謝謝!!MySql
- 一個一直困惑的關於jdbc in 的問題JDBC
- Elasticsearch中關於transform的一個問題分析ElasticsearchORM
- 關於介面實現的一個小問題
- 關於vue事件監聽的一個問題Vue事件