TCP、UDP練習題 (UDP聊天程式、TCP上傳文字檔和圖片檔案)

來源:互聯網
上載者:User

標籤:tcp   udp   socket   

TCP、UDP編程練習


TCP☆上傳文字檔

讀取一個本地文字檔,將資料發送到服務端,伺服器端對資料進行儲存。 儲存完畢後,給用戶端一個提示。

一、解題思路

用戶端:(1) 建立Socket對象----用伺服器的ip+連接埠號碼

(2)讀取檔案內容

(3)通過socket把內容發送給伺服器端(把socket中的輸出資料流封裝成“列印流”來進行發送文本,是一種比較安全的輸出方式,不會出現失真。)


伺服器端:(1) 建立伺服器socket---ServerSocket

    (2)通過ServerSocket獲得用戶端的socket

    (3)通過用戶端的socket,讀取對方發來的資料,並把這些資料寫到一個建立檔案當中


二、註解和實現代碼

UploadTextClient.java類

package net.tcp.textFileUpload;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;public class UploadTextClient {public static void main(String[] args) {try {//1 建立Socket對象----用伺服器的ip+連接埠號碼Socket s = new Socket("127.0.0.1", 10000);//2 讀取檔案內容   //3 通過socket把內容發送給伺服器端(把socket中的輸出資料流封裝成“列印流”來進行發送文本,是一種比較安全的輸出方式,不會出現失真。)BufferedReader bufr = new BufferedReader( new FileReader("tempFile\\client.txt") );PrintWriter out = new PrintWriter(s.getOutputStream(), true);//發送String line = null;while((line=bufr.readLine())!=null){out.println(line);}//6 給伺服器發送一個結束標記//out.println("%$#@88##K##");//發送自訂的結束標記s.shutdownOutput();//5 讀取伺服器端的反饋資訊 s.getInputStream()BufferedReader bufr2 = new BufferedReader( new InputStreamReader(s.getInputStream()) );String text = bufr2.readLine();System.out.println("server:"+text);//4 關流bufr.close();out.close();s.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}

UploadTextServer.java類

package net.tcp.textFileUpload;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 UploadTextServer {public static void main(String[] args) {try {//1 建立伺服器socket---ServerSocketServerSocket server = new ServerSocket(10000);//2 通過ServerSocket獲得用戶端的socketSocket s = server.accept();//3 通過用戶端的socket,讀取對方發來的資料,並把這些資料寫到一個建立檔案當中//源:socket-->s.getInputStream()-->BufferedReader    目的:FileWriter("tempFile\\server.txt")--> 可以封裝成PrintWriter來進行輸出BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));PrintWriter pw = new PrintWriter( new FileWriter("tempFile\\server.txt") ,true);String line = null;while((line=bufr.readLine())!=null){//if("%$#@88##K##".equals(line)){//break;//}pw.println(line);}//5 向用戶端發送反饋資訊,通過用戶端的socket來發String str = s.getInetAddress().getHostName();str = str + "::: 檔案上傳成功...";PrintWriter out = new PrintWriter(s.getOutputStream(),true);out.println(str);//4 關流bufr.close();pw.close();s.close();server.close();} catch (IOException e) {e.printStackTrace();}}}



☆上傳圖片檔案

用戶端需求:把一個圖片檔案發送到服務端並讀取回饋資訊。要求判斷檔案是否存在及格式是否為jpg或gif並要求檔案小於2M。

服務端需求:接收用戶端發送過來的圖片資料。進行儲存後,回饋一個 上傳成功字樣。支援多使用者的並發訪問。

一、解題思路

用戶端:(1)判斷檔案輸出的檔案是否存在:file.exists() && file.isFile()

      (2)判斷檔案的格式問題:file.getName().endsWith(".jpg")||file.getName().endsWith(".gif")

      (3)檔案小於2M:file.length()>=1024*1024*2

      (4)然後通過IO讀出檔案的資料,並通過Socket將其發送給伺服器端

註:在檔案發送完後,記得給一個發送結束標誌 s.shutdownOutput(),這句相當重要哦!!!


伺服器端:主要就是解決多個用戶端同時向伺服器傳送圖片時,伺服器端如何處理的問題。方法是通過new一個線程來解決。只要有用戶端請求,就new一個線

程單獨的與其交流,這要做的好處,滿足了每個用戶端同時和一個伺服器進行多次交流。

二、註解和實現代碼

UploadPicClient.java類

package net.tcp.picFileUpload;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;public class UploadPicClient {public static void main(String[] args) throws Exception{//衛條件,反邏輯if(args.length!=1){System.out.println("請指定檔案名稱");return;}File file = new File(args[0]);if( !(file.exists() && file.isFile()) ){System.out.println("上傳的檔案不存在");return;}if( !(file.getName().endsWith(".jpg")||file.getName().endsWith(".gif")) ){System.out.println("檔案的副檔名必須是jpg或gif!");return;}if( file.length()>=1024*1024*2 ){System.out.println("檔案過大,必須小於2M,請重新選擇...");return;}Socket s = new Socket("127.0.0.1",10002);FileInputStream fis = new FileInputStream(file);OutputStream out = s.getOutputStream();byte buf[] = new byte[1024];int len=0;while((len=fis.read(buf))!=-1){out.write(buf, 0, len);}s.shutdownOutput();//發送結束標記//讀取伺服器的反饋資訊InputStream in = s.getInputStream();byte b[] = new byte[1024];int len2 = in.read(b);String info = new String(b,0,len2);System.out.println(info);fis.close();out.close();s.close();}}
UploadPicServer.java類

package net.tcp.picFileUpload;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;public class UploadPicServer {public static void main(String[] args) throws Exception{ServerSocket server = new ServerSocket(10002);while(true){Socket s = server.accept();new Thread( new UploadThread(s) ).start();}}}class UploadThread implements Runnable{private Socket s = null;public UploadThread(Socket s) {this.s = s;}@Overridepublic void run() {String ip = s.getInetAddress().getHostAddress();System.out.println(ip+"....connected!");//接收來自用戶端的資料(圖片檔案)File dir= new File("c:\\mypic");if(!dir.exists()){dir.mkdir();}int count =1;File file = new File(dir,ip+".jpg");while(file.exists()){  file = new File(dir,ip+"("+ (count++) +").jpg");}try {FileOutputStream fos = new FileOutputStream(file);byte buf[] = new byte[1024];int len=0;InputStream in = s.getInputStream();while((len=in.read(buf))!=-1){fos.write(buf, 0, len);}OutputStream out = s.getOutputStream();out.write((ip+"-->圖片資料已經上傳成功!").getBytes());//關流out.close();fos.close();s.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
注意一個小問題:就是在運行用戶端程式(UploadPicClient.java)時,不能直接運行。

操作步驟:滑鼠放在main方法上單擊右鍵,選擇Run As ---> Run Configurations --->Arguments --->Program arguments中填寫要傳輸檔案的絕對路徑,也就是路徑加文

    件名。


在用戶端與伺服器進行傳輸資料時,發送端和接收端的流一定要對應。



UDP☆UDP聊天程式

a、通過鍵盤錄入擷取要發送的資訊。

b、將發送和接收分別封裝到兩個線程中。

一、解題思路

因為是聊天程式,所以是兩個用戶端交流,所以只要寫成一個用戶端就可以,另一個只需要改一下發送端和接收端的連接埠。

每個用戶端都有一個發送的DatagramSocket和一個接收的DatagramSocket;然後分別通過一個線程啟動。這樣保證在沒有接到結束提示時,每個用戶端都可以一直保持接收和發送的狀態。

二、註解和實現代碼

UDPChat.java類

package net.udp.updChat;//111111import java.net.DatagramSocket;import java.net.SocketException;public class UDPChat {public static void main(String[] args) {try {DatagramSocket send = new DatagramSocket(10003);//傳送埠DatagramSocket receive = new DatagramSocket(10004);//接收埠new Thread( new Send(send) ).start();new Thread( new Receive(receive) ).start();} catch (SocketException e) {e.printStackTrace();}}}

Receive.java類

package net.udp.updChat;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;public class Receive implements Runnable {DatagramSocket ds=null;public Receive(DatagramSocket ds) {this.ds = ds;}@Overridepublic void run() {try {byte buf[] = new byte[1024];while(true){DatagramPacket dp = new DatagramPacket(buf, buf.length);ds.receive(dp);String ip = dp.getAddress().getHostAddress();int port = dp.getPort();String str = new String( dp.getData(),0,dp.getLength() );System.out.println(ip+":"+port+"==> "+str);if("over".equalsIgnoreCase(str)){System.out.println(ip+"離開聊天室....");}}} catch (IOException e) {e.printStackTrace();}}}

Send.java類

package net.udp.updChat;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class Send implements Runnable {DatagramSocket ds=null;public Send(DatagramSocket ds) {this.ds = ds;}@Overridepublic void run() {try {BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));String line=null ;while((line= bufr.readLine())!=null){byte buf[] = line.getBytes();DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.31.115"),10002);//(10002)與另一個用戶端的接收埠相同ds.send(dp);if("over".equalsIgnoreCase(line)){break;}}ds.close();} catch (IOException e) {e.printStackTrace();}}}









著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

TCP、UDP練習題 (UDP聊天程式、TCP上傳文字檔和圖片檔案)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.