歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java基礎篇Socket網絡編程中的應用實例

Java基礎篇Socket網絡編程中的應用實例

日期:2017/3/1 9:08:11   编辑:Linux編程

說到java網絡通訊章節的內容,剛入門的學員可能會感到比較頭疼,應為Socket通信中一定會伴隨有IO流的操作,當然對IO流比較熟練的哥們會覺得這是比較好玩的一章,因為一切都在他們的掌握之中,這樣操作起來就顯得非常得心應手,但是對於IO本來就不是多熟悉的哥們來說就有一定的困難了,在搞清楚IO流操作機制的同時還必須會應用到Socket通信中去,否則會對得到的結果感到非常郁悶和懊惱,下面就和大家一起分享一下自己遇到一點小麻煩後的感觸以及給出的解決辦法。

要求:客戶端通過Socket通信技術上傳本地一個文本文件到服務器端(其實就是代替了手動在控制台輸入文本),服務器端將客戶端上傳的文本保存在另一個文本文件中,保存完成後對客戶端發送一個“完成保存”的的通知,客戶端顯示服務器返回的信息並斷開和服務器的連接,至此整個通信結束。

以下分兩部分來書寫完成此任務的代碼:

1、客戶端:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientSocket{

public static void main(String args[]) throws UnknownHostException,IOException

{

System.out.println("客戶端啟動了...........");

//1、創建客戶端Socket對象同時制定將要連接的服務器的ip地址和端口號

Socket s=new Socket(InetAddress.getByName("192.168.56.4"), 10005);//此處會拋出連接失敗的異常,根據自己的需要給出處理辦法,這裡就直接拋了

//2、設置io操作源,這裡有多種選擇,因為是操作文本文件,所以就選擇可以一行一行讀取數據的Io輸入流BufferedReader

BufferedReader brfu=new BufferedReader(new FileReader("client.txt"));

//3、設置目的:網絡

PrintWriter out=new PrintWriter(s.getOutputStream(),true);//此處也可以選擇別的Io輸出流,例如:BufferedWriter

//4、開始讀取文件內容並上傳到服務器端

String line=null;

while((line=brfu.readLine())!=null){

out.println(line);

//此處初學者一定要注意:使用out.print(line);out.flush();也解決不了上傳不成功的問題,就是讀取文本內容帶有回車換行符的原因,如果不使用 out.println(line),當然也可以使用out.print(line+"\r\n")來解決

}

s.shutdownOutput();//此方法是經過socket對象封裝後的,目的就是告訴服務器自己發送內容操作結束了,避免服務器阻塞等待而不給客戶端發送完成信息

//這裡也可以使用發送一個和服務器協商好的結束標示符解決問題,但是那個標示符的選擇一定要唯一,並且要做到確保上傳文件中不會出現這個標示符(時間的毫秒值)

//5、創建接受服務器端返回數據的IO輸入流

BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));

//6、輸出服務器返回的數據

System.out.println("Server data :"+brIn.readLine());

//7、關閉資源

brfu.close();

s.close();//其他的IO流對象不用關閉了,因為它們都依靠s,s關閉就可以了

}

}

2、服務器端

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServersSocket {
public static void main(String[] args) throws IOException {
System.out.println("服務器端啟動了....");
//1、創建服務器端對象,同時綁定監聽的端口號
ServerSocket ss=new ServerSocket(10005);
//2、獲取客戶端對象
Socket s=ss.accept();
//3、獲取客戶端ip地址和客戶端名稱
String ip=s.getInetAddress().getHostAddress();
String name=s.getInetAddress().getHostName();
System.out.println("接受到來自名稱為:"+name+" 和ip為:"+ip+"的連接");
//4、獲取IO數據源
BufferedReader brfu=new BufferedReader(new InputStreamReader(s.getInputStream()));
//5、設置目的,創建本地的文本文件
PrintWriter out=new PrintWriter(new FileWriter("server.txt"),true);

//上面的代碼等效於BufferedWriter bw=new BufferedWriter(new FileWriter("server.txt"))

//6、開始保存數據的操作
String line=null;
while((line=brfu.readLine())!=null){

out.write(line+"\r\n");
System.out.println(line);
}
//7、創建服務器端源:網絡
PrintWriter outSer=new PrintWriter(s.getOutputStream(),true);
outSer.println("接受並保存完成!");

//8、關閉IO和網絡資源
out.close();
s.close();
ss.close();

}

}

Copyright © Linux教程網 All Rights Reserved