java套接字編程代碼 java的套接字服務(wù)器類

JAVA 套接字

套接字英文翻譯就是Socket,就好像CSS大家不會叫級聯(lián)樣式表一樣,大家也很少吧Socket叫做套接字接口。

目前創(chuàng)新互聯(lián)已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站運(yùn)營、企業(yè)網(wǎng)站設(shè)計、繁昌網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

至于端口是硬件概念,接口是軟件概念。接口是不同的程序(或類)訪問同一個功能所設(shè)定的一種規(guī)范,最好理解的接口怕就是電源插座,無論是空調(diào)還是吸塵器都通用接口。至于端口是網(wǎng)絡(luò)連接時連接的點(diǎn),比如IP地址后面都要有端口,就好像你去一個樓里面找人必須有房間號一樣。

在javasocket網(wǎng)絡(luò)編程中,開發(fā)基于udp協(xié)議的程序使用的套接字有哪些

一、 填空題

___ IP地址____用來標(biāo)志網(wǎng)絡(luò)中的一個通信實(shí)體的地址。通信實(shí)體可以是計算機(jī),路由器等。

統(tǒng)一資源定位符URL是指向互聯(lián)網(wǎng)“資源”的指針,由4部分組成:協(xié)議、存放資源的主機(jī)域名、__端口___和資源路徑和文件名。

URL 是統(tǒng)一資源定位器的簡稱,它表示Internet上某一資源的地址。

在Socket編程中,IP地址用來標(biāo)志一臺計算機(jī),但是一臺計算機(jī)上可能提供多種應(yīng)用程序,使用 端口 來區(qū)分這些應(yīng)用程序。

在Java Socket網(wǎng)絡(luò)編程中,開發(fā)基于TCP協(xié)議的服務(wù)器端程序使用的套接字是 ServerSocket 。

在Java Socket網(wǎng)絡(luò)編程中,開發(fā)基于UDP協(xié)議的程序使用的套接字是 DatagramSocket 。

二、 選擇題

1.以下協(xié)議都屬于TCP/IP協(xié)議棧,其中位于傳輸層的協(xié)議是(AD)。(選擇二項(xiàng))

A TCP

B.HTTP

C.SMTP

D.UDP

2.以下協(xié)議中屬于TCP/IP協(xié)議棧中應(yīng)用層協(xié)議的是(A)。(選擇一項(xiàng))

A HTTP

B.TCP

C.UDP

D.IP

3.以下說法中關(guān)于UDP協(xié)議的說法正確的是(AD)。(選擇二項(xiàng))

A.發(fā)送不管對方是否準(zhǔn)備好,接收方收到也不確認(rèn)

B.面向連接

C.占用系統(tǒng)資源多、效率低

D.非常簡單的協(xié)議,可以廣播發(fā)送

4.在基于TCP網(wǎng)絡(luò)通信模式中,客戶與服務(wù)器程序的主要任務(wù)是(BC)。(選擇二項(xiàng))

A 客戶程序在網(wǎng)絡(luò)上找到一條到達(dá)服務(wù)器的路由

B.客戶程序發(fā)送請求,并接收服務(wù)器的響應(yīng)

C.服務(wù)器程序接收并處理客戶請求,然后向客戶發(fā)送響應(yīng)結(jié)果

D.如果客戶程序和服務(wù)器都會保證發(fā)送的數(shù)據(jù)不會在傳輸途中丟失

5.在Java網(wǎng)絡(luò)編程中,使用客戶端套接字Socket創(chuàng)建對象時,需要指定(A)。(選擇一項(xiàng))

A 服務(wù)器主機(jī)名稱和端口

B.服務(wù)器端口和文件

C.服務(wù)器名稱和文件

D.服務(wù)器地址和文件

6.ServerSocket的監(jiān)聽方法accept( )方法的返回值類型是(A )。(選擇一項(xiàng))

A.Socket

B.Void

C.Object

D.DatagramSocket

7.Java UDP Socket編程主要用到的兩個類是(BD)。(選擇二項(xiàng))

A UDPSocket

B.DatagramSocket

C.UDPPacket

