Java Socket通訊 客戶端與伺服器端的連線 和資訊傳輸
阿新 • • 發佈:2019-01-08
一.建立客戶端和伺服器端的連線。
方法分2步:
1.在客戶端建立Socket物件,用來發送連線請求
2.在伺服器端穿件ServerSocket物件,用來接收請求。
//客戶端 public class socket1 { Socket socket; public static void main(String[] args) { new socket1().setUpInternetWoring(); } void setUpInternetWoring(){ try { //建立Socket物件設定要連線的IP地址和客戶端的埠號 socket = new Socket("127.0.0.1",888); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { socket.close(); //要關閉 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
//伺服器端 public class server1{ public static void main(String[] args) { try { ServerSocket server = new ServerSocket(888);//建立監聽物件sever 監聽埠號888 Socket LinkSocket = server.accept(); //接收請求資訊 並返回請求物件 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ } } }
二.實現客戶端和伺服器端的通訊。
方法很簡單:
對客戶端而言,一方面要接收資訊,另一方面要傳送資訊。
對伺服器端而言,和客戶端是一樣的。
為了實現這兩個功能,用到了I/O流。使用socket是兩個函式:
1.getInputStream();從建立的通道中讀取資訊
2.getOutputStream();向建立的通道中寫入資訊
具體方法是:
1:建立BufferedReader的物件來儲存通道中讀取的資訊
2:建立PrintWriter的物件,通過println()方法向通道中寫入資訊
客戶端通訊虛擬碼:
Socket socket;
BufferedReader reader;
PrintWriter writer;
void setUpInternetWoring(){
try {
//建立Socket物件設定要連線的IP地址和客戶端的埠號
socket = new Socket("127.0.0.1",888);
System.out.println("連線成功");
//讀資訊
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = null;
while((message = reader.readLine())!=null){
System.out.println(message);//讀取到的資訊
}
//寫資訊 伺服器端通過reader讀到的資訊就是這裡傳送的資訊
writer = new PrintWriter(socket.getOutputStream());
writer.println("要傳送的資訊,怎麼輸入的都行");
writer.flush();//重新整理,讓伺服器端馬上接收到資訊
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
//用完要關閉,避免資源浪費
reader.close();
writer.close();
socket.close(); //要關閉
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
其實伺服器端和客戶端程式碼是一樣的。伺服器端通訊虛擬碼:
BufferedReader reader;
PrintWriter writer;
Socket LinkSocket;
void setUpNetworking(){
try {
ServerSocket server = new ServerSocket(888);//建立監聽物件sever 監聽埠號888
LinkSocket = server.accept(); //接收請求資訊 並返回請求物件
//讀資訊
reader = new BufferedReader(new InputStreamReader(LinkSocket.getInputStream()));
String message = null;
while((message=reader.readLine())!=null){
System.out.println(message);
}
//寫資訊
writer = new PrintWriter(LinkSocket.getOutputStream());
writer.println("要寫入 的資訊");
writer.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
reader.close();
writer.close();
LinkSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}