




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、使用Java語(yǔ)言還可以編寫底層的網(wǎng)絡(luò)通信程序,這是通過包中提供的Socket類以及ServerSocket等類實(shí)現(xiàn)的。本章討論如何通過 socket使用TCP/IP或UDP協(xié)議實(shí) 現(xiàn)在網(wǎng)絡(luò)上兩個(gè)程序間建立連接并交換數(shù)據(jù)。Java套接字編程機(jī)器標(biāo)識(shí)連接到Internet上的計(jì)算機(jī)使用IP地址或域名來唯一標(biāo)識(shí)一臺(tái)計(jì)算機(jī),在局域網(wǎng)上的計(jì)算機(jī)則可以使用名稱標(biāo)識(shí)。要實(shí)現(xiàn)網(wǎng)絡(luò)通信,首先需要知道計(jì)算機(jī)的地址。在包中提供了 InetAddress類對(duì)象來表示計(jì)算機(jī)地址。InetAddress類沒有提供構(gòu)造方法,要得到一個(gè)InetAddress類對(duì)象,需要使用該類的靜態(tài)方法。 public static Ine
2、tAddress getByName(String host)返回給定主機(jī)名或點(diǎn)分十進(jìn)制表示的主機(jī)的IP地址。 public static InetAddress口 getAllByName(String host)返回給定主機(jī)名或點(diǎn)分十進(jìn)制表示的主機(jī)的所有IP地址數(shù)組。 public static InetAddress getLocalHost() 返回本地主機(jī)的 IP 地址。上述方法在指定的主機(jī)未知時(shí)將拋出UnknownHostException異常。InetAddress類其他方法: public String getHostName()返回該IP地址的主機(jī)名字符串。 public S
3、tring getHostAddress() 返回主機(jī) IP 地址的字符串。 public byte口 getAddress() 返回四個(gè)元素的表示IP地址的字節(jié)數(shù)組。下面程序通過命令行給出一臺(tái)主機(jī)的域名,程序?qū)⑤敵鲈摍C(jī)器的網(wǎng)絡(luò)地址。程序 GetIPAddress.java import .*;public class GetIPAddresspublic static void main(String args) throws Exceptionif(args.length!=1)System.out.println("Usage:GetIPAddress DomainName&q
4、uot;);System.exit; InetAddress address = InetAddress.getByName(args0);System.out.println(address);System.out.println("Name:"+address.getHostName();System.out.println("Address:"+address.getHostAddress(); 要運(yùn)行該程序,機(jī)器必須連到網(wǎng)絡(luò)上。下面是程序運(yùn)行的一個(gè)結(jié)果:包命等奘示苻Ge 11 PftdldrE4i s - JayaC:X>java |Get
5、iPAddi*e&G i-mjw = «cnuw. bhu B edu.c"21m7 . 176 . 3Naoe;ww/bhu.ediucn1Address:210.47 -176.3C:>.I 產(chǎn)圖GetIPAddress程序的運(yùn)行結(jié)果套接字通信在網(wǎng)絡(luò)上,很多應(yīng)用都是采用客戶/服務(wù)器(C/S)結(jié)構(gòu)的。實(shí)現(xiàn)網(wǎng)絡(luò)通信必須將兩臺(tái)機(jī)器連接起來建立一個(gè)雙向通信鏈路,這個(gè)雙向通信鏈路的每一端稱為一個(gè)套接字(socket)。1 .套接字的構(gòu)成我們知道,在Internet上可以使用IP地址唯一標(biāo)識(shí)一臺(tái)主機(jī)。但一臺(tái)主機(jī)可能提供多種 服務(wù),而僅用IP地址還不能唯一
6、標(biāo)識(shí)一個(gè)服務(wù)。因此通常使用一個(gè)整數(shù)來標(biāo)識(shí)該機(jī)器上的某個(gè)服務(wù),這個(gè)整數(shù)就是端口號(hào)(port)。端口號(hào)是用16位整數(shù)標(biāo)識(shí),共有65536個(gè)端口號(hào)。端口號(hào)并不是機(jī)器上實(shí)際存在的物理位置,而是一種軟件上的抽象。端口號(hào)分為兩類。一類是由因特網(wǎng)名字和號(hào)碼指派公司ICANN分配給一些常用的應(yīng)用層程序固定使用白熟知端口( well-known port),其數(shù)值為11024。例如HTTP服務(wù)的端口 號(hào)為80, FTP服務(wù)的端口號(hào)為 21。表1列出了幾種常用的熟知端口號(hào)。表1常用服務(wù)的端口號(hào)服務(wù)FTPTelnetSMTPDNSHTTPSNMP端口號(hào)2123255380161另一類端口為一般端口,用來隨時(shí)分配給請(qǐng)
7、求通信的客戶進(jìn)程。為了在通信時(shí)不致發(fā)生混亂,就必須把端口號(hào)和主機(jī)的IP地址結(jié)合在一起使用。一個(gè)TCP連接由它的兩個(gè)端點(diǎn)來標(biāo)識(shí),而每一個(gè)端點(diǎn)又是由IP地址和端口號(hào)決定的。TCP連接的端點(diǎn)稱為套接字(socket),套接字是由IP地址和端口號(hào)構(gòu)成的,如圖2所示:IP地址端口號(hào)圖2套接字的構(gòu)成這里,3為IP地址,1500為端口號(hào),因此套接字為3, 1500。2 .套接字通信與套接字類一般來說,運(yùn)行在一臺(tái)特定機(jī)器上的某個(gè)服務(wù)器(如HTTP服務(wù)器)都有一個(gè)套接字綁定到該服務(wù)器上。服務(wù)器只是等待、監(jiān)聽客戶的連接請(qǐng)求。在客戶端,客戶機(jī)需要知道運(yùn)行服務(wù)器的主機(jī)名和端口號(hào)
8、。為了建立連接請(qǐng)求, 客戶機(jī)試圖與服務(wù)器機(jī)器上的指定端口號(hào)上的服務(wù)連接,這個(gè)請(qǐng)求過程如圖3所示:seiver圖3客戶向服務(wù)器請(qǐng)求連接client如果正常,服務(wù)器將接受連接請(qǐng)求。一旦接受了請(qǐng)求,服務(wù)器將創(chuàng)建一個(gè)新的綁定到另 一個(gè)端口號(hào)的套接字, 然后使用該套接字與客戶通信。 這樣,服務(wù)器可以使用原來的套接字 繼續(xù)監(jiān)聽連接請(qǐng)求,如圖 4所示。圖4服務(wù)器接受客戶的連接在客戶端,如果連接被接受,就會(huì)創(chuàng)建一個(gè)套接字(socket),客戶就可以使用該套接字與服務(wù)器通信。注意,客戶端的套接字并沒有綁定到與服務(wù)器連接的端口號(hào)上,相反客戶被指定客戶程序所在機(jī)器上的一個(gè)端口號(hào)上。現(xiàn)在客戶與服務(wù)器就可以讀寫套接字進(jìn)
9、行通信 了。為了實(shí)現(xiàn)套接字通信,在 包中提供了兩個(gè)類:Socket和ServerSocket。它們分別實(shí)現(xiàn)連接的客戶端和服務(wù)器端的套接字。Socket類的常用構(gòu)造方法: public Socket (String host, int port) throws UnknownHostException , lOException 創(chuàng)建 一個(gè)流式套接字對(duì)象并將其連接到命名主機(jī)的指定端口上。host為主機(jī)名,port為端口號(hào)。 public Socket (InetAddress address, int port) throws IOException 創(chuàng)建一個(gè)流式套接 字對(duì)象并將其連接到指定IP
10、地址的指定端口上。address為主機(jī)的IP地址,port為端口號(hào)。 public Socket (String host, int port, InetAddress localAddr, int localPort) throws IOException public Socket (InetAddress address, int port, InetAddress localAddr, int localPort) throws IOExceptionSocket類提供的主要方法有: public InetAddress getInetAddress() 返回該套接字所連接的IP 地址
11、。 public int getPort()返回該套接字所連接的遠(yuǎn)程端口號(hào)。 public synchronized void close() throws IOException 關(guān)閉套接字對(duì)象。 public InputStrean getInputStream() throws IOException 獲得套接字綁定的數(shù)據(jù)輸入 public OutputStream getOutputStream() throws IOException 獲得套接字綁定的數(shù)據(jù) 輸出流。ServerSocket類用在服務(wù)器端??蛻襞c服務(wù)器通信,客戶向服務(wù)器提出請(qǐng)求,服務(wù)器監(jiān) 聽請(qǐng)求,一旦監(jiān)聽到客戶請(qǐng)求,服
12、務(wù)器也要建立一個(gè)套接字。這可通過ServerSocket類實(shí)現(xiàn)。ServerSocket類的構(gòu)造方法如下: ServerSocket(int port)創(chuàng)建綁定到指定端口port上的服務(wù)器套接字。 ServerSocket(int port ,int backlog) 參數(shù)backlog指定最大的隊(duì)列數(shù),即服務(wù)器所能支持的最大連接數(shù)。 ServerSocket(int port ,int backlog, InetAddress bindAddr)參數(shù) bindAddr 為所綁定的 地址。上面的構(gòu)造方法都聲明了拋出©Exception異常,因此創(chuàng)建對(duì)象時(shí)應(yīng)該捕獲異?;蚵暶鲯伋霎惓?。注
13、意,因?yàn)橛行┒丝谔?hào)已被特殊的服務(wù)占用,所以應(yīng)該選擇大于1024的端口號(hào)。ServerSocket類提供的主要方法: public Socket accept。throws IOException 該方法是 ServerSocket 類的重要方法,調(diào) 用該方法將阻塞當(dāng)前系統(tǒng)服務(wù)線程,直到有客戶連接。當(dāng)有客戶連接時(shí),該方法返 回一個(gè)Socket對(duì)象。正是通過該 Socket對(duì)象,服務(wù)器才可以與客戶通信。 public void close() throws IOException 關(guān)閉 ServerSocket對(duì)象。3. 一個(gè)簡(jiǎn)單的客戶和服務(wù)器通信的實(shí)例無論一個(gè)套接字的通信功能多么齊全、程序多么復(fù)
14、雜,其基本結(jié)構(gòu)都是一樣的,都包括以下四個(gè)基本步驟:(1)創(chuàng)建socket對(duì)象;(2)打開連接到socket的輸入輸出流;(3)按照一定協(xié)議對(duì) socket進(jìn)行讀寫操作;(4)關(guān)閉 socketo圖5說明了服務(wù)器和客戶端所發(fā)生的動(dòng)作。服務(wù)器端ServerSocket(port #) ss.accept() 得到socket對(duì)象OutputStreamInputStream close()客戶端Socket(host,port #)得到socket對(duì)象OutputStreamInputStreamclose()圖5通信雙方建立連接的過程在服務(wù)器端,首先指定一個(gè)端口號(hào),創(chuàng)建一個(gè)ServerSocke
15、t對(duì)象。然后調(diào)用 accept()方法等待客戶連接。如果客戶請(qǐng)求一個(gè)連接,服務(wù)器使用accept()方法將返回一個(gè)Socket對(duì)象。在客戶端,用指定的服務(wù)器主機(jī)名或IP地址及端口號(hào)創(chuàng)建一個(gè) Socket對(duì)象,該對(duì)象試圖連接到指定主機(jī)指定端口的服務(wù)。當(dāng)兩端都返回Socket對(duì)象后,就可以分別在 Socket對(duì)象上調(diào)用 getInputStream()和getOutputStream()方法,得到輸入輸出流對(duì)象。這里要注意,服務(wù)器端的輸出流對(duì)應(yīng)于客戶 端的輸入流,服務(wù)器端的輸入流對(duì)應(yīng)于客戶端的輸出流。雙方建立了輸入輸出流后就可以進(jìn)行通信了。最后,通信結(jié)束應(yīng)該調(diào)用close()方法關(guān)閉套接字,釋放連
16、接的資源。下面是一個(gè)簡(jiǎn)單的字符界面的聊天程序。在服務(wù)器端使用端口號(hào)4700創(chuàng)建服務(wù)器套接字。服務(wù)器端程序如下:程序 ServerDemo.javaimport java.io.*;import .*;public class ServerDemopublic static void main(String args口兒tryServerSocket server = new ServerSocket(4700);Socket socket = server.accept();String line;BufferedReader is = new BufferedReader(new Input
17、StreamReader( socket.getInputStream();PrintWriter os = new PrintWriter( socket.getOutputStream();BufferedReader sin = new BufferedReader(new InputStreamReader( System.in);System.out.println("Client:"+ is.readLine();System.out.print("Server:");line=sin.readLine();while(!line.equal
18、s("bye")os.println(line);os.flush();System.out.println("Client:"+is.readLine();System.out.print("Server:");line=sin.readLine();sin.close();os.close();is.close();socket.close();server.close();catch(Exception e)System.out.println("Error:"+e);客戶端端程序如下:程序 ClientDe
19、mo.javaimport java.io.*;import .*;public class ClientDemopublic static void main(String args口兒trySocket socket=new Socket(" server",4700);BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream();PrintWriter os=new PrintWriter(socket.getOutputStream();BufferedReade
20、r sin=new BufferedReader(new InputStreamReader(System.in);String readline;System.out.print("Client:");readline=sin.readLine();while(!readline.equals("bye")os.println(readline);os.flush();System.out.println("Server:"+is.readLine();System.out.print("Client:");re
21、adline=sin.readLine();sin.close();os.close();is.close();socket.close();catch(Exception e)System.out.println("Error:"+e);該程序首先建立一個(gè) Socket對(duì)象,其中“server”為服務(wù)器機(jī)器名,4700為服務(wù)器提供 連接服務(wù)的端口號(hào)。如果在一個(gè)機(jī)器上測(cè)試該程序,可以將“ server”改為所在機(jī)器的名稱 或使用“l(fā)ocalhost”,也可以使用“ ”地址。要測(cè)試該程序,應(yīng)該首先運(yùn)行服務(wù)器程序,然后運(yùn)行客戶程序,并且客戶程序先向服務(wù)器發(fā)送消
22、息。圖6和7分別給出了該程序的運(yùn)行效果。圖6服務(wù)器端程序運(yùn)行效果Clientare 叩u?SeFwei*'Fine.yen!Client-I 口I 乂 I圖7客戶端程序運(yùn)行效果4.為多個(gè)客戶提供服務(wù)在上面的例子中,服務(wù)器只能為一個(gè)客戶提供服務(wù)。在實(shí)際應(yīng)用中,往往是在服務(wù)器機(jī)器上運(yùn)行一個(gè)服務(wù)器,它接收來自其他多個(gè)客戶的請(qǐng)求,為多個(gè)客戶提供服務(wù)。下面程序提供的功能是客戶程序向服務(wù)器發(fā)送一個(gè)表示圓的半徑的數(shù),服務(wù)器為其計(jì)算圓的面積并將計(jì)算結(jié)果發(fā)送給客戶。這里為實(shí)現(xiàn)服務(wù)器為多個(gè)客戶服務(wù),使用了多線程的機(jī)制。下面是服務(wù)器端程序:程序 MultiThreadServer.javaimport ja
23、va.io.*;import .*;public static voidmain(String口args)tryServerSocket serverSocket = new ServerSocket(8000);int clientNo=1;while(true)Socket connectToClient = serverSocket.accept();System.out.println("Start thread for client "+clientNo);InetAddress clientInetAddress = connectToClient.getIne
24、tAddress();System.out.println("Client "+clientNo+" 's host name is " +clientInetAddress.getHostName();System.out.println("Client "+clientNo+" 's IP address is " +clientInetAddress.getHostAddress();HandleClient thread = new HandleClient(connectToClient)
25、; thread.start();clientNo+;catch(IOException ex) System.err.println(ex);class HandleClient extends Threadprivate Socket connectToClient;public HandleClient(Socket socket) connectToClient = socket;public void run()tryDataInputStream isFromClient = new DataInputStream( connectToClient. getInputStream(
26、);DataOutputStream osToClient = new DataOutputStream( connectToClient. getOutputStream();while(true)double radius = isFromClient.readDouble();System.out.println("radius received from client:"+radius); double area = radius*radius*Math.PI;osToClient.writeDouble(area);osToClient.flush();Syste
27、m.out.println("Area is:"+area);catch(IOException ex)System.err.println(ex);下面是客戶端程序:程序 Client.javaimport java.io.*;import .*;import java.util.*;public class Clientpublic static voidmain(String口args)trySocket connectToServer = new Socket("localhost",8000);DataInputStream isFromSer
28、ver = new DataInputStream( connectToServer.getInputStream();DataOutputStream osToServer = new DataOutputStream( connectToServer.getOutputStream();while(true)System.out.print("Please input a radius:");Scanner sc = new Scanner(System.in);double radius = sc.nextDouble();osToServer.writeDouble
29、(radius);osToServer.flush();double area = isFromServer.readDouble();System.out.println("Area received from server:"+area); catch(IOException ex)System.err.println(ex);該程序的運(yùn)行結(jié)果如圖 6和7所示:圖6服務(wù)器端程序運(yùn)行效果圖7客戶端程序運(yùn)行效果數(shù)據(jù)包通信上一節(jié)講的socket通信是一種流式通信,本節(jié)討論通過socket實(shí)現(xiàn)數(shù)據(jù)包通信。1流式通信和數(shù)據(jù)包通信當(dāng)編寫網(wǎng)絡(luò)程序時(shí),有兩種通信可供選擇:流式通信和數(shù)據(jù)
30、包通信。流式通信使用TCP(Transfer Control Protocol)協(xié)議,該協(xié)議是面向連接的協(xié)議。使用這 種協(xié)議要求發(fā)送方和接收方都要建立socket連接,一旦兩個(gè) socket建立起來,它們就可以進(jìn)行雙向通信,雙方都可以發(fā)送和接收數(shù)據(jù)。數(shù)據(jù)包通信使用用戶數(shù)據(jù)包協(xié)議UDP(User Datagram Protocol),該協(xié)議是一種無連接的協(xié)議。使用這種協(xié)議通信,每個(gè)數(shù)據(jù)包都是一個(gè)獨(dú)立的信息單元,它包括完整的目的地址, 數(shù)據(jù)包在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此數(shù)據(jù)能否到達(dá)目的地、到達(dá)的時(shí)間以及內(nèi)容的正確性都是不能保證的,該協(xié)議提供的是不可靠的服務(wù)。在網(wǎng)絡(luò)的傳輸層既然提供了兩種
31、協(xié)議,那么在實(shí)際的應(yīng)用中到底應(yīng)該使用哪種協(xié)議?這要取決于不同的應(yīng)用情況,下面是兩種協(xié)議的比較:使用UDP時(shí),每個(gè)數(shù)據(jù)包都給出了完整的地址信息,因此無需建立發(fā)送方和接收方的連接。對(duì)于TCP,由于它是一個(gè)面向連接的協(xié)議,在通信之前必須建立雙方的連接,因此在TCP中多了一個(gè)建立連接的時(shí)間。使用UDP傳輸數(shù)據(jù)時(shí)是有大小限制的,每個(gè)數(shù)據(jù)包必須不大于64KB。而使用TCP就沒有這方面的限制,一旦連接建立起來,就可以傳輸大量的數(shù)據(jù)。UDP是不可靠的協(xié)議,發(fā)送方發(fā)送的數(shù)據(jù)不一定以相同的次序到達(dá)接收方。而TCP是可靠的協(xié)議,它確保接收方完全正確地獲取發(fā)送方所發(fā)送的數(shù)據(jù)。TCP使用較廣泛,如TELNET遠(yuǎn)程登錄、
32、FTP文件傳輸都需要不定長(zhǎng)度的數(shù)據(jù)可靠 地傳輸,因此需要使用 TCP協(xié)議。相比之下 UDP比較簡(jiǎn)單,而且僅需要較少的監(jiān)護(hù),因此 常用于局域網(wǎng)分散系統(tǒng)中的 client/server應(yīng)用程序。2 DatagramSocket 和 DatagramPacket 包提供了 DatagramSocket 類和 DatagramPacket 類,DatagramSocket 用于在程序 之間建立傳送數(shù)據(jù)包的通信連接, DatagramPacket則用來表示一個(gè)數(shù)據(jù)包。 利用這兩個(gè)類程 序員可以很方便地編寫使用 UDP協(xié)議的socket客戶和服務(wù)器通信程序。1. DatagramSocket 類Datag
33、ramSocket類的構(gòu)造方法有: public DatagramSocket(int port) throws SocketException創(chuàng)建一個(gè)數(shù)據(jù)包套接字,并將它綁定在本地主機(jī)指定的的端口上。 public DatagramSocket。throws SocketException 創(chuàng)建一個(gè)數(shù)據(jù)包套接字,并將它綁 定在本地主機(jī)一個(gè)可用的端口上。DatagramSocket類的常用方法有: public void receive(DatagramPacket p) throws IOException該方法用來接收一個(gè)報(bào)文, 參數(shù)p用來保存接收的報(bào)文。 該方法會(huì)阻塞接收者, 直到有 一
34、個(gè)報(bào)文到達(dá)套接字。 為了防止對(duì)方由于某種原因可能使接收者永遠(yuǎn)阻塞,一般接收者設(shè)置一個(gè)計(jì)時(shí)器,如果收不到對(duì)方報(bào)文,計(jì)時(shí)器結(jié)束,接收者會(huì)作出處理。 public void send(DatagramPacket p) throws IOException該方法用來發(fā)送一個(gè)報(bào)文,參數(shù) p保存了要發(fā)送的報(bào)文。報(bào)文包括數(shù)據(jù)、接收者的IP地址及其端口。2. DatagramPacket 類DatagramPacket類的構(gòu)造方法有:ppublic DatagramPacket(byte口 buf, int length)參數(shù)buf為數(shù)據(jù)包文緩沖區(qū),length為緩沖區(qū)的長(zhǎng)度。該構(gòu)造方法創(chuàng)建的對(duì)象用于接收
35、數(shù)據(jù)包。在接受數(shù)據(jù)之前,應(yīng)該使用該構(gòu)造方法創(chuàng)建一個(gè)DatagramPacket對(duì)象,給出接收數(shù)據(jù)的緩沖區(qū)及長(zhǎng)度。然后調(diào)用DatagramSocket的receive。方法等待數(shù)據(jù)包的到來,receive。方法將一直等待,直到有一個(gè)數(shù)據(jù)包到來。例如:DatagramPacket packet = new DatagramPacket(buf,1024);socket.receive(packet); public DatagramPacket(byte buf, int length, InetAddress address, int port)參數(shù)buf為數(shù)據(jù)包文緩沖區(qū),length為緩沖區(qū)的
36、長(zhǎng)度,address為接收方的地址,port為 接收方數(shù)據(jù)包套接字綁定的端口號(hào)。該構(gòu)造方法創(chuàng)建的對(duì)象用于發(fā)送數(shù)據(jù)包。在發(fā)送數(shù)據(jù)前,也要生成一個(gè)新的一個(gè) DatagramPacket對(duì)象,在給出發(fā)送方的數(shù)據(jù)緩 沖區(qū)及長(zhǎng)度的同時(shí),還要給出完整的目標(biāo)地址,包括 IP地址和端口號(hào)。發(fā)送數(shù)據(jù)是通過 DatagramSocket的send()方法實(shí)現(xiàn)的,send()方法根據(jù)目的地址選擇路徑,以傳送數(shù)據(jù)包。 例如:DatagramPacket packet = new DatagramPacket(msg, send.length(), clientIP, clientPort);socket.send(p
37、acket);DatagramPacket類的常用方法有: public InetAddress getAddress()獲得報(bào)文發(fā)送者的IP 地址。 public int getPort()獲得報(bào)文發(fā)送者的端口。 public int getLength()返回發(fā)送或接收的數(shù)據(jù)長(zhǎng)度。 public byte getData() 返回?cái)?shù)據(jù)緩沖區(qū)。3 一個(gè)簡(jiǎn)單的數(shù)據(jù)包通信的例子用數(shù)據(jù)包編寫客戶/服務(wù)器程序時(shí),無論是客戶方還是服務(wù)器方,首先都要建立一個(gè) DatagramSocket對(duì)象,用來接收或發(fā)送數(shù)據(jù)包,然后使用DatagramPacket類對(duì)象作為傳輸數(shù)據(jù)的載體。下面的實(shí)例通過 UDP實(shí)現(xiàn)通
38、信。該實(shí)例實(shí)現(xiàn)的功能是客戶端向服務(wù)器端發(fā)送一個(gè)字符 串,服務(wù)器端接收該字符串,然后將其轉(zhuǎn)換成大寫字母,再發(fā)送到客戶端。1 .服務(wù)器方的實(shí)現(xiàn)程序 UDPServer.javaimport .*;import java.io.*;public class UDPServerpublic static void main(String args口兒byte buf = new byte1024;tryDatagramSocket socket = new DatagramSocket(8888);System.out.println("Server is waiting.");w
39、hile(true)用于接收數(shù)據(jù)的數(shù)據(jù)包DatagramPacket packet = new DatagramPacket(buf,1024);socket.receive(packet);String data = new String(buf,0,packet.getLength();if(data.equals("bye")break;System.out.println("Client said:"+data);String send = data.toUpperCase();InetAddress clientIP = packet.getA
40、ddress();int clientPort = packet.getPort();byte口 msg = send.getBytes();用于發(fā)送數(shù)據(jù)的數(shù)據(jù)包DatagramPacket sendPacket = new DatagramPacket( msg,send.length(),clientIP,clientPort);socket.send(sendPacket);socket.close();System.out.println("Server is closed.");catch(Exception e)e.printStackTrace();2 .客戶
41、方的實(shí)現(xiàn)程序 UDPClient.javaimport .*;import java.io.*;public class UDPClientpublic static void main(String args口兒byte bufsend = null;String sendMessage = null;tryDatagramSocket socket = new DatagramSocket();BufferedReader sysin = new BufferedReader( new InputStreamReader(System.in);while(true)System.out.p
42、rintln("Waiting for input a line text."); sendMessage = sysin.readLine();bufsend = sendMessage.getBytes();用于發(fā)送數(shù)據(jù)的數(shù)據(jù)包DatagramPacket packet = new DatagramPacket( bufsend,sendMessage.length(), InetAddress.getLocalHost(),8888);socket.send(packet);if(sendMessage.equals("bye") break;by
43、te bufrec=new byte1024;用于接收數(shù)據(jù)的數(shù)據(jù)包DatagramPacket receivePacket = new DatagramPacket(bufrec,1024);socket.receive(receivePacket);String received = new String(receivePacket.getData();System.out.println("From Server:"+received);socket.close();catch(Exception e) e.printStackTrace();該程序的運(yùn)行結(jié)果如圖 8和
44、9所示:-joljdL :Fi. 1 a-sMiikoi- S e £tw u"a JCr nt or ¥3 liScrwcr is wait.Client said:what you see is uhat you get«圖8服務(wù)器端程序運(yùn)行效果二:¥ i. lasMinox- S e £ tv ua A JCi- ih nt or IT3 li-glxlWait ingi for input a line text.what von see is what you get. Fn Server=WMftT YOU SEE IS
45、UHftT VOU GET,圖9客戶端程序運(yùn)行效果作業(yè):3 .簡(jiǎn)述什么是套接字?它由哪些部分組成?它有什么作用?4 .套接口是為下面哪一項(xiàng)編碼?()A.端口號(hào)B. IP地址C.端口號(hào)和IP地址D.都不是5 .為了等待客戶的一個(gè)連接請(qǐng)求,服務(wù)器應(yīng)該使用下面哪個(gè)類?()A. SocketB. SocketServerC. ServerD. URL6 .當(dāng)使用帶一個(gè)主機(jī)地址參數(shù)的構(gòu)造方法創(chuàng)建一個(gè)新的Socket實(shí)例時(shí):(A. Java試圖在Internet上建立一個(gè)與該主機(jī)的連接。B. Java啟動(dòng)一個(gè)運(yùn)行在該主機(jī)上的一個(gè)服務(wù)器。C.直到調(diào)用了 Socket的accept。方法,否則什么也不會(huì)發(fā)生。
46、A. sock.accept();C. sock.getOutputStream();7. 對(duì)一個(gè)給定的 Socket對(duì)象sock,為了獲得一個(gè)輸出流,下面哪個(gè)語(yǔ)句是正確的? )B. sock.getDataOutputStream();D. new DataOutputStream(sock);8. ServerSocket的accept。方法返回的類型是()。A. SocketB.ServerSocketC. ServerD.URL9. TCP 主要用于() 。A. 在 Internet 上標(biāo)識(shí)基于點(diǎn)分十進(jìn)制的地址或域名。B. 保證數(shù)據(jù)包按照發(fā)送的順序到達(dá)。C. A 和 B 都正確D. A 和 B 都不正確12.利用Java的JFrame類實(shí)現(xiàn)一個(gè)圖形用戶界面的程序,它的功能是接受用戶輸入的 一個(gè)主機(jī)名,利用InetAddress 類查找出它的IP 地址并顯示出來。14. 利用 Socket 類和 ServerSocket 類編寫一對(duì)客戶機(jī)/服務(wù)器程序,建立套接字通信管道,并將一個(gè)文件從一臺(tái)機(jī)器傳到另一臺(tái)機(jī)器。17分析以下網(wǎng)絡(luò)通信多線程程序功能。/SocketServer.javaimport .*;import java.io.*;public class
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中班體格鍛煉家長(zhǎng)配合計(jì)劃
- 餐飲連鎖財(cái)務(wù)人員培訓(xùn)方案計(jì)劃
- 2025屆高三英語(yǔ)早讀專項(xiàng)計(jì)劃
- 自閉癥自理能力培養(yǎng)訓(xùn)練計(jì)劃
- 酒店服務(wù)創(chuàng)新商業(yè)計(jì)劃書范文
- 蘇教版一年級(jí)下冊(cè)數(shù)學(xué)教學(xué)方法計(jì)劃
- 小學(xué)科學(xué)實(shí)驗(yàn)課程開發(fā)計(jì)劃
- 人教版三年級(jí)上冊(cè)數(shù)學(xué)知識(shí)點(diǎn)整合計(jì)劃
- 腹部瘢痕的護(hù)理查房
- 七年級(jí)第一學(xué)期體育課教學(xué)互動(dòng)計(jì)劃
- GMP附錄-細(xì)胞治療產(chǎn)品
- 2025年中國(guó)烘焙食品行業(yè)發(fā)展深度分析及行業(yè)發(fā)展趨勢(shì)報(bào)告
- 專業(yè)燒烤店管理制度
- 節(jié)能降耗與循環(huán)利用相結(jié)合的金屬冶煉工業(yè)優(yōu)化策略-洞察闡釋
- 中國(guó)保險(xiǎn)行業(yè)發(fā)展分析及發(fā)展前景與投資研究報(bào)告2025-2028版
- 2025年衛(wèi)生系統(tǒng)招聘考試(護(hù)理學(xué)專業(yè)知識(shí))新版真題卷(附詳細(xì)解析)
- 少兒編程運(yùn)營(yíng)方案
- 2008-2024年江蘇省連云港贛榆區(qū)事業(yè)單位考試《綜合知識(shí)與能力素質(zhì)》真題試卷及答案
- 貴州省貴陽(yáng)市觀山湖區(qū)2023-2024學(xué)年四年級(jí)下學(xué)期數(shù)學(xué)期末試卷(含答案)
- 2025年6月8日內(nèi)蒙古呼倫貝爾市事業(yè)單位面試真題及答案解析
- 公司客戶開發(fā)管理制度
評(píng)論
0/150
提交評(píng)論