生活随笔
收集整理的這篇文章主要介紹了
Java基础day21
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Java基礎(chǔ)day21 Java基礎(chǔ)day21-網(wǎng)絡(luò)編程 1.網(wǎng)絡(luò)編程入門 1.1 網(wǎng)絡(luò)編程概述 1.2 網(wǎng)絡(luò)編程三要素 1.3 IP地址 1.4InetAddress 2.UDP通信程序 2.1 UDP發(fā)送數(shù)據(jù) 2.2UDP接收數(shù)據(jù) 2.3UDP通信程序練習(xí) 3.TCP通信程序 3.1TCP發(fā)送數(shù)據(jù) 3.2TCP接收數(shù)據(jù) 3.3TCP通信程序練習(xí) 3.4TCP通信程序練習(xí) 3.5TCP通信程序練習(xí) 3.6TCP通信程序練習(xí)【應(yīng)用】 3.7TCP通信程序練習(xí) 3.8TCP通信程序練習(xí)
Java基礎(chǔ)day21-網(wǎng)絡(luò)編程
1.網(wǎng)絡(luò)編程入門
1.1 網(wǎng)絡(luò)編程概述
計(jì)算機(jī)網(wǎng)絡(luò) 是指將地理位置不同的具有獨(dú)立功能的多臺計(jì)算機(jī)及其外部設(shè)備,通過通信線路連接起來,在網(wǎng)絡(luò)操作系統(tǒng),網(wǎng)絡(luò)管理軟件及網(wǎng)絡(luò)通信協(xié)議的管理和協(xié)調(diào)下,實(shí)現(xiàn)資源共享和信息傳遞的計(jì)算機(jī)系統(tǒng) 網(wǎng)絡(luò)編程 在網(wǎng)絡(luò)通信協(xié)議下,實(shí)現(xiàn)網(wǎng)絡(luò)互連的不同計(jì)算機(jī)上運(yùn)行的程序間可以進(jìn)行數(shù)據(jù)交換
1.2 網(wǎng)絡(luò)編程三要素
IP地址 要想讓網(wǎng)絡(luò)中的計(jì)算機(jī)能夠互相通信,必須為每臺計(jì)算機(jī)指定一個(gè)標(biāo)識號,通過這個(gè)標(biāo)識號來指定要接收數(shù)據(jù)的計(jì)算機(jī)和識別發(fā)送的計(jì)算機(jī),而IP地址就是這個(gè)標(biāo)識號。也就是設(shè)備的標(biāo)識 端口 網(wǎng)絡(luò)的通信,本質(zhì)上是兩個(gè)應(yīng)用程序的通信。每臺計(jì)算機(jī)都有很多的應(yīng)用程序,那么在網(wǎng)絡(luò)通信時(shí),如何區(qū)分這些應(yīng)用程序呢?如果說IP地址可以唯一標(biāo)識網(wǎng)絡(luò)中的設(shè)備,那么端口號就可以唯一標(biāo)識設(shè)備中的應(yīng)用程序了。也就是應(yīng)用程序的標(biāo)識 協(xié)議 通過計(jì)算機(jī)網(wǎng)絡(luò)可以使多臺計(jì)算機(jī)實(shí)現(xiàn)連接,位于同一個(gè)網(wǎng)絡(luò)中的計(jì)算機(jī)在進(jìn)行連接和通信時(shí)需要遵守一定的規(guī)則,這就好比在道路中行駛的汽車一定要遵守交通規(guī)則一樣。在計(jì)算機(jī)網(wǎng)絡(luò)中,這些連接和通信的規(guī)則被稱為網(wǎng)絡(luò)通信協(xié)議,它對數(shù)據(jù)的傳輸格式、傳輸速率、傳輸步驟等做了統(tǒng)一規(guī)定,通信雙方必須同時(shí)遵守才能完成數(shù)據(jù)交換。常見的協(xié)議有UDP協(xié)議和TCP協(xié)議
1.3 IP地址
IP地址:是網(wǎng)絡(luò)中設(shè)備的唯一標(biāo)識
IP地址分為兩大類 IPv4:是給每個(gè)連接在網(wǎng)絡(luò)上的主機(jī)分配一個(gè)32bit地址。按照TCP/IP規(guī)定,IP地址用二進(jìn)制來表示,每個(gè)IP地址長32bit,也就是4個(gè)字節(jié)。例如一個(gè)采用二進(jìn)制形式的IP地址是“11000000 10101000 00000001 01000010”,這么長的地址,處理起來也太費(fèi)勁了。為了方便使用,IP地址經(jīng)常被寫成十進(jìn)制的形式,中間使用符號“.”分隔不同的字節(jié)。于是,上面的IP地址可以表示為“192.168.1.66”。IP地址的這種表示法叫做“點(diǎn)分十進(jìn)制表示法”,這顯然比1和0容易記憶得多 IPv6:由于互聯(lián)網(wǎng)的蓬勃發(fā)展,IP地址的需求量愈來愈大,但是網(wǎng)絡(luò)地址資源有限,使得IP的分配越發(fā)緊張。為了擴(kuò)大地址空間,通過IPv6重新定義地址空間,采用128位地址長度,每16個(gè)字節(jié)一組,分成8組十六進(jìn)制數(shù),這樣就解決了網(wǎng)絡(luò)地址資源數(shù)量不夠的問題 DOS常用命令: ipconfig:查看本機(jī)IP地址 ping IP地址:檢查網(wǎng)絡(luò)是否連通 特殊IP地址: 127.0.0.1:是回送地址,可以代表本機(jī)地址,一般用來測試使用
1.4InetAddress
InetAddress:此類表示Internet協(xié)議(IP)地址
方法名說明 static InetAddress getByName(Stringhost) 確定主機(jī)名稱的IP地址。主機(jī)名稱可以是機(jī)器名稱,也可以是IP地址 String getHostName() 獲取此IP地址的主機(jī)名 String getHostAddress() 返回文本顯示中的IP地址字符串
import java
. net
. InetAddress
;
import java
. net
. UnknownHostException
; public class test1 { public static void main ( String
[ ] args
) throws UnknownHostException
{ InetAddress address
= InetAddress
. getByName ( "58.199.157.8" ) ; String name
= address
. getHostAddress ( ) ; String ip
= address
. getHostAddress ( ) ; System
. out
. println ( "主機(jī)名" + name
) ; System
. out
. println ( "ip地址" + ip
) ; }
}
1.5端口和協(xié)議
端口 設(shè)備上應(yīng)用程序的唯一標(biāo)識 端口號 用兩個(gè)字節(jié)表示的整數(shù),它的取值范圍是065535。其中,0 1023之間的端口號用于一些知名的網(wǎng)絡(luò)服 務(wù)和應(yīng)用,普通的應(yīng)用程序需要使用1024以上的端口號。如果端口號被另外一個(gè)服務(wù)或應(yīng)用所占用,會 導(dǎo)致當(dāng)前程序啟動失敗 協(xié)議 計(jì)算機(jī)網(wǎng)絡(luò)中,連接和通信的規(guī)則被稱為網(wǎng)絡(luò)通信協(xié)議 UDP協(xié)議 用戶數(shù)據(jù)報(bào)協(xié)議(User Datagram Protocol) UDP是無連接通信協(xié)議,即在數(shù)據(jù)傳輸時(shí),數(shù)據(jù)的發(fā)送端和接收端不建立邏輯連接。簡單來說,當(dāng)一臺計(jì)算機(jī)向另外一臺計(jì)算機(jī)發(fā)送數(shù)據(jù)時(shí),發(fā)送端不會確認(rèn)接收端是否存在,就會發(fā)出數(shù)據(jù),同樣接收端在收到數(shù)據(jù)時(shí),也不會向發(fā)送端反饋是否收到數(shù)據(jù)。 由于使用UDP協(xié)議消耗資源小,通信效率高,所以通常都會用于音頻、視頻和普通數(shù)據(jù)的傳輸 例如視頻會議通常采用UDP協(xié)議,因?yàn)檫@種情況即使偶爾丟失一兩個(gè)數(shù)據(jù)包,也不會對接收結(jié)果產(chǎn)生太大影響。但是在使用UDP協(xié)議傳送數(shù)據(jù)時(shí),由于UDP的面向無連接性,不能保證數(shù)據(jù)的完整性,因此在傳輸重要數(shù)據(jù)時(shí)不建議使用UDP協(xié)議 TCP協(xié)議 傳輸控制協(xié)議 (Transmission Control Protocol) TCP協(xié)議是面向連接的通信協(xié)議,即傳輸數(shù)據(jù)之前,在發(fā)送端和接收端建立邏輯連接,然后再傳輸數(shù)據(jù),它提供了兩臺計(jì)算機(jī)之間可靠無差錯(cuò)的數(shù)據(jù)傳輸。在TCP連接中必須要明確客戶端與服務(wù)器端,由客戶端向服務(wù)端發(fā)出連接請求,每次連接的創(chuàng)建都需要經(jīng)過“三次握手” 三次握手:TCP協(xié)議中,在發(fā)送數(shù)據(jù)的準(zhǔn)備階段,客戶端與服務(wù)器之間的三次交互,以保證連接的可靠 第一次握手,客戶端向服務(wù)器端發(fā)出連接請求,等待服務(wù)器確認(rèn) 第二次握手,服務(wù)器端向客戶端回送一個(gè)響應(yīng),通知客戶端收到了連接請求 第三次握手,客戶端再次向服務(wù)器端發(fā)送確認(rèn)信息,確認(rèn)連接 完成三次握手,連接建立后,客戶端和服務(wù)器就可以開始進(jìn)行數(shù)據(jù)傳輸了。由于這種面向連接的特性,TCP協(xié)議可以保證傳輸數(shù)據(jù)的安全,所以應(yīng)用十分廣泛。例如上傳文件、下載文件、瀏覽網(wǎng)頁等
2.UDP通信程序
2.1 UDP發(fā)送數(shù)據(jù)
Java中的UDP通信 UDP協(xié)議是一種不可靠的網(wǎng)絡(luò)協(xié)議,它在通信的兩端各建立一個(gè)Socket對象,但是這兩個(gè)Socket只是發(fā) 送,接收數(shù)據(jù)的對象,因此對于基于UDP協(xié)議的通信雙方而言,沒有所謂的客戶端和服務(wù)器的概念 Java提供了DatagramSocket類作為基于UDP協(xié)議的Socket 構(gòu)造方法
方法名說明 DatagramSocket() 創(chuàng)建數(shù)據(jù)報(bào)套接字并將其綁定到本機(jī)地址上的任何可用端口 DatagramPacket(byte[] buf,int len,InetAddress add,int port) 創(chuàng)建數(shù)據(jù)包,發(fā)送長度為len的數(shù)據(jù)包到指定主機(jī)的指定端口
方法名說明 void send(DatagramPacket p) 發(fā)送數(shù)據(jù)報(bào)包 void close() 關(guān)閉數(shù)據(jù)報(bào)套接字 void receive(DatagramPacket p) 從此套接字接受數(shù)據(jù)報(bào)包
import java
. io
. IOException
;
import java
. net
. *
; public class test2 { public static void main ( String
[ ] args
) throws IOException
{ DatagramSocket ds
= new DatagramSocket ( ) ; byte [ ] bys
= "hello,udp,我來了" . getBytes ( ) ; DatagramPacket dp
= new DatagramPacket ( bys
, bys
. length
, InetAddress
. getByName ( "58.199.157.8" ) , 10086 ) ; ds
. send ( dp
) ; ds
. close ( ) ; }
}
2.2UDP接收數(shù)據(jù)
接收數(shù)據(jù)的步驟 創(chuàng)建接收端的Socket對象(DatagramSocket) 創(chuàng)建一個(gè)數(shù)據(jù)包,用于接收數(shù)據(jù) 調(diào)用DatagramSocket對象的方法接收數(shù)據(jù) 解析數(shù)據(jù)包,并把數(shù)據(jù)在控制臺顯示 關(guān)閉接收端 構(gòu)造方法
方法名說明 DatagramPacket(byte[] buf, int len) 創(chuàng)建一個(gè)DatagramPacket用于接收長度為len的數(shù)據(jù)包
方法名說明 byte[] getData() 返回?cái)?shù)據(jù)緩沖區(qū) int getLength() 返回要發(fā)送的數(shù)據(jù)的長度或接收的數(shù)據(jù)的長度
import java
. io
. IOException
;
import java
. net
. DatagramPacket
;
import java
. net
. DatagramSocket
; public class test3 { public static void main ( String
[ ] args
) throws IOException
{ DatagramSocket ds
= new DatagramSocket ( 13456 ) ; while ( true ) { byte [ ] bys
= new byte [ 1024 ] ; DatagramPacket dp
= new DatagramPacket ( bys
, bys
. length
) ; ds
. receive ( dp
) ; System
. out
. println ( "數(shù)據(jù)是:" + new String ( dp
. getData ( ) , 0 , dp
. getLength ( ) ) ) ; } }
}
2.3UDP通信程序練習(xí)
案例需求 UDP發(fā)送數(shù)據(jù):數(shù)據(jù)來自于鍵盤錄入,直到輸入的數(shù)據(jù)是886,發(fā)送數(shù)據(jù)結(jié)束 UDP接收數(shù)據(jù):因?yàn)榻邮斩瞬恢腊l(fā)送端什么時(shí)候停止發(fā)送,故采用死循環(huán)接收 代碼實(shí)現(xiàn)
public class Send { public static void main ( String
[ ] args
) throws IOException
{ DatagramSocket ds
= new DatagramSocket ( ) ; BufferedReader br
= new BufferedReader ( new InputStreamReader ( System
. in
) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { if ( "886" . equals ( line
) ) { break ; } byte [ ] bys
= line
. getBytes ( ) ; DatagramPacket dp
= new DatagramPacket ( bys
, bys
. length
, InetAddress
. getByName ( "58.199.157.8" ) , 12345 ) ; ds
. send ( dp
) ; } ds
. close ( ) ; }
} import java
. io
. IOException
;
import java
. net
. DatagramPacket
;
import java
. net
. DatagramSocket
;
public class Receive { public static void main ( String
[ ] args
) throws IOException
{ DatagramSocket ds
= new DatagramSocket ( 12345 ) ; while ( true ) { byte [ ] bys
= new byte [ 1024 ] ; DatagramPacket dp
= new DatagramPacket ( bys
, bys
. length
) ; ds
. receive ( dp
) ; System
. out
. println ( "數(shù)據(jù)是:" + new String ( dp
. getData ( ) , 0 , dp
. getLength ( ) ) ) ; }
}
}
3.TCP通信程序
3.1TCP發(fā)送數(shù)據(jù)
Java中的TCP通信 Java對基于TCP協(xié)議的的網(wǎng)絡(luò)提供了良好的封裝,使用Socket對象來代表兩端的通信端口,并通過Socket產(chǎn)生IO流來進(jìn)行網(wǎng)絡(luò)通信。 Java為客戶端提供了Socket類,為服務(wù)器端提供了ServerSocket類 構(gòu)造方法
方法名說明 Socket(InetAddress address,int port) 創(chuàng)建流套接字并將其連接到指定IP指定端口號 Socket(String host, int port) 創(chuàng)建流套接字并將其連接到指定主機(jī)上的指定端口號
方法名說明 InputStream getInputStream() 返回此套接字的輸入流 OutputStream getOutputStream() 返回此套接字的輸出流
3.2TCP接收數(shù)據(jù)
方法名說明 ServletSocket(int port) 創(chuàng)建綁定到指定端口的服務(wù)器套接字
方法名說明 Socket accept() 監(jiān)聽要連接到此的套接字并接受它
import java
. io
. IOException
;
import java
. io
. OutputStream
;
import java
. net
. Socket
; public class Client { public static void main ( String
[ ] args
) throws IOException
{ Socket s
= new Socket ( "58.199.157.8" , 15800 ) ; OutputStream os
= s
. getOutputStream ( ) ; os
. write ( "hello,tcp,我來了" . getBytes ( ) ) ; s
. close ( ) ; }
}
import java
. io
. IOException
;
import java
. io
. InputStream
;
import java
. net
. ServerSocket
;
import java
. net
. Socket
; public class Server { public static void main ( String
[ ] args
) throws IOException
{ ServerSocket ss
= new ServerSocket ( 15800 ) ; Socket s
= ss
. accept ( ) ; InputStream is
= s
. getInputStream ( ) ; byte [ ] bys
= new byte [ 1024 ] ; int len
= is
. read ( bys
) ; String data
= new String ( bys
, 0 , len
) ; System
. out
. println ( "數(shù)據(jù)是:" + data
) ; s
. close ( ) ; ss
. close ( ) ; }
}
3.3TCP通信程序練習(xí)
案例需求 客戶端:發(fā)送數(shù)據(jù),接受服務(wù)器反饋 服務(wù)器:收到消息后給出反饋 案例分析 客戶端創(chuàng)建對象,使用輸出流輸出數(shù)據(jù) 服務(wù)端創(chuàng)建對象,使用輸入流接受數(shù)據(jù) 服務(wù)端使用輸出流給出反饋數(shù)據(jù) 客戶端使用輸入流接受反饋數(shù)據(jù) 代碼實(shí)現(xiàn)
import java
. io
. IOException
;
import java
. io
. InputStream
;
import java
. io
. OutputStream
;
import java
. net
. Socket
; public class Client { public static void main ( String
[ ] args
) throws IOException
{ Socket s
= new Socket ( "58.199.157.8" , 15000 ) ; OutputStream os
= s
. getOutputStream ( ) ; os
. write ( "hello,tcp,我來了" . getBytes ( ) ) ; InputStream is
= s
. getInputStream ( ) ; byte [ ] bys
= new byte [ 1024 ] ; int len
= is
. read ( bys
) ; String data
= new String ( bys
, 0 , len
) ; System
. out
. println ( "客戶端:" + data
) ; s
. close ( ) ; }
} import java
. io
. IOException
;
import java
. io
. InputStream
;
import java
. io
. OutputStream
;
import java
. net
. ServerSocket
;
import java
. net
. Socket
; public class Server { public static void main ( String
[ ] args
) throws IOException
{ ServerSocket ss
= new ServerSocket ( 15000 ) ; Socket s
= ss
. accept ( ) ; InputStream is
= s
. getInputStream ( ) ; byte [ ] bys
= new byte [ 1024 ] ; int len
= is
. read ( bys
) ; String data
= new String ( bys
, 0 , len
) ; System
. out
. println ( "服務(wù)器:" + data
) ; OutputStream os
= s
. getOutputStream ( ) ; os
. write ( "數(shù)據(jù)已經(jīng)收到" . getBytes ( ) ) ; ss
. close ( ) ; }
}
3.4TCP通信程序練習(xí)
案例需求 客戶端:數(shù)據(jù)來自于鍵盤錄入, 直到輸入的數(shù)據(jù)是886,發(fā)送數(shù)據(jù)結(jié)束 服務(wù)端:接收到數(shù)據(jù)在控制臺輸出 案例分析 客戶端創(chuàng)建對象,使用鍵盤錄入循環(huán)接受數(shù)據(jù),接受一行發(fā)送一行,直到鍵盤錄入886為止 服務(wù)端創(chuàng)建對象,使用輸入流按行循環(huán)接受數(shù)據(jù),直到接受到null為止 代碼實(shí)現(xiàn)
import java
. io
. *
;
import java
. net
. Socket
; public class Client { public static void main ( String
[ ] args
) throws IOException
{ Socket s
= new Socket ( "58.199.157.8" , 15000 ) ; BufferedReader br
= new BufferedReader ( new InputStreamReader ( System
. in
) ) ; BufferedWriter bw
= new BufferedWriter ( new OutputStreamWriter ( s
. getOutputStream ( ) ) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { if ( "886" . equals ( line
) ) { break ; } bw
. write ( line
) ; bw
. newLine ( ) ; bw
. flush ( ) ; } s
. close ( ) ; }
} import java
. io
. BufferedReader
;
import java
. io
. IOException
;
import java
. io
. InputStreamReader
;
import java
. net
. ServerSocket
;
import java
. net
. Socket
; public class Server { public static void main ( String
[ ] args
) throws IOException
{ ServerSocket ss
= new ServerSocket ( 15000 ) ; Socket s
= ss
. accept ( ) ; BufferedReader br
= new BufferedReader ( new InputStreamReader ( s
. getInputStream ( ) ) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { System
. out
. println ( line
) ; } ss
. close ( ) ; }
}
3.5TCP通信程序練習(xí)
案例需求 客戶端:數(shù)據(jù)來自于鍵盤錄入,直到輸入的數(shù)據(jù)是886,發(fā)送數(shù)據(jù)結(jié)束 服務(wù)端:接受到的數(shù)據(jù)寫入文本文件中 案例分析 客戶端創(chuàng)建對象,使用鍵盤錄入循環(huán)接受數(shù)據(jù),接受一行發(fā)送一行,直到鍵盤錄入886為止 服務(wù)端創(chuàng)建對象,創(chuàng)建輸出流對象指向文件,每接受一行數(shù)據(jù)后使用輸出流輸出到文件中,直到接受到 null為止 代碼實(shí)現(xiàn)
import java
. io
. *
;
import java
. net
. Socket
; public class Client { public static void main ( String
[ ] args
) throws IOException
{ Socket s
= new Socket ( "58.199.157.8" , 15000 ) ; BufferedReader br
= new BufferedReader ( new InputStreamReader ( System
. in
) ) ; BufferedWriter bw
= new BufferedWriter ( new OutputStreamWriter ( s
. getOutputStream ( ) ) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { if ( "886" . equals ( line
) ) { break ; } bw
. write ( line
) ; bw
. newLine ( ) ; bw
. flush ( ) ; } s
. close ( ) ; }
} import java
. io
. *
;
import java
. net
. ServerSocket
;
import java
. net
. Socket
; public class Server { public static void main ( String
[ ] args
) throws IOException
{ ServerSocket ss
= new ServerSocket ( 15000 ) ; Socket s
= ss
. accept ( ) ; BufferedReader br
= new BufferedReader ( new InputStreamReader ( s
. getInputStream ( ) ) ) ; BufferedWriter bw
= new BufferedWriter ( new FileWriter ( "src\\s.txt" ) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { bw
. write ( line
) ; bw
. newLine ( ) ; bw
. flush ( ) ; } bw
. close ( ) ; ss
. close ( ) ; }
}
3.6TCP通信程序練習(xí)【應(yīng)用】
案例需求 客戶端:數(shù)據(jù)來自于文本文件 服務(wù)器:接收到的數(shù)據(jù)寫入文本文件 案例分析 創(chuàng)建客戶端,創(chuàng)建輸入流對象指向文件,從文件循環(huán)讀取數(shù)據(jù),每讀取一行就使用輸出流給服務(wù)器輸出一行 創(chuàng)建服務(wù)端,創(chuàng)建輸出流對象指向文件,從客戶端接受數(shù)據(jù),每接受一行就給文件中輸出一行 代碼實(shí)現(xiàn)
在這里插入代碼片
3.7TCP通信程序練習(xí)
案例需求 客戶端:數(shù)據(jù)來自于文本文件,接收服務(wù)器反饋 服務(wù)器:接收到的數(shù)據(jù)寫入文本文件,給出反饋 案例分析 創(chuàng)建客戶端對象,創(chuàng)建輸入流對象指向文件,每讀入一行數(shù)據(jù)就給服務(wù)器輸出一行數(shù)據(jù),輸出結(jié)束后使 用shutdownOutput()方法告知服務(wù)端傳輸結(jié)束 創(chuàng)建服務(wù)器對象,創(chuàng)建輸出流對象指向文件,每接受一行數(shù)據(jù)就使用輸出流輸出到文件中,傳輸結(jié)束 后。使用輸出流給客戶端反饋信息 客戶端接受服務(wù)端的回饋信息 相關(guān)方法
方法名說明 void shutdownInput() 將此套接字的輸入流放置在“流的末尾” void shutdownOutput() 禁止用此套接字的輸出流
import java
. io
. *
;
import java
. net
. Socket
; public class Client { public static void main ( String
[ ] args
) throws IOException
{ Socket s
= new Socket ( "58.199.157.8" , 15000 ) ; BufferedReader br
= new BufferedReader ( new InputStreamReader ( System
. in
) ) ; BufferedWriter bw
= new BufferedWriter ( new OutputStreamWriter ( s
. getOutputStream ( ) ) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { bw
. write ( line
) ; bw
. newLine ( ) ; bw
. flush ( ) ; } br
. close ( ) ; s
. close ( ) ; }
} import java
. io
. *
;
import java
. net
. ServerSocket
;
import java
. net
. Socket
; public class Server { public static void main ( String
[ ] args
) throws IOException
{ ServerSocket ss
= new ServerSocket ( 15000 ) ; Socket s
= ss
. accept ( ) ; BufferedReader br
= new BufferedReader ( new InputStreamReader ( s
. getInputStream ( ) ) ) ; BufferedWriter bw
= new BufferedWriter ( new FileWriter ( "src\\s.txt" ) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { bw
. write ( line
) ; bw
. newLine ( ) ; bw
. flush ( ) ; } bw
. close ( ) ; ss
. close ( ) ; }
}
3.8TCP通信程序練習(xí)
案例需求 客戶端:數(shù)據(jù)來自于文本文件,接收服務(wù)器反饋 服務(wù)器:接收到的數(shù)據(jù)寫入文本文件,給出反饋,代碼用線程進(jìn)行封裝,為每一個(gè)客戶端開啟一個(gè)線程 案例分析 創(chuàng)建客戶端對象,創(chuàng)建輸入流對象指向文件,每讀入一行數(shù)據(jù)就給服務(wù)器輸出一行數(shù)據(jù),輸出結(jié)束后使 用shutdownOutput()方法告知服務(wù)端傳輸結(jié)束 創(chuàng)建多線程類,在run()方法中讀取客戶端發(fā)送的數(shù)據(jù),為了防止文件重名,使用計(jì)數(shù)器給文件名編號, 接受結(jié)束后使用輸出流給客戶端發(fā)送反饋信息。 創(chuàng)建服務(wù)端對象,每監(jiān)聽到一個(gè)客戶端則開啟一個(gè)新的線程接受數(shù)據(jù)。 客戶端接受服務(wù)端的回饋信息 代碼實(shí)現(xiàn)
import java
. io
. *
;
import java
. net
. Socket
; public class Client { public static void main ( String
[ ] args
) throws IOException
{ Socket s
= new Socket ( "58.199.157.8" , 15000 ) ; BufferedReader br
= new BufferedReader ( new FileReader ( "src\\fw.txt" ) ) ; BufferedWriter bw
= new BufferedWriter ( new OutputStreamWriter ( s
. getOutputStream ( ) ) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { bw
. write ( line
) ; bw
. newLine ( ) ; bw
. flush ( ) ; } s
. shutdownOutput ( ) ; BufferedReader brClient
= new BufferedReader ( new InputStreamReader ( s
. getInputStream ( ) ) ) ; String data
= brClient
. readLine ( ) ; System
. out
. println ( "服務(wù)器的反饋:" + data
) ; br
. close ( ) ; s
. close ( ) ; }
} import java
. io
. *
;
import java
. net
. Socket
; public class ServerThread implements Runnable { private Socket s
; public ServerThread ( Socket s
) { this . s
= s
; } @Override public void run ( ) { try { BufferedReader br
= new BufferedReader ( new InputStreamReader ( s
. getInputStream ( ) ) ) ; int count
= 0 ; File file
= new File ( "src\\Copy[" + count
+ "].java" ) ; while ( file
. exists ( ) ) { count
++ ; file
= new File ( "src\\Copy[" + count
+ "].java" ) ; } BufferedWriter bw
= new BufferedWriter ( new FileWriter ( file
) ) ; String line
; while ( ( line
= br
. readLine ( ) ) != null
) { bw
. write ( line
) ; bw
. newLine ( ) ; bw
. flush ( ) ; } BufferedWriter bwServer
= new BufferedWriter ( new OutputStreamWriter ( s
. getOutputStream ( ) ) ) ; bwServer
. write ( "文件上傳成功" ) ; bwServer
. newLine ( ) ; bwServer
. flush ( ) ; s
. close ( ) ; } catch ( IOException e
) { e
. printStackTrace ( ) ; } }
} import java
. io
. IOException
;
import java
. net
. ServerSocket
;
import java
. net
. Socket
; public class Server { public static void main ( String
[ ] args
) throws IOException
{ ServerSocket ss
= new ServerSocket ( 15000 ) ; while ( true ) { Socket s
= ss
. accept ( ) ; new Thread ( new ServerThread ( s
) ) . start ( ) ; } }
}
總結(jié)
以上是生活随笔 為你收集整理的Java基础day21 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。