導航:首頁 > 編程語言 > javaudpsocket編程實例

javaudpsocket編程實例

發布時間:2024-08-24 01:58:30

A. 瘋狂java講義:使用DatagramSocket發送、接收數據[2]

程序客戶端代碼也與此類似 客戶端採用循環不斷地讀取用戶鍵盤輸入 每當讀到用戶輸入內容後就將該內容封裝成DatagramPacket數據報 再將該數據報發送出去 接著把DatagramSocket中的數據讀入接收用的DatagramPacket中(實際上是讀入該DatagramPacket所封裝的位元組數組中) 客旁和戶端代碼如下

程序清單 codes/ / /UdpClient java

public class UdpClient

{

//定義發送數據報的目的地

public static final int DEST_PORT = ;

public static final String DEST_IP = ;

//定義每個數據報的最大大小為 K

private static final int DATA_LEN = ;

//定義該客戶端使用的DatagramSocket

private DatagramSocket socket = null;

//定義接收網路數據的位元組數組

byte[] inBuff = new byte[DATA_LEN];

//以指定位元組數組創建准攔兄備接受數據的DatagramPacket對象

private DatagramPacket inPacket =

new DatagramPacket(inBuff inBuff length)

//定義一個用於發送的DatagramPacket對象

private DatagramPacket outPacket = null;

public void init()throws IOException

{

try

{

//創建一個客戶端DatagramSocket 使用隨機埠

socket = new DatagramSocket()

//初始化發送用的DatagramSocket 它包含一個長度為 的位元組數組

簡啟襲outPacket = new DatagramPacket(new byte[ ]

InetAddress getByName(DEST_IP) DEST_PORT)

//創建鍵盤輸入流

Scanner scan = new Scanner(System in)

//不斷讀取鍵盤輸入

while(scan hasNextLine())

{

//將鍵盤輸入的一行字元串轉換位元組數組

byte[] buff = scan nextLine() getBytes()

//設置發送用的DatagramPacket里的位元組數據

outPacket setData(buff)

//發送數據報

socket send(outPacket)

//讀取Socket中的數據 讀到的數據放在inPacket所封裝的位元組數組里

socket receive(inPacket)

System out println(new String(inBuff

inPacket getLength()))

}

}

//使用finally塊保證關閉資源

finally

{

if (socket != null)

{

socket close()

}

}

}

public static void main(String[] args)

throws IOException

{

new UdpClient() init()

}

}

上面程序的粗體字代碼同樣也是通過DatagramSocket發送 接收DatagramPacket的關鍵代碼 這些代碼與伺服器的代碼基本相似 而客戶端與伺服器端的唯一區別在於 伺服器所在IP地址 埠是固定的 所以客戶端可以直接將該數據報發送給伺服器 而伺服器則需要根據接收到的數據報來決定將 反饋 數據報的目的地

讀者可能會發現 使用DatagramSocket進行網路通信時 伺服器端無須 也無法保存每個客戶端的狀態 客戶端把數據報發送到伺服器後 完全有可能立即退出 但不管客戶端是否退出 伺服器無法知道客戶端的狀態

當使用UDP協議時 如果想讓一個客戶端發送的聊天信息可被轉發到其他所有客戶端則比較困難 可以考慮在伺服器使用Set來保存所有客戶端信息 每當接收到一個客戶端的數據報之後 程序檢查該數據報的源SocketAddress是否在Set集合中 如果不在就將該SocketAddress添加到該Set集合中 但這樣一來又涉及一個問題 可能有些客戶端發送一個數據報之後永久性地退出了程序 但伺服器端還將該客戶端的SocketAddress保存在Set集合中……總之 這種方式需要處理的問題比較多 編程比較煩瑣 幸好Java為UDP協議提供了MulticastSocket類 通過該類可以輕松實現多點廣播

返回目錄 瘋狂Java講義

編輯推薦

Java程序性能優化 讓你的Java程序更快 更穩定

新手學Java 編程

Java程序設計培訓視頻教程

lishixin/Article/program/Java/hx/201311/27260