D.DatagramPacket

8.在使用UDP套接字通信時,常用(D)類把要發(fā)送的信息打包。(選擇一項(xiàng))

A String

B.DatagramSocket

C.MulticastSocket

D.DatagramPacket

三、 判斷題

1. Socket是傳輸層供給應(yīng)用層的編程接口,是應(yīng)用層與傳輸層之間的橋梁 。( T )

2. TCP/IP傳輸控制協(xié)議是Internet的主要協(xié)議,定義了計算機(jī)和外設(shè)進(jìn)行通信的規(guī)則。TCP/IP網(wǎng)絡(luò)參考模型包括七個層次:應(yīng)用層、會話層、表示層、傳輸層、網(wǎng)絡(luò)層、鏈路層和物理層。( F )

3. TCP協(xié)議一種面向連接的、可靠的、基于字節(jié)流的通信協(xié)議 。HTTP、FTP、TELNET、SMTP 都是基于TCP協(xié)議的應(yīng)用層協(xié)議。( T )

4. UDP協(xié)議是一種面向無連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,該協(xié)議占用系統(tǒng)資源多、效率較低。( F )

四、 簡答題

1.TCP/IP協(xié)議棧中,TCP協(xié)議和UDP協(xié)議的聯(lián)系和區(qū)別?

2.簡述基于TCP的Socket編程的主要步驟。提示:分別說明服務(wù)器端和客戶端的編程步驟。

3.簡述基于UDP的Socket編程的主要步驟。提示:分別說明服務(wù)器端和客戶端的編程步驟。

五、 編碼題

1.使用基于TCP的Java Socket編程,完成如下功能:

1) 要求從客戶端錄入幾個字符,發(fā)送到服務(wù)器端。

2) 由服務(wù)器端將接收到的字符進(jìn)行輸出。

3) 服務(wù)器端向客戶端發(fā)出“您的信息已收到”作為響應(yīng)。

4) 客戶端接收服務(wù)器端的響應(yīng)信息。

提示:

服務(wù)器端:PrintWriter out =new PrintWriter(socket.getOutputStream(),true);

客戶端:BufferedReader line=new BufferedReader(new InputStreamReader(System.in));

求一個用java編寫的套接字實(shí)現(xiàn)類似于QQ對話的程序,急用

有兩個類,服務(wù)器和客戶端、

服務(wù)器類代碼:

package chat;

import java.io.*;

import java.net.*;

import java.util.*;

/*服務(wù)器類*/

