為了一步一步的掌握網路編程,下面再研究網路編程中的兩個基本問題,通過解決這兩個問題將對網路編程的認識深入一層。
1、如何複用Socket串連?
在前面的樣本中,用戶端中建立了一次串連,只發送一次資料就關閉了,這就相當於撥打到電話時,電話打通了只對話一次就關閉了,其實更加常用的應該是撥通一次電話以後多次對話,這就是複用用戶端串連。
那麼如何?建立一次串連,進行多次資料交換呢?其實很簡單,建立串連以後,將資料交換的邏輯寫到一個迴圈中就可以了。這樣只要迴圈不結束則串連就不會被關閉。按照這種思路,可以改造一下上面的代碼,讓該程式可以在建立串連一次以後,發送三次資料,當然這裡的次數也可以是多次,範例程式碼如下:
package tcp;
import java.io.*;
import java.net.*;
/**
* 複用串連的Socket用戶端
* 功能為:發送字串“Hello”到伺服器端,並列印出伺服器端的反饋
*/
public class MulSocketClient {
public static void main(String[] args) {
Socket socket = null;
InputStream is = null;
OutputStream os = null;
//伺服器端IP地址
String serverIP = "127.0.0.1";
//伺服器端連接埠號碼
int port = 10000;
//發送內容
String data[] ={"First","Second","Third"};
try {
//建立串連
socket = new Socket(serverIP,port);
//初始化流
os = socket.getOutputStream();
is = socket.getInputStream();
byte[] b = new byte[1024];
for(int i = 0;i < data.length;i++){
//發送資料
os.write(data[i].getBytes());
//接收資料
int n = is.read(b);
//輸出反饋資料
System.out.println("伺服器反饋:" + new String(b,0,n));
}
} catch (Exception e) {
e.printStackTrace(); //列印異常資訊
}finally{
try {
//關閉流和串連
is.close();
os.close();
socket.close();
} catch (Exception e2) {}
}
}
}
該樣本程式和前面的代碼相比,將資料交換部分的邏輯寫在一個for迴圈的內容,這樣就可以建立一次串連,依次將data數組中的資料按照順序發送給伺服器端了。
如果還是使用前面範例程式碼中的伺服器端程式運行該程式,則該程式的結果是:
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.net.SocketInputStream.read(SocketInputStream.java:90)
at tcp.MulSocketClient.main(MulSocketClient.java:30)
伺服器反饋:First
顯然,用戶端在實際運行時出現了異常,出現異常的原因是什麼呢?如果仔細閱讀前面的代碼,應該還記得前面範例程式碼中的伺服器端是對話一次資料以後就關閉了串連,如果伺服器端程式關閉了,用戶端繼續發送資料肯定會出現異常,這就是出現該問題的原因。