B. CSocket之UDP編程

#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib,"ws2_32.lib")

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1);

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}

SOCKET sersocket=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN seraddr;
seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
seraddr.sin_family=AF_INET;
seraddr.sin_port=htons(5000);

bind(sersocket,(SOCKADDR*)&seraddr,sizeof(SOCKADDR));

SOCKADDR clientaddr;
int len=sizeof(SOCKADDR);

char revbuf[100];
char sendbuf[100];

recvfrom(sersocket,revbuf,100,0,(SOCKADDR*)&clientaddr,&len);
printf("%s\n",revbuf);
scanf("%s",&sendbuf);
sendto(sersocket,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR*)&clientaddr,len);

closesocket(sersocket);
WSACleanup();
}

#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib,"ws2_32.lib")

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1);

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}

SOCKET sockclient=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN clientaddr;
clientaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
clientaddr.sin_family=AF_INET;
clientaddr.sin_port=htons(5000);

int len=sizeof(SOCKADDR);

char revbuf[100];
char sendbuf[100];
printf("請輸入內容:\n");
while(1)
{

scanf("%s",&sendbuf);
sendto(sockclient,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR*)&clientaddr,len);
recvfrom(sockclient,revbuf,100,0,(SOCKADDR*)&clientaddr,&len);
printf("%s\n",revbuf);

}
closesocket(sockclient);
WSACleanup();
}

大同小異,CSocket只是進行了封裝而已,原理是一樣的,編程要思路靈活才行。

C. 我要一份用java網路編程寫的點對點的兩人聊天程序(TCP和UDP)

Server端:
import java.io.*;
import java.net.*;
import java.applet.Applet;
public class TalkServer{
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
}catch(Exception e) {
System.out.println("can not listen to:"+e);
}
Socket socket=null;
try{
socket=server.accept();
}catch(Exception e) {
System.out.println("Error."+e);
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
System.out.println("Client:"+is.readLine());
line=sin.readLine();
while(!line.equals("bye")){
os.println(line);
os.flush();
System.out.println("Server:"+line);
System.out.println("Client:"+is.readLine());
line=sin.readLine();
}
os.close();
is.close();
socket.close();
server.close();
}catch(Exception e){
System.out.println("Error:"+e);
}
}
}

Client端:
import java.io.*;
import java.net.*;
public class TalkClient {
public static void main(String args[]) {
try{
Socket socket=new Socket("127.0.0.1",4700);
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
PrintWriter os=new PrintWriter(socket.getOutputStream());
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String readline;
readline=sin.readLine(); //從系統標准輸入讀入一字元串
while(!readline.equals("bye")){
os.println(readline);
os.flush();
System.out.println("Client:"+readline);
System.out.println("Server:"+is.readLine());
readline=sin.readLine(); //從系統標准輸入讀入一字元串
}
os.close(); //關閉Socket輸出流
is.close(); //關閉Socket輸入流
socket.close(); //關閉Socket
}catch(Exception e) {
System.out.println("Error"+e); //出錯,則列印出錯信息
}
}
}

閱讀全文

與javaudpsocket編程實例相關的資料

熱點內容
linux伺服器怎麼設置系統 瀏覽:445
centosapache重啟命令 瀏覽:460
冰箱壓縮機qd91h 瀏覽:136
單片機反匯編修改文字 瀏覽:864
網站部署python 瀏覽:998
kettlelinux教程 瀏覽:677
地理科學pdf 瀏覽:147
單片機數據讀取 瀏覽:392
法語教程pdf 瀏覽:996
面試伺服器出現502怎麼定位 瀏覽:803
java讀取http 瀏覽:487
列寧全集pdf下載 瀏覽:334
你好法語pdf 瀏覽:408
安卓怎麼樣讓手機失去色彩 瀏覽:651
oracle11gr2linux 瀏覽:141
茶葉pdf 瀏覽:23
pdf圖怎麼列印 瀏覽:142
app圖標有個e是什麼app 瀏覽:266
linux運行python程序 瀏覽:238
如何打開已編譯文件 瀏覽:215