日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java实现套接字网络编程_Java网络编程(一)Socket套接字

發(fā)布時間:2025/3/20 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java实现套接字网络编程_Java网络编程(一)Socket套接字 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、基礎(chǔ)知識

1.TCP:傳輸控制協(xié)議。

2.UDP:用戶數(shù)據(jù)報協(xié)議。

二、IP地址封裝

1.InetAddress類的常用方法

getLocalHost() 返回本地主機的InetAddress對象 InetAddress類型

getByName(String host) 獲取指定主機名稱的IP地址 InetAddress類型

getHostName() 獲取此主機名 String

getHostAddress() 獲取主機IP地址 String

isReachable(int timeout) 在timeout指定的毫秒時間內(nèi),測試IP地址是否可達 Boolean

2.示例1:測試IP地址從“192.168.131.1”到“192.168.131.150”范圍內(nèi)所有可以訪問的主機的名稱,如果對方?jīng)]有安裝防火墻,并且網(wǎng)絡(luò)連接正常的話,都可以訪問的。從輸出可以看出,192.168.131.1是本地主機的IP,其他地址都不能聯(lián)通,可能是因為1000毫秒太短或者對方主機裝有防火墻的原因。

packagebigjunoba.bjtu.iptoname;importjava.io.IOException;importjava.net.InetAddress;importjava.net.UnknownHostException;public classIPToName {public static voidmain(String[] args) {

String IP= null;for (int i = 1; i <= 150; i++) {

IP= "192.168.131." + i; //生成IP字符串

try{

InetAddress host;

host= InetAddress.getByName(IP); //獲取IP封裝對象

if (host.isReachable(1000)) { //用1秒的時間測試IP地址是否可達

String hostName =host.getHostName();

System.out.println("IP地址" + IP + "的主機名稱是:" +hostName);

}

}catch (UnknownHostException e) { //捕獲未知主機異常

e.printStackTrace();

}catch (IOException e) { //捕獲輸入輸出異常

e.printStackTrace();

}

}

System.out.println("搜索完畢!");

}

}

IP地址192.168.131.1的主機名稱是:BigjunOba

搜索完畢!

三、套接字

套接字(Socket)是代表計算機之間網(wǎng)絡(luò)連接的對象,用于建立計算機之間的TCP連接,使計算機之間可以建立連接并實現(xiàn)網(wǎng)絡(luò)通信。

1.服務(wù)器端套接字

服務(wù)器端套接字是SercerSocket類的實例對象,用于實現(xiàn)服務(wù)器緩存。ServerSocket類將監(jiān)視指定的端口,并建立客戶端到服務(wù)器端套接字的連接,也就是客戶負責(zé)呼叫任務(wù)。

(1)創(chuàng)建服務(wù)器端套接字

創(chuàng)建服務(wù)器端套接字可以使用4種構(gòu)造方法。

①ServerScoket()

默認構(gòu)造方法,可以創(chuàng)建未綁定端口號的服務(wù)器套接字。服務(wù)器套接字的所有構(gòu)造方法都需要處理IOException異常。

一般格式為:

try{

ServerSocket server= newServerSocket();

}catch(IOException e) {

e.printStackTrace();

}

②ServerScoket(int port)

該構(gòu)造方法將創(chuàng)建綁定到port參數(shù)指定端口的服務(wù)器套接字對象,默認的最大連接隊列長度為50,也就是說哦如果連接數(shù)量超過50個,將不會再接收新的連接請求。

一般格式為:

try{

ServerSocket server= new ServerSocket(9527);

}catch(IOException e) {

e.printStackTrace();

}

}

③ServerScoket(int port, int backlog)

使用port參數(shù)指定的端口號和backlog參數(shù)指定的最大連接長度創(chuàng)建服務(wù)器端套接字對象,這個構(gòu)造方法可以指定超出50的連接數(shù)量,如300。

一般格式為:

try{

ServerSocket server= new ServerSocket(9527, 300);

}catch(IOException e) {

e.printStackTrace();

}

}

④public ServerSocket(int port, int backlog, InerAddress bindAddr)

使用port參數(shù)指定的端口號和backlog參數(shù)指定的最大連接隊列長度創(chuàng)建服務(wù)器端套接字對象。如果服務(wù)器有多個IP地址,可以使用bindAddr參數(shù)指定創(chuàng)建服務(wù)器套接字的地址;如果服務(wù)器只有一個IP地址,那么沒有必要使用該構(gòu)造方法。

try{

InetAddress address = InetAddress.getByName("192.168.1.128");

ServerSocket server= new ServerSocket(9527, 300, address);

}catch(IOException e) {

e.printStackTrace();

}

}

(2)接收客戶端套接字連接

當(dāng)服務(wù)器建立ServerSocket套接字對象以后,就可以使用該對象的accept()方法接收客戶端請求的套接字連接。

語法格式為:

serverSocket.accept();

該方法被調(diào)用之后,將等待客戶端的連接請求,在接收客戶端的套接字連接請求以后,該方法將返回Socket對象,這個Socket對象是已經(jīng)和客戶端建立好連接的套接字,通過這個Socket對象獲取客戶端的輸入輸出流來實現(xiàn)數(shù)據(jù)發(fā)送與接收。

該方法可能會產(chǎn)生IOException異常,所以在調(diào)用accept()方法時必須捕獲并處理該異常。

一般形式為:

try{

server,accept();

}catch(IOException e) {

e.printStackTrace();

}

}

accept()方法將阻塞當(dāng)前線程,直到接收到客戶端的連接請求為止,該方法之后的任何語句都不會執(zhí)行,必須有客戶端發(fā)送連接請求;accpet()方法返回Socket套接字以后,當(dāng)前線程才會繼續(xù)運行,accpet()方法之后的代碼才會被執(zhí)行。

示例1:System.out.println("已經(jīng)建立連接!");在server對象接收到客戶端的連接請求之前永遠都不會執(zhí)行,這樣會導(dǎo)致程序的main主線程阻塞。

packagebigjunoba.bjtu.serverSocketTest;importjava.io.IOException;importjava.net.ServerSocket;public classServerSocketTest {public static voidmain(String[] args) {try{

ServerSocket serverSocket= new ServerSocket(9527);

serverSocket.accept();

System.out.println("已經(jīng)建立連接!");

}catch(IOException e) {

e.printStackTrace();

}

}

}

示例2:將上述語句放在一個新的線程中,作為main主線程的子線程,在新的線程中完成等待客戶端連接請求并獲取客戶端Socket對象的任務(wù),這樣就不會阻塞main主線程。

packagebigjunoba.bjtu.serverSocketTest;importjava.io.IOException;importjava.net.ServerSocket;public classServerSocketTest {public static voidmain(String[] args) {

Runnable runnable= newRunnable() {

@Overridepublic voidrun() {try{

ServerSocket serverSocket= new ServerSocket(9527);

serverSocket.accept();

System.out.println("已經(jīng)建立連接!");

}catch(IOException e) {

e.printStackTrace();

}

}

};

Thread thread= newThread(runnable);

thread.start();

}

}

2.客戶端套接字

Socket類是實現(xiàn)客戶端套接字的基礎(chǔ)。它采用TCP建立計算機之間的連接,并包含了Java語言所有對TCP有關(guān)的操作方法,如建立連接、傳輸數(shù)據(jù)、斷開連接等。

(1)創(chuàng)建客戶端套接字

Socket類定義了多個構(gòu)造方法,它們可以根據(jù)InetAddress對象或者字符串指定的IP地址和端口號創(chuàng)建示例。

①Socket(InetAddress address, int port);

使用address參數(shù)傳遞的IP封裝對象和port參數(shù)指定的端口號創(chuàng)建套接字實例對象。Socket類的構(gòu)造方法可能會產(chǎn)生UnknownHostException和IOException異常,在使用該構(gòu)造方法創(chuàng)建Socket對象時必須捕獲和處理這兩個異常。

一般形式為:

try{

InetAddress address= InetAddress.getByName("BigjunOba");int port = 33;

Socket socket= newSocket(address, port);

}catch(UnknownHostException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

②Socket(String host, int port);

使用host參數(shù)指定的IP地址字符串和port參數(shù)指定的整數(shù)類型端口號創(chuàng)建套接字實例對象。

一般形式為:

try{int port = 33;

Socket socket= new Socket("192.168.131.1", port);

}catch(UnknownHostException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

③Socket(InetAddress address, int port, InetAddress localAddr, int localPort)

創(chuàng)建一個套接字并將其連接到指定遠程地址上的指定遠程端口。

一般格式為:

try{

InetAddress localHost=InetAddress.getLocalHost();

InetAddress address= InetAddress.getByName("192.168.131.1");int port1 = 33;int port2 = 44;

Socket socket= newSocket(address, port1, localHost, port2) ;

}catch(UnknownHostException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

④Socket(String host, int port, InetAddress localAddr, int localPort)

創(chuàng)建一個套接字并將其連接到指定遠程主機上的指定端口。

一般形式為:

try{

InetAddress localHost=InetAddress.getLocalHost();int port1 = 33;int port2 = 44;

Socket socket= new Socket("192.168.131.1", port1, localHost, port2) ;

}catch(UnknownHostException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

示例1:檢測本地計算機中被使用的端口,端口的檢測范圍是1~256

packagebigjunoba.bjtu.clientSocketTest;importjava.io.IOException;importjava.net.InetAddress;importjava.net.Socket;importjava.net.UnknownHostException;public classCheckPort {public static voidmain(String[] args) {for (int i = 1; i <= 256; i++) {try{

InetAddress localHost=InetAddress.getLocalHost();

Socket socket= newSocket(localHost, i);//如果不產(chǎn)生異常,輸出該端口被使用

System.out.println("本機已經(jīng)使用了端口:" +i);

}catch(UnknownHostException e) {

e.printStackTrace();

}catch(IOException e) {//e.printStackTrace();

}

}

System.out.println("執(zhí)行完畢!");

}

本機已經(jīng)使用了端口:135執(zhí)行完畢!

(2)發(fā)送和接收數(shù)據(jù)

Socket對象創(chuàng)建成功以后,代表和對方的主機已經(jīng)建立了連接,可以接受與發(fā)送數(shù)據(jù)了。Socket提供了兩個方法分別獲取套接字的輸入流和輸出流,可以將要發(fā)送的數(shù)據(jù)寫入輸出流,實現(xiàn)發(fā)送功能,或者從輸入流讀取對方發(fā)送的數(shù)據(jù),實現(xiàn)接受功能。

①接受數(shù)據(jù)

Socket對象從數(shù)據(jù)輸入流中獲取數(shù)據(jù),該輸入流包含對方發(fā)送的數(shù)據(jù),這些數(shù)據(jù)可能是文件、圖片、音頻或視頻。所以,在實現(xiàn)接受數(shù)據(jù)之前,必須使用getInputStream()方法獲取輸入流。

語法格式為:

socket.getInputStream()

②發(fā)送數(shù)據(jù)

Socket對象使用輸出流,向?qū)Ψ桨l(fā)送數(shù)據(jù),所以,在實現(xiàn)數(shù)據(jù)發(fā)送以前,必須使用getOutputStream()方法獲取套接字的輸出流。

語法格式為:

socket.getOutputStream()

3.創(chuàng)建一些Socket套接字小程序。

示例1:創(chuàng)建服務(wù)器Server程序和客戶端Client程序,并實現(xiàn)簡單的Socket通信程序。

創(chuàng)建Server服務(wù)器類:

packagebigjunoba.bjtu.CSTest;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.net.ServerSocket;importjava.net.Socket;public classServer {public static voidmain(String[] args) {try{//創(chuàng)建服務(wù)器套接字

ServerSocket server = new ServerSocket(9527);

System.out.println("服務(wù)器啟動完畢!");//等待客戶端連接,返回的是已經(jīng)連接到服務(wù)器的客戶端socket對象

Socket socket =server.accept();

System.out.println("客戶端已經(jīng)連接上服務(wù)器啦!");//獲取客戶端socket對象的輸入流

InputStream inputStream =socket.getInputStream();

InputStreamReader reader= newInputStreamReader(inputStream);

BufferedReader bufferedReader= newBufferedReader(reader);while (true) {

String string=bufferedReader.readLine();//如果接收到exit就退出服務(wù)器

if (string.equals("exit")) {break;

}//如果接收到的不是exit,就輸出接收到的內(nèi)容

System.out.println("接受內(nèi)容為:" +string);

}

System.out.println("連接斷開!");

bufferedReader.close();

reader.close();

inputStream.close();

socket.close();

server.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

創(chuàng)建client客戶端類:

packagebigjunoba.bjtu.CSTest;importjava.io.IOException;importjava.io.OutputStream;importjava.net.Socket;importjava.net.UnknownHostException;public classClient {public static voidmain(String[] args) {try{//創(chuàng)建連接服務(wù)器的Socket

Socket socket = new Socket("localhost", 9527);//獲取Socket輸出

OutputStream outputStream =socket.getOutputStream();//向服務(wù)器發(fā)送數(shù)據(jù)(將字符串轉(zhuǎn)化成字節(jié)數(shù)組)

outputStream.write("這是客戶端發(fā)送給服務(wù)器的文字\n".getBytes());//發(fā)送退出信息

outputStream.write("exit\n".getBytes());

}catch(UnknownHostException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

}

}

先啟動服務(wù)器:

服務(wù)器啟動完畢!

再啟動客戶端:

服務(wù)器啟動完畢!

客戶端已經(jīng)連接上服務(wù)器啦!

接受內(nèi)容為:這是客戶端發(fā)送給服務(wù)器的文字

連接斷開!

示例2:示例1中的程序在運行完一次后,程序就會自動結(jié)束,因為Socket socket = server.accept();會阻塞當(dāng)前的main線程,而且客戶端連接一次后,程序執(zhí)行完之后就直接退出了,這樣的效果很不好。為了實現(xiàn)客戶端能夠?qū)崟r多次發(fā)送數(shù)據(jù)的功能,考慮將Socket socket = server.accept();這行代碼更換到一個更適當(dāng)?shù)奈恢?#xff0c;并考慮使用多線程技術(shù)來實現(xiàn)多次發(fā)送的功能,使得程序更加完善。

(1)首先需要解釋一下DataInputStream與InputStream的區(qū)別:

DataInputStream類繼承了InputStream類,比普通的InputStream多了一些方法,DataInputStream、DataOutputStream并沒有改變InputStream或OutputStream的行為,讀入或?qū)懗鰰r的動作還是InputStream、OutputStream負責(zé)。DataInputStream、DataOutputStream只是在實現(xiàn)對應(yīng)的方法時,動態(tài)地為它們加上類型判斷功能。readUTF()的作用,是從輸入流中讀取UTF-8編碼的數(shù)據(jù),并以String字符串的形式返回。writeUTF(value:String)的作用是 :將String字符串轉(zhuǎn)換成UTF-8編碼的字節(jié)流并寫入輸出流。

(2)內(nèi)部類:如果內(nèi)部類和main方法在同一個類中,那么因為靜態(tài)方法不能調(diào)用動態(tài)方法,所以可以將內(nèi)部類定義成靜態(tài)static,然后在創(chuàng)建類時就已經(jīng)new出了實例,因此不需要new語句,調(diào)用的時候直接調(diào)用即可。

(3)明確服務(wù)器端和客戶端的發(fā)送和接收

客戶端:從輸入流中接收數(shù)據(jù),使用輸出流發(fā)送數(shù)據(jù)。即dataOutputStream.writeUTF(line);是客戶端發(fā)送給服務(wù)器的數(shù)據(jù),dataInputStream.readUTF()是客戶端接收服務(wù)器發(fā)來的數(shù)據(jù)。

服務(wù)器端:從輸入流中接收數(shù)據(jù),使用輸出流發(fā)送數(shù)據(jù)。即dataOutputStream.writeUTF(replyMessage);是服務(wù)器發(fā)送給客戶端的數(shù)據(jù),dataInputStream.readUTF()服務(wù)器接收客戶端發(fā)來的數(shù)據(jù)。

(3)server服務(wù)器端程序修改為:

packagebigjunoba.bjtu.CSTest2;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;public classServer {public static voidmain(String[] args) {try{//創(chuàng)建服務(wù)器套接字

@SuppressWarnings("resource")

ServerSocket server= new ServerSocket(8023);

System.out.println("服務(wù)器啟動完畢!");while (true) {//等待客戶端連接,只有當(dāng)一個客戶端連接上才會返回已經(jīng)連接到服務(wù)器的客戶端socket對象

Socket socket =server.accept();

System.out.println("客戶端已經(jīng)連接上服務(wù)器啦!");//客戶端連接上服務(wù)器后,就開啟通信線程

newCommunicationThread(socket).start();

}

}catch(IOException e) {

e.printStackTrace();

}

}public static class CommunicationThread extendsThread{

Socket socket;

DataInputStream dataInputStream;

DataOutputStream dataOutputStream;publicCommunicationThread(Socket socket) {this.socket =socket;try{

dataInputStream= newDataInputStream(socket.getInputStream());

dataOutputStream= newDataOutputStream(socket.getOutputStream());

}catch(IOException e) {

e.printStackTrace();

}

}public voidrun() {super.run();

String message= null;try{//接收從客戶端發(fā)來的數(shù)據(jù)

while ((message = dataInputStream.readUTF()) != null) {

System.out.println("客戶端發(fā)來的信息是:" +message);

String replyMessage= "OK!我已經(jīng)收到了:" +message;//發(fā)送回應(yīng)數(shù)據(jù)給客戶端

dataOutputStream.writeUTF(replyMessage);

System.out.println("服務(wù)器發(fā)送給客戶端的回應(yīng):" +replyMessage);

}

}catch(IOException e) {

e.printStackTrace();

}

}

}

}

(4)client客戶端程序修改為:

packagebigjunoba.bjtu.CSTest2;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.IOException;importjava.net.Socket;importjava.util.Scanner;public classClient {public static voidmain(String[] args) {try{

@SuppressWarnings("resource")//連接到服務(wù)器

Socket socket = new Socket("localhost", 8023);

System.out.println("客戶端啟動完畢!");

DataInputStream dataInputStream= newDataInputStream(socket.getInputStream());

DataOutputStream dataOutputStream= newDataOutputStream(socket.getOutputStream());

@SuppressWarnings("resource")

Scanner scanner= newScanner(System.in);

String line= null;

listenServerReply(dataInputStream);//讀取從鍵盤輸入的第一行

while ((line = scanner.nextLine()) != null) {//發(fā)送數(shù)據(jù)給服務(wù)器端

dataOutputStream.writeUTF(line);

System.out.println("客戶端發(fā)送給服務(wù)器的信息是:" +line);

}

}catch(Exception e) {

e.printStackTrace();

}

}//監(jiān)聽服務(wù)器端發(fā)送回來的信息

public static void listenServerReply(finalDataInputStream dataInputStream) {newThread() {public voidrun() {super.run();

String line= null;try{//接收從服務(wù)器端發(fā)送回來的回應(yīng)信息

while ((line = dataInputStream.readUTF()) != null) {

System.out.println("客戶端從服務(wù)器接收到的回應(yīng)是:" +line);

}

}catch(IOException e) {

e.printStackTrace();

}

}

}.start();

}

}

(5)首先啟動服務(wù)器端,服務(wù)器端打印程序為:

服務(wù)器啟動完畢!

(6)然后啟動客戶端,

客戶端輸出為:

客戶端啟動完畢!

服務(wù)器端輸出為:

服務(wù)器啟動完畢!

客戶端已經(jīng)連接上服務(wù)器啦!

(7)在客戶端控制臺出打印一些信息

客戶端輸出為:

客戶端啟動完畢!

Hello,你好啊!

客戶端發(fā)送給服務(wù)器的信息是:Hello,你好啊!

客戶端從服務(wù)器接收到的回應(yīng)是:OK!我已經(jīng)收到了:Hello,你好啊!

服務(wù)器端輸出為:

服務(wù)器啟動完畢!

客戶端已經(jīng)連接上服務(wù)器啦!

客戶端發(fā)來的信息是:Hello,你好啊!

服務(wù)器發(fā)送給客戶端的回應(yīng):OK!我已經(jīng)收到了:Hello,你好啊!

四、數(shù)據(jù)報

Java語言可以使用TCP和UDP兩種通信協(xié)議實現(xiàn)網(wǎng)絡(luò)通信,其中TCP通信由Socket套接字實現(xiàn),而UDP通信需要使用DatagramSocket類實現(xiàn)。

和TCP通信不同,UDP傳遞信息的速度更快,但是沒有TCP的高可靠性,當(dāng)用戶通過UDP發(fā)送信息之后,無法確定能否正確地傳送到目的地。雖然UDP是一種不可靠的通信協(xié)議,但是大多數(shù)場合并不需要嚴(yán)格的、高可靠性的通信,它們需要的是快速的信息發(fā)送,并能容忍一些小的錯誤,那么使用UDP通信來實現(xiàn)會更合適一些。

UDP將數(shù)據(jù)打包,也就是通信中所傳遞的數(shù)據(jù)包,然后將數(shù)據(jù)包發(fā)送到指定目的地,對方會接收數(shù)據(jù)包,然后查看數(shù)據(jù)包中的數(shù)據(jù)。

1.DatagramPacket

該類是UDP鎖傳遞的數(shù)據(jù)包,即打包后的數(shù)據(jù)。數(shù)據(jù)包用來實現(xiàn)無連接包投遞的服務(wù),每個數(shù)據(jù)包僅根據(jù)包中包含的信息從一臺計算機傳送到另一臺計算機,傳送的多個包可以選擇不同的路由,也可能按不同的順序到達。

(1)DatagramPacket(byte[] buf, int length)

該構(gòu)造方法用來創(chuàng)建數(shù)據(jù)包實例,這個數(shù)據(jù)包實例將接收長度為length的數(shù)據(jù)包。

語法格式為:

DatagramPacket(byte[] buf, int length)

(2)DatagramPacket(byte[] buf, int length, InetAddress address, int port)

創(chuàng)建數(shù)據(jù)包實例,用來將長度為length的數(shù)據(jù)包發(fā)送到address參數(shù)指定地址和port參數(shù)指定端口號的主機。length參數(shù)必須小于等于buf數(shù)組的長度。

語法格式為:

DatagramPacket(byte[] buf, int length, InetAddress address, int port)

2.DatagramSocket

該類是用于發(fā)送和接收數(shù)據(jù)的數(shù)據(jù)包套接字。數(shù)據(jù)包套接字是數(shù)據(jù)包傳送服務(wù)的發(fā)送或接收點。要實現(xiàn)UDP通信的數(shù)據(jù)就必須創(chuàng)建數(shù)據(jù)包套接字。

常用的構(gòu)造方法有3個:

(1)DatagramSocket()

默認的構(gòu)造方法,該構(gòu)造方法將使用本機任何可用的端口創(chuàng)建數(shù)據(jù)包套接字實例。在創(chuàng)建DatagramSocket類的實例時,有可能會產(chǎn)生SocketException異常,所以,在創(chuàng)建數(shù)據(jù)包套接字時,應(yīng)該捕獲并處理該異常。

一般格式為:

try{

DatagramSocket datagramSocket= newDatagramSocket();

}catch(SocketException e) {

e.printStackTrace();

}

(2)DatagramSocket(int port)

創(chuàng)建數(shù)據(jù)包套接字并將其綁定到port參數(shù)指定的本機端口,端口號取值必須在0~65535.

一般格式為:

try{

DatagramSocket datagramSocket= new DatagramSocket(8023);

}catch(SocketException e) {

e.printStackTrace();

}

(3)DatagramSocket(int port, InetAddress Iaddr)

綁定數(shù)據(jù)包套接字,將其綁定到Iaddr參數(shù)指定的本機地址和port參數(shù)指定的本機端口號。本機端口號取值必須在0~65535之間。

一般格式為:

try{

InetAddress localHost=InetAddress.getLocalHost();

DatagramSocket datagramSocket= new DatagramSocket(8023, localHost);

}catch(SocketException e) {

e.printStackTrace();

}catch(UnknownHostException e) {

e.printStackTrace();

}

3.數(shù)據(jù)報通信程序

示例:使用兩個雷實現(xiàn)UDP通信程序設(shè)計。

創(chuàng)建服務(wù)器端程序:

packagebigjunoba.bjtu.UDPTest;importjava.io.IOException;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.SocketException;public classServer {public static voidmain(String[] args) {byte[] buf = new byte[1024];

DatagramPacket datagramPacket= newDatagramPacket(buf, buf.length);try{

@SuppressWarnings("resource")

DatagramSocket datagramSocket= new DatagramSocket(8023);

System.out.println("服務(wù)器啟動完畢!");

datagramSocket.receive(datagramPacket);int length =datagramPacket.getLength();

String message= new String(datagramPacket.getData(), 0, length);

String ip=datagramPacket.getAddress().getHostAddress();

System.out.println("從" + ip + "發(fā)送來了信息:" +message);

}catch(SocketException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

}

}

創(chuàng)建客戶端程序:

packagebigjunoba.bjtu.UDPTest;importjava.io.IOException;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.net.UnknownHostException;public classClient {public static voidmain(String[] args) {try{

InetAddress address= InetAddress.getByName("127.0.0.1");

@SuppressWarnings("resource")

DatagramSocket datagramSocket= newDatagramSocket();

System.out.println("客戶端啟動完畢!");byte[] data = "hello,我是客戶端,我來訪問服務(wù)器了!".getBytes();

DatagramPacket datagramPacket= new DatagramPacket(data, data.length, address, 8023);

datagramSocket.send(datagramPacket);

}catch(UnknownHostException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}

}

}

先啟動服務(wù)器程序,然后再啟動客戶端程序,服務(wù)器控制臺的輸出為:

服務(wù)器啟動完畢!

從127.0.0.1發(fā)送來了信息:hello,我是客戶端,我來訪問服務(wù)器了!

五、網(wǎng)絡(luò)聊天程序開發(fā)

使用Swing設(shè)置程序UI界面,并結(jié)合Java語言多線程技術(shù)使網(wǎng)絡(luò)聊天程序更加符合實際需求,即可以不間斷地收發(fā)多條信息。

(1)創(chuàng)建ClientFrame類,該類包含多個成員變量。

總結(jié)

以上是生活随笔為你收集整理的java实现套接字网络编程_Java网络编程(一)Socket套接字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。