public class Server {

public ListSocket socketList = new ArrayListSocket();//存放所有連接的客戶端的集合

public ServerSocket server;//服務(wù)器

public int portNum;//端口號

public Server(int portNum){

this.portNum = portNum;

}

public void innit(){

try {

server = new ServerSocket(portNum);

System.out.println("服務(wù)器開啟成功!");

int socketNum = 0;

while(true){

Socket socket = server.accept();//被動等待客戶端的連接

socketNum++;

System.out.println("第"+socketNum+"個客戶端連接成功??!");

socketList.add(socket);//連接的客戶端存放到集合里面

new RWThread(socket).start();

}

} catch (IOException e) {

e.printStackTrace();

}

}

class RWThread extends Thread{//接收和發(fā)送消息的線程

public Socket socket;

public RWThread(Socket socket){

this.socket = socket;

}

public void run() {

super.run();

try {

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

while(true){

String message = br.readLine();

System.out.println(message);//接收客戶端發(fā)來的消息

for(int i=0;isocketList.size();i++){//發(fā)送給所有連接的客戶端

PrintWriter pw = new PrintWriter(new OutputStreamWriter(socketList.get(i).getOutputStream()));

pw.println(message);

pw.flush();

}

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

int portNum = 8888;//創(chuàng)建服務(wù)器的端口號

Server server = new Server(portNum);

server.innit();

}

}

客戶端類:

package chat;

import java.io.*;

import java.net.*;

import java.util.*;

/*客戶端類*/

public class Client {

public Socket socket;

public Client(){

Scanner sca = new Scanner(System.in);

try {

socket = new Socket("127.0.0.1",8888);//創(chuàng)建客戶端

new ReadThread(socket).start();//開啟讀取從服務(wù)器端發(fā)來的信息

while(true){

PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));

String message = sca.nextLine();

pw.println(message);//向服務(wù)器發(fā)送信息

pw.flush();

}

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

System.out.println("錯誤:服務(wù)器未開啟!??!");

}

}

class ReadThread extends Thread{//讀取服務(wù)器發(fā)來信息的線程

public Socket socket;

public ReadThread(Socket socket){

this.socket = socket;

}

public void run() {

super.run();

try {

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

while(true){

String message = br.readLine();

System.out.println(message);//輸出信息

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

Client client = new Client();

}

}

現(xiàn)打開服務(wù)器類,然后可以打開多個客戶端進(jìn)行聊天

Java網(wǎng)絡(luò)編程如何初始化套接字

不同的構(gòu)造方法不僅帶的參數(shù)不同,所具有的意義也不一樣。下面分別解析這兩個類的實(shí)例初始化過程。 ServerSocket 實(shí)例的初始化 ServerSocket 類提供了四個構(gòu)造器: public Socket(String host, int port) throws UnknownHostException, IOException public Socket(InetAddress address, int port) throws IOException public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException public Socket() public Socket(Proxy proxy) 帶參構(gòu)造器用來創(chuàng)建已綁定的服務(wù)器套接字,也就是說構(gòu)造成功后它就已經(jīng)開始偵聽指定的端口,且能夠調(diào)用 accept() 方法來接受客戶端連接。默認(rèn)構(gòu)造器則會創(chuàng)建未綁定的服務(wù)器套接字,構(gòu)造成功后必須手動將其綁定到一個本地地址才能用,在綁定之前可以進(jìn)行一些選項(xiàng)配置。 帶參構(gòu)造器 總的來說,帶參構(gòu)造器提供了三個參數(shù): port 指定該服務(wù)器套接字所要偵聽的本地端口。如果為 0,則由系統(tǒng)自動分配一個端口號,這必須以另外的方式讓客戶端獲取端口號。 backlog 這個名詞目前還沒有合適的譯名。底層系統(tǒng)的 TCP 實(shí)現(xiàn)會維護(hù)一個連接隊(duì)列,該隊(duì)列緩存了已被 TCP 處理完畢,但還沒有被服務(wù)器套接字接受的客戶端連接。一旦某個連接被接受(通過調(diào)用 accept() 方法),它就會被從隊(duì)列中移除。backlog 參數(shù)就用于指定隊(duì)列的最大長度,默認(rèn)值為 50,但這個值只是一個建議,底層系統(tǒng)可能根據(jù)需要自動調(diào)整。如果隊(duì)列滿了,則其行為是平臺相關(guān)的:微軟的 WINSOCK 會拒絕新的連接,其他實(shí)現(xiàn)則什么都不做。嚴(yán)格地說,微軟沒有遵守規(guī)范,破壞了游戲規(guī)則…… bindAddr 一臺機(jī)器可能會有多個本地 IP 地址,例如同時使用多塊網(wǎng)卡。使用其他兩個帶參構(gòu)造器時,該參數(shù)為 null,服務(wù)器套接字會在所有的本地 IP 地址(0.0.0.0 或 ::0)上偵聽。如果希望只偵聽一個地址,則可使用該參數(shù)。 默認(rèn)構(gòu)造器 如果使用默認(rèn)構(gòu)造器,在綁定地址前,還可以做些配置。綁定操作由兩個 bind 方法定義,參數(shù)類似于帶參構(gòu)造器。配置項(xiàng)包括以下方面(都必須在綁定前配置): 設(shè)置是否重用本地地址 該選項(xiàng)由 setReuseAddress(boolean on) 方法配置,對應(yīng)底層系統(tǒng)的 SO_REUSEADDR 套接字選項(xiàng)。JDK 沒有定義該選項(xiàng)的默認(rèn)值。如果該選項(xiàng)為 false,則在關(guān)閉 TCP 連接時,為了保證可靠性,該連接可能在關(guān)閉后的一段時間(大約兩分鐘)內(nèi)保持超時狀態(tài)(通常稱為 TIME_WAIT 狀態(tài)或 2MSL 等待狀態(tài)),這段時間里無法將新建的服務(wù)器套接字綁定到同一個地址。在開發(fā)階段,服務(wù)器可能不斷重啟,打開改選項(xiàng)會非常有用。 設(shè)置接收緩沖區(qū)大小 該選項(xiàng)由 setReceiveBufferSize(int size) 方法配置,對應(yīng)底層系統(tǒng)的 SO_RCVBUF 套接字選項(xiàng),單位是字節(jié)?!禦FC 1323 - TCP Extensions for High Performance》將緩沖區(qū)大小定義為 64KB。該選項(xiàng)只是一個建議值,底層系統(tǒng)可能根據(jù)需要自行調(diào)整。 設(shè)置超時值 該選項(xiàng)由 setSoTimeout(int timeout) 方法配置,對應(yīng)底層系統(tǒng)的 SO_TIMEOUT 套接字選項(xiàng),單位是毫秒。默認(rèn)值為 0。該選項(xiàng)影響 accept 方法的阻塞時間長度,如果超時將引發(fā) SocketTimeoutException。如果設(shè)為 0,則表示永不超時。 設(shè)置性能首選項(xiàng) 性能首選項(xiàng)包括連接時間、延遲和帶寬三個選項(xiàng),由 setPerformancePreferences(int connectionTime, int latency, int bandwidth) 方法配置。這三個數(shù)值分別表示短連接時間、低延遲和高帶寬的相對重要性,數(shù)值越大則越重要;其各自的絕對值沒有意義。該方法的初衷是為了讓 Java 能在用非 TCP/IP 實(shí)現(xiàn)的套接字環(huán)境下工作得更好,某些需要對網(wǎng)絡(luò)進(jìn)行調(diào)優(yōu)的程序也可以將這三個首選項(xiàng)作為配置參數(shù)提供給用戶。 Socket 實(shí)例的初始化 Socket 類提供了六個公共構(gòu)造器(已過時的除外): public Socket(String host, int port) throws UnknownHostException, IOException public Socket(InetAddress address, int port) throws IOException public Socket(String host, int port, InetAddress localAddr, int localPort) throws IOException public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException public Socket() public Socket(Proxy proxy) 前四個構(gòu)造器創(chuàng)建已連接的客戶端套接字,也就是說構(gòu)造的時候就會去連接服務(wù)器。前兩個構(gòu)造器需要提供服務(wù)器的地址和端口作為參數(shù),本地地址和端口由系統(tǒng)自動分配;后兩個允許手動指定本地地址和端口,但極少使用。后兩個構(gòu)造器創(chuàng)建未連接的套接字,創(chuàng)建后需要調(diào)用 connect 方法手動連接,連接之前可以做一些配置。最后一個構(gòu)造器接受一個代表代理服務(wù)其的 Proxy 對象,JDK 支持 HTTP 和 SOCKS(V4 或 V5)兩種代理類型。 連接前的配置 在連接前,客戶端套接字不僅像服務(wù)器套接字那樣可以設(shè)置是否重用本地地址、緩沖區(qū)大小、超時值和性能首選項(xiàng),還能夠配置以下各項(xiàng)(都必須在連接前配置): 設(shè)置是否保持活躍 該選項(xiàng)由 setKeepAlive(boolean on) 方法配置,對應(yīng)底層系統(tǒng)的 SO_KEEPALIVE 套接字選項(xiàng)。默認(rèn)值為 false。如果打開該選項(xiàng),則套接字會定期自動發(fā)送保持活躍的探測性消息,類似于心跳檢測。根據(jù)《RFC 1122 - Requirements for Internet Hosts》的規(guī)定,保持活躍機(jī)制只是 TCP 的一個可選功能,如果支持的話,默認(rèn)必須為 false,而且這種機(jī)制默認(rèn)在成功建立連接后,且連續(xù)兩小時沒有數(shù)據(jù)傳輸?shù)那闆r下才會被激活。從另一方面來看,通過套接字的 I/O 操作完全可以知道連接是否還有效,所以該選項(xiàng)的實(shí)用價值不大。 設(shè)置是否收發(fā)帶外數(shù)據(jù) 該選項(xiàng)由 setOOBInline(boolean on) 方法配置,對應(yīng)底層系統(tǒng)的 SO_OOBINLINE 套接字選項(xiàng)。默認(rèn)值為 off。帶外數(shù)據(jù)(Out-of-band Data)也叫做緊急數(shù)據(jù),表示數(shù)據(jù)很重要,需要使用不同于發(fā)送普通數(shù)據(jù)的一個專用通道來發(fā)送。打開該選項(xiàng)后,就可以調(diào)用 sendUrgentData(int data) 方法發(fā)送一個字節(jié)的緊急數(shù)據(jù)。JDK 對帶外數(shù)據(jù)只提供了有限支持,緊急數(shù)據(jù)將會和普通數(shù)據(jù)一起被收到,并且無法自動區(qū)分。該選項(xiàng)對應(yīng)用開發(fā)人員意義不大。 設(shè)置是否從容關(guān)閉連接 該選項(xiàng)由 setSoLinger(boolean on, int linger) 方法配置,對應(yīng)底層系統(tǒng)的 SO_LINGER 套接字選項(xiàng)。默認(rèn)為 false。該選項(xiàng)只會影響套接字的關(guān)閉,其中的 linger 參數(shù)表示超時時間,單位為秒。如果打開改選項(xiàng):如果將 linger 設(shè)為 0,則關(guān)閉套接字的時候,未發(fā)送的數(shù)據(jù)會被丟棄,且另一端會出現(xiàn)連接被同位體重置的異常;如果 linger 非 0,則關(guān)閉套接字的線程將被阻塞,直到數(shù)據(jù)全部發(fā)送或超時,超時后的行為與底層系統(tǒng)相關(guān),JDK 無法控制。如果關(guān)閉該選項(xiàng),則套接字正常關(guān)閉,數(shù)據(jù)也會全部發(fā)送。由于底層實(shí)現(xiàn)的差異性,不提倡應(yīng)用開發(fā)人員打開該選項(xiàng)。 設(shè)置是否延遲發(fā)送數(shù)據(jù) 該選項(xiàng)由 setTcpNoDelay(boolean on) 方法配置,對應(yīng)底層系統(tǒng)的 TCP_NODELAY TCP 選項(xiàng)。默認(rèn)值為 off。打開該選項(xiàng)將禁用 Nagle 算法,TCP 包會立即發(fā)送;關(guān)閉該選項(xiàng)則會啟用 Nagle 算法,多個較小的 TCP 包會被組合成一個大包一起發(fā)送,雖然發(fā)送延遲了,但有利于避免網(wǎng)絡(luò)擁塞。默認(rèn)為 false。該選項(xiàng)對實(shí)時性很強(qiáng)的程序可能有用,但一般的程序不需要關(guān)心。 設(shè)置流量類別 該選項(xiàng)由 setTrafficClass(int tc) 方法配置,對應(yīng)底層系統(tǒng)的“流量類別”套接字屬性。該選項(xiàng)用于向網(wǎng)絡(luò)(例如路由器)提示從該套接字發(fā)送的包需要獲取哪些服務(wù)類型,對本地 TCP 協(xié)議棧沒有影響。IPv4 和 IPv6 分別定義了多個不同的值,例如 IPv4 將 0x08 定義為最大吞吐量,0x10 定義為最小延遲,等等??梢杂没蜻\(yùn)算將多個值合并為一個選項(xiàng)。該選項(xiàng)用來調(diào)整性能,需要根據(jù)實(shí)際情況設(shè)置。由于只是建議值,可能被網(wǎng)絡(luò)忽略。

當(dāng)前名稱:java套接字編程代碼 java的套接字服務(wù)器類
當(dāng)前路徑:http://muchs.cn/article44/dohcdhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、App開發(fā)網(wǎng)站制作、網(wǎng)站設(shè)計公司、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)