當前位置:首頁 » 編程語言 » javasocket編程

javasocket編程

發布時間: 2023-07-14 13:17:44

❶ 在javasocket網路編程中,開發基於udp協議的程序使用的套接字有哪些

Socket套接字,是由系統提供用於網路通信的技術(操作系統給應用程序提供的一組API叫做Socket API),是基於TCP/IP協議的網路通信的基本操作單元。基於Socket套接字的網路程序開發就是網路編程。

socket可以視為是應用層和傳輸層之間的通信橋梁;
傳輸層的核心協議有兩種:TCP,UDP;socket API也有對應的兩組,由於TCP和UDP協議差別很大,因此,這兩組API差別也挺大。

分類:
Socket套接字主要針對傳輸層協議劃分為如下三類:

流套接字:使用傳輸層TCP協議
TCP,即Transmission Control Protocol(傳輸控制協議),傳輸層協議;
TCP的特點:

有連接:像打電話,得先接通,才能交互數據;
可靠傳輸:傳輸過程中,發送方知道接收方有沒有收到數據.(打電話就是可靠傳輸);
面向位元組流:以位元組為單位進行傳輸.(非常類似於文件操作中的位元組流);
全雙工:一條鏈路,雙向通信;
有接收緩沖區,也有發送緩沖區。
大小不限
對於位元組流來說,可以簡單的理解為,傳輸數據是基於IO流,流式數據的特徵就是在IO流沒有關閉的情況下,是無邊界的數據,可以多次發送,也可以分開多次接收。

數據報套接字:使用傳輸層UDP協議
UDP,即User Datagram Protocol(用戶數據報協議),傳輸層耐侍圓協議。
UDP的特點:

無連接:像發微信,不需要接通,直接就能發數據;
不可靠傳輸:傳輸過程中,發送方不知道接收方有沒有收到數據.(發微信就是不可靠傳輸);
面向數據報:以數據報為單位進行傳輸(一個數據報都會明確大小)一次發送/接收必須是一個完整的數據報,不能是半個,也不能是一個半;
全雙工:一條鏈路,雙向通信;
有接收緩沖區,無發送緩沖區;
大小受限:一次最多傳輸64k;
對於數據報來說,可以簡單的理解為,傳輸數據是一塊一塊的,發送一塊數據假如100個位元組,必須一次發送,接收也必須一次接收100個位元組,談州而不能分100次,每次接收1個位元組。

原始套接字
原始套接字用於自定義傳輸層協議,用於讀寫內核沒有處理的IP協議數據。

二、UDP數據報套接字編程
UDPSocket中,主要涉及到兩類:DatagramSocket、DatagramPacket;

DatagramSocket API
DatagramSocket 創建了一個UDP版本的Socket對象,用於發送和接收UDP數據報,代表著操作系統中的一個socket文件,(操作系統實現的功能–>)代表著網卡硬體設備的抽象體現。

DatagramSocket 構造方法:

方法簽名 方法說明
DatagramSocket() 創建一個UDP數據報套接字的Socket,綁定到本機任意一個隨機埠(一般用於客戶端)
DatagramSocket(int port) 創建一個UDP數據報套接字的Socket,綁定到本機指定的埠(一般用於服務端)
DatagramSocket 方法:

方法簽名 方法說明
void receive(DatagramPacket p) 從此套接字接收數據報(如果沒有接收到數據報,該方法昌塌會阻塞等待)
void send(DatagramPacket p) 從此套接字發送數據報包(不會阻塞等待,直接發送)
void close() 關閉此數據報套接字
DatagramPacket API
代表了一個UDP數據報,是UDP Socket發送和接收的數據報,每次發送/接收數據報,都是在傳輸一個DatagramPacket對象。

DatagramPacket 構造方法:

方法簽名 方法說明
DatagramPacket(byte[] buf, int length) 構造一個DatagramPacket以用來接收數據報,接收的數據保存在位元組數組(第一個參數buf)中,接收指定長度(第二個參數length)
DatagramPacket(byte[] buf, int offset, int length,SocketAddress address) 構造一個DatagramPacket以用來發送數據報,發送的數據為位元組數組(第一個參數buf)中,從0到指定長度(第二個參數length)。address指定目的主機的IP和埠號
DatagramPacket 方法:

方法簽名 方法說明
InetAddress getAddress() 從接收的數據報中,獲取發送端主機IP地址;或從發送的數據報中,獲取接收端主機IP地址
int getPort() 從接收的數據報中,獲取發送端主機的埠號;或從發送的數據報中,獲取接收端主機埠號
byte[] getData() 獲取數據報中的數據
構造UDP發送的數據報時,需要傳入 SocketAddress ,該對象可以使用 InetSocketAddress 來創建。

InetSocketAddress API
InetSocketAddress ( SocketAddress 的子類 )構造方法:

方法簽名 方法說明
InetSocketAddress(InetAddress addr, int port) 創建一個Socket地址,包含IP地址和埠號
示例1:寫一個簡單的客戶端服務程序,回顯服務(EchoSever)
在這里插入圖片描述
構建Socket對象有很多失敗的可能:

埠號已經被佔用,同一個主機的兩個程序不能有相同的埠號(這就好比兩個人不能擁有相同的電話號碼);
此處,多個進程不能綁定同一個埠號,但是一個進程可以綁定多個埠,(這就好比一個人可以擁有多個手機號),一個進程可以創建多個Socket對象,每個Socket都綁定自己的埠。
每個進程能夠打開的文件個數是有上限的,如果進程之間已經打開了很多文件,就可能導致此時的Socket文件不能順利打開;
在這里插入圖片描述
這個長度不一定是1024,假設這里的UDP數據最長是1024,實際的數據可能不夠1024.

在這里插入圖片描述
這里的參數不再是一個空的位元組數組了,response是剛才根據請求計算的得到的響應,是非空的,DatagramPacket 裡面的數據就是String response的數據。

response.getBytes().length:這里拿到的是位元組數組的長度(位元組的個數),而response.length得到的是字元的長度。

五元組
一次通信是由5個核心信息描述的:源IP、 源埠、 目的IP、 目的埠、 協議類型。

站在客戶端角度:

源IP:本機IP;
源埠:系統分配的埠;
目的IP:伺服器的IP;
目的埠:伺服器的埠;
協議類型:TCP;
站在伺服器的角度:

源IP:伺服器程序本機的IP;
源埠:伺服器綁定的埠(此處手動指定了9090);
目的IP:包含在收到的數據報中(客戶端的IP);
目的埠:包含在收到的數據報中(客戶端的埠);
協議類型:UDP;

❷ java開發聊天功能用什麼技術比較好


開發聊天功能可以採用以下幾種技術:

  • Socket編程:使用Java Socket編程可以實現基於TCP或UDP的網路通信,這虧畢是Java最基礎、最底層的網路編程技術。使用Socket編程可以實現實時通信、消息推送等功能,但需要自己實現消息協議、數據傳輸等細節。

  • Java NIO:Java NIO(New IO)是Java 1.4之後引入的一種新IO API,它提供了基於事件驅動的非同步IO操作,可以大大提高網路通信效率。使用Java NIO可以實現高並發、高性能的網路通信,但需要掌握NIO的相關概念和使用方式。

  • WebSockets:WebSockets是HTML5標准中新增的一種協議,可以實現基於瀏覽器的實時雙向通信。使用Java開發WebSockets可以實現跨平台、跨瀏覽器的聊天功能,但需要掌握WebSocket協議的相關概念和使用方式。

  • 第三方庫:Java中有許多第三方庫可以用於實現聊天功能,如Netty、Apache MINA、Smack等。這些庫提供了更加簡銷悉芹單、易用的API,可以快速陸升搭建聊天功能,但需要熟悉相關庫的使用方法和特性。

  • 具體選用哪種技術,需要根據具體需求、開發經驗和技術水平等因素進行綜合考慮。

❸ java編程中,Socket通信是怎麼實現的

java編程對於Socket之間的通信過程如下:

服務端往Socket的輸出流裡面寫東西,客戶端就可以通過Socket的輸入流讀取對應的內容。Socket與Socket之間是雙向連通的,所以客戶端也可以往對應的Socket輸出流裡面寫東西,然後服務端對應的Socket的輸入流就可以讀出對應的內容。下面來看一些服務端與客戶端通信的例子:

publicclassServer{

publicstaticvoidmain(Stringargs[])throwsIOException{
//為了簡單起見,所有的異常信息都往外拋
intport=8899;
//定義一個ServerSocket監聽在埠8899上
ServerSocketserver=newServerSocket(port);
//server嘗試接收其他Socket的連接請求,server的accept方法是阻塞式的
Socketsocket=server.accept();
//跟客戶端建立好連接之後,我們就可以獲取socket的InputStream,並從中讀取客戶端發過來的信息了。
Readerreader=newInputStreamReader(socket.getInputStream());
charchars[]=newchar[64];
intlen;
StringBuildersb=newStringBuilder();
while((len=reader.read(chars))!=-1){
sb.append(newString(chars,0,len));
}
System.out.println("fromclient:"+sb);
reader.close();
socket.close();
server.close();
}

}
客戶端代碼
Java代碼publicclassClient{

publicstaticvoidmain(Stringargs[])throwsException{
//為了簡單起見,所有的異常都直接往外拋
Stringhost="127.0.0.1";//要連接的服務端IP地址
intport=8899;//要連接的服務端對應的監聽埠
//與服務端建立連接
Socketclient=newSocket(host,port);
//建立連接後就可以往服務端寫數據了
Writerwriter=newOutputStreamWriter(client.getOutputStream());
writer.write("HelloServer.");
writer.flush();//寫完後要記得flush
writer.close();
client.close();
}

}

❹ 在javasocket網路編程中,開發基於udp協議的程序使用的套接字有哪些

一、 填空題

___ IP地址____用來標志網路中的一個通信實體的地址。通信實體可以是計算機,路由器等。
統一資源定位符URL是指向互聯網「資源」的指針,由4部分組成:協議、存放資源的主機域名、__埠___和資源路徑和文件名。
URL 是統一資源定位器的簡稱,它表示Internet上某一資源的地址。
在Socket編程中,IP地址用來標志一台計算機,但是一台計算機上可能提供多種應用程序,使用 埠 來區分這些應用程序。
在Java Socket網路編程中,開發基於TCP協議的伺服器端程序使用的套接字是 ServerSocket 。
在Java Socket網路編程中,開發基於UDP協議的程序使用的套接字是 DatagramSocket 。
二、 選擇題

1.以下協議都屬於TCP/IP協議棧,其中位於傳輸層的協議是(AD)。(選擇二項)
A TCP
B.HTTP
C.SMTP
D.UDP
2.以下協議中屬於TCP/IP協議棧中應用層協議的是(A)。(選擇一項)
A HTTP
B.TCP
C.UDP
D.IP
3.以下說法中關於UDP協議的說法正確的是(AD)。(選擇二項)
A.發送不管對方是否准備好,接收方收到也不確認
B.面向連接
C.佔用系統資源多、效率低
D.非常簡單的協議,可以廣播發送
4.在基於TCP網路通信模式中,客戶與伺服器程序的主要任務是(BC)。(選擇二項)
A 客戶程序在網路上找到一條到達伺服器的路由
B.客戶程序發送請求,並接收伺服器的響應
C.伺服器程序接收並處理客戶請求,然後向客戶發送響應結果
D.如果客戶程序和伺服器都會保證發送的數據不會在傳輸途中丟失
5.在Java網路編程中,使用客戶端套接字Socket創建對象時,需要指定(A)。(選擇一項)
A 伺服器主機名稱和埠
B.伺服器埠和文件
C.伺服器名稱和文件
D.伺服器地址和文件
6.ServerSocket的監聽方法accept( )方法的返回值類型是(A )。(選擇一項)
A.Socket
B.Void
C.Object
D.DatagramSocket
7.Java UDP Socket編程主要用到的兩個類是(BD)。(選擇二項)
A UDPSocket
B.DatagramSocket
C.UDPPacket
D.DatagramPacket
8.在使用UDP套接字通信時,常用(D)類把要發送的信息打包。(選擇一項)
A String
B.DatagramSocket
C.MulticastSocket
D.DatagramPacket

三、 判斷題

1. Socket是傳輸層供給應用層的編程介面,是應用層與傳輸層之間的橋梁 。( T )
2. TCP/IP傳輸控制協議是Internet的主要協議,定義了計算機和外設進行通信的規則。TCP/IP網路參考模型包括七個層次:應用層、會話層、表示層、傳輸層、網路層、鏈路層和物理層。( F )
3. TCP協議一種面向連接的、可靠的、基於位元組流的通信協議 。HTTP、FTP、TELNET、SMTP 都是基於TCP協議的應用層協議。( T )
4. UDP協議是一種面向無連接的、可靠的、基於位元組流的傳輸層通信協議,該協議佔用系統資源多、效率較低。( F )

四、 簡答題

1.TCP/IP協議棧中,TCP協議和UDP協議的聯系和區別?

2.簡述基於TCP的Socket編程的主要步驟。提示:分別說明伺服器端和客戶端的編程步驟。

3.簡述基於UDP的Socket編程的主要步驟。提示:分別說明伺服器端和客戶端的編程步驟。

五、 編碼題

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

1) 要求從客戶端錄入幾個字元,發送到伺服器端。

2) 由伺服器端將接收到的字元進行輸出。

3) 伺服器端向客戶端發出「您的信息已收到」作為響應。

4) 客戶端接收伺服器端的響應信息。

提示:

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

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

❺ 用JAVA編寫一個socket通信程序。

importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.net.ServerSocket;
importjava.net.Socket;

publicclassServer{

publicstaticvoidmain(String[]args){
ServerSocketss;
Sockets;
try{
ss=newServerSocket(8888);
s=ss.accept();
InputStreamReaderisr=newInputStreamReader(s.getInputStream());
BufferedReaderbr=newBufferedReader(isr);

System.out.println(br.readLine());
br.close();
isr.close();

}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}


}

}

importjava.io.PrintWriter;
importjava.net.Socket;


publicclassClient{

publicstaticvoidmain(String[]args){

try{
Sockets=newSocket("127.0.0.1",8888);

PrintWriterpw=newPrintWriter(s.getOutputStream());
pw.write("helloserver");
pw.flush();

pw.close();
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}

}

}

❻ Java Socket初步詳解

網路編程的基本模型就是客戶機到伺服器模型 簡單的說就是兩個進程之間相互通訊 然後其中一個必須提供一個固定的位置 而另一個則只需要知道這個固定的位置 並去建立兩者之間的聯系 然後完成數據的通訊就可以了 這里提供畝悉猜固定位置的通常稱為伺服器 而建立聯系的通常叫做客戶端 基於這個簡單的模型 就可以進入網路編程啦

Java對這個模型的支持有很多種Api 而這里我只想介紹有關Socket的編程介面 對於Java而言已經簡化了Socket的編程介面 首先我們來討論有關提供固定位置的服務方是如何建立的 Java提供了ServerSocket來對其進行支持 事實上當你創建該類的一個實力對象並提供一個埠資源你就建立了一個固定位置可以讓其他計算機來訪問你 ServerSocket server=new ServerSocket( );這里稍微要注意的是埠的分配必須是唯一的 因為埠是為了唯一標識每台計算機唯一服務的 另外埠號是從 ~ 之間的 前 個埠已經被Tcp/Ip 作為保留埠 因此你所分配的埠只能是 個之後的 好了 我們有了固定位置 現在所需要的就是一根連接線了 該連接線由客戶方首先提出要求 因此Java同樣提供了一個Socket對象來對其進行支持 只要客戶方創建一個Socket的實例對象進行支持就可以了 Socket client

=new Socket(InetAddress getLocalHost() );客戶機必須知道有關伺服器的IP地址 對於著一點Java也提供了一個相關的類InetAddress 該對象的實例必須通過它的靜態方法來提供 它的靜態方法主要提供了得到本機IP 和通過名字或IP直接得到InetAddress的方法

上面的方法基本可以建立一條連線讓兩台計算機相互交流了 可是數據是如何傳輸的呢?事實上I/O操作總是和網路編程息息相關的 因為底層的網路是繼續數據的 除非遠程調用 處理問題的核心在執行上 否則數據的陸帆交互還是依賴於IO操作的 所以你也必須導入java io這個包 java的IO操作也不復雜 它提供了針對於位元組流和Unicode的讀者和寫者 然後也提供了一個緩沖用於數據的讀寫

BufferedReader in=new BufferedReader(new InputStreamReader(server getInputStream()));

PrintWriter out=new PrintWriter(server getOutputStream());

上面兩句就是建立緩沖並把原始的位元組流轉變為Unicode可以操作 而原始的位元組流來源於Socket的兩個方法 getInputStream()和getOutputStream()方 分別用來得到輸入和輸出 那麼現在有了基本的模型和基本的操作工具 我們可以做一個簡單的Socket常式了

服務方:

import java io *;

import *;

public class MyServer {

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

ServerSocket server=new ServerSocket( );

Socket client=server accept();

BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));

迅型PrintWriter out=new PrintWriter(client getOutputStream());

while(true){

String str=in readLine();

System out println(str);

out println( has receive );

out flush();

if(str equals( end ))

break;

}

client close();

}

}

這個程序的主要目的在於伺服器不斷接收客戶機所寫入的信息只到 客戶機發送 End 字元串就退出程序 並且伺服器也會做出 Receive 為回應 告知客戶機已接收到消息

客戶機代碼:

import *;

import java io *;

public class Client{

static Socket server;

public static void main(String[] args)throws Exception{

server=new Socket(InetAddress getLocalHost() );

BufferedReader in=new BufferedReader(new InputStreamReader(server getInputStream()));

PrintWriter out=new PrintWriter(server getOutputStream());

BufferedReader wt=new BufferedReader(new InputStreamReader(System in));

while(true){

String str=wt readLine();

out println(str);

out flush();

if(str equals( end )){

break;

}

System out println(in readLine());

}

server close();

}

}

客戶機代碼則是接受客戶鍵盤輸入 並把該信息輸出 然後輸出 End 用來做退出標識

這個程序只是簡單的兩台計算機之間的通訊 如果是多個客戶同時訪問一個伺服器呢?你可以試著再運行一個客戶端 結果是會拋出異常的 那麼多個客戶端如何實現呢?

其實 簡單的分析一下 就可以看出客戶和服務通訊的主要通道就是Socket本身 而伺服器通過accept方法就是同意和客戶建立通訊 這樣當客戶建立Socket的同時 伺服器也會使用這一根連線來先後通訊 那麼既然如此只要我們存在多條連線就可以了 那麼我們的程序可以變為如下:

伺服器:

import java io *;

import *;

public class MyServer {

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

ServerSocket server=new ServerSocket( );

while(true){

Socket client=server accept();

BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));

PrintWriter out=new PrintWriter(client getOutputStream());

while(true){

String str=in readLine();

System out println(str);

out println( has receive );

out flush();

if(str equals( end ))

break;

}

client close();

}

}

}

這里僅僅只是加了一個外層的While循環 這個循環的目的就是當一個客戶進來就為它分配一個Socket直到這個客戶完成一次和伺服器的交互 這里也就是接受到客戶的 End 消息 那麼現在就實現了多客戶之間的交互了 但是 問題又來了 這樣做雖然解決了多客戶 可是是排隊執行的 也就是說當一個客戶和伺服器完成一次通訊之後下一個客戶才可以進來和伺服器交互 無法做到同時服務 那麼要如何才能同時達到既能相互之間交流又能同時交流呢?很顯然這是一個並行執行的問題了 所以線程是最好的解決方案

那麼下面的問題是如何使用線程 首先要做的事情是創建線程並使得其可以和網路連線取得聯系 然後由線程來執行剛才的操作 要創建線程要麼直接繼承Thread要麼實現Runnable介面 要建立和Socket的聯系只要傳遞引用就可以了 而要執行線程就必須重寫run方法 而run方法所做的事情就是剛才單線程版本main所做的事情 因此我們的程序變成了這樣:

import *;

import java io *;

public class MultiUser extends Thread{

private Socket client;

public MultiUser(Socket c){

this client=c;

}

public void run(){

try{

BufferedReader in=new BufferedReader(new InputStreamReader(client getInputStream()));

PrintWriter out=new PrintWriter(client getOutputStream());

//Mutil User but can t parallel

while(true){

String str=in readLine();

System out println(str);

out println( has receive );

out flush();

if(str equals( end ))

break;

}

client close();

}catch(IOException ex){

}finally{

}

}

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

ServerSocket server=new ServerSocket( );

while(true){

//transfer location change Single User or Multi User

MultiUser mu=new MultiUser(server accept());

mu start();

}

}

}

lishixin/Article/program/Java/hx/201311/27013

熱點內容
手機存儲卡速度測試 發布:2025-02-08 17:02:57 瀏覽:23
洪恩編程 發布:2025-02-08 17:02:19 瀏覽:811
linux遠程式控制制 發布:2025-02-08 17:02:16 瀏覽:151
珠心算演算法 發布:2025-02-08 17:00:37 瀏覽:915
動態ip可以做伺服器么 發布:2025-02-08 17:00:33 瀏覽:217
oracle定義存儲過程 發布:2025-02-08 16:54:35 瀏覽:148
mac玩飢荒要什麼配置 發布:2025-02-08 16:52:18 瀏覽:681
androidattributeset 發布:2025-02-08 16:51:23 瀏覽:423
c語言調用函數返回值 發布:2025-02-08 16:51:19 瀏覽:788
有壓縮錢嗎 發布:2025-02-08 16:34:01 瀏覽:517