~~~
package com.sjf;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketException;
/**
* @time 2015-05-27
* @desc UDP通信
* @author sjf0115
*
*/
public class Server {
private byte[] buffer = new byte[1024];
private DatagramSocket socket = null;
private DatagramPacket packet = null;
private InetSocketAddress socketAddress = null;
private InetAddress clientAddress;
private String clientIP;
private int clientPort;
private String clientData;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 構造函數,綁定主機和端口.
* @param ip IP 地址
* @param port 端口
* @throws Exception
*/
public Server(String ip, int port) throws Exception
{
// 綁定IP地址和端口.
Bind(ip,port);
System.out.println("[服務端啟動]");
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public Server() throws SocketException
{
// 構造數據報套接字并將其綁定到本地主機上任何可用的端口
socket = new DatagramSocket();
System.out.println("[服務端啟動]");
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 綁定監聽地址和端口.
* @param ip IP地址
* @param port 端口
* @throws SocketException
*/
public void Bind(String ip, int port) throws SocketException {
// 根據 IP 地址和端口號創建套接字地址
socketAddress = new InetSocketAddress(ip, port);
// 創建數據報套接字,將其綁定到指定的本地地址
socket = new DatagramSocket(socketAddress);
packet = new DatagramPacket(buffer, buffer.length);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public final String getOrgIp()
{
return clientIP;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 設置超時時間
* @param timeout 超時時間
* @throws Exception
*/
public void SetTimeout(int timeout) throws Exception
{
/* 啟用/禁用帶有指定超時值的 SO_TIMEOUT,以毫秒為單位。
* 將此選項設為非零的超時值時,對此 DatagramSocket 調用 receive() 將只阻塞此時間長度。
* 如果超過超時值,將引發 java.net.SocketTimeoutException,雖然 DatagramSocket 仍舊有效。
* 選項必須在進入阻塞操作前被啟用才能生效。
*/
socket.setSoTimeout(timeout);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 獲得超時時間.
* @return 返回超時時間.
* @throws Exception
*/
public int GetTimeout() throws Exception
{
return socket.getSoTimeout();
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 接收數據包,該方法會造成線程阻塞.
* @return 返回接收的數據串信息
* @throws IOException
*/
public String Receive() throws IOException
{
/*
* 從此套接字接收數據報包。當此方法返回時,DatagramPacket 的緩沖區填充了接收的數據。
* 數據報包也包含發送方的 IP 地址和發送方機器上的端口號。此方法在接收到數據報前一直阻塞。
* 數據報包對象的 length 字段包含所接收信息的長度。如果信息比包的長度長,該信息將被截短。
*/
socket.receive(packet);
// 數據報包包含發送方的 IP 地址
clientAddress = packet.getAddress();
clientIP = clientAddress.getHostAddress();
// 數據報包包含發送方的端口號
clientPort = packet.getPort();
// 數據報包包含發送方的數據
clientData = new String(packet.getData(), 0, packet.getLength());
return " ["+clientData+"]";
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 將響應包發送給請求端.
* @param bytes 回應報文
* @throws IOException
*/
public void Send(String info) throws IOException
{
packet.setAddress(clientAddress);
packet.setPort(clientPort);
packet.setData(info.getBytes());
/*
* 從此套接字發送數據報包。DatagramPacket 包含的信息指示:將要發送的數據、其長度、遠程主機的 IP 地址和遠程主機的端口號。
*/
socket.send(packet);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 關閉udp監聽口.
*/
public void close()
{
try
{
socket.close();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 測試方法.
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String serverHost = "127.0.0.1";
int serverPort = 3344;
Server udpServerSocket = new Server(serverHost, serverPort);
while (true)
{
String info = udpServerSocket.Receive();
System.out.println("["+udpServerSocket.clientPort+"]->"+info);
udpServerSocket.Send("Reponse-----"+info);
}
}
}
~~~
~~~
package com.sjf;
import java.io.*;
import java.net.*;
/**
* @time 2015-05-27
* @desc UDP通信
* @author QPING
*/
public class Client {
private byte[] buffer = new byte[1024];
private DatagramSocket socket = null;
private InetSocketAddress socketAddress = null;
private String clientIP;
private int clientPort;
private String clientData;
private InetAddress clientAddress;
private DatagramPacket sendPacket;
private DatagramPacket receivePacket;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public Client(String host, int port) throws Exception
{
// 根據 IP 地址和端口號創建套接字地址
socketAddress = new InetSocketAddress(host, port);
// 創建數據報套接字,將其綁定到指定的本地地址
socket = new DatagramSocket(socketAddress);
System.out.println("服務端啟動!");
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 構造函數,創建UDP客戶端
* @throws Exception
*/
public Client() throws Exception
{
socket = new DatagramSocket();
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 設置超時時間,該方法必須在bind方法之后使用.
* @param timeout 超時時間
* @throws Exception
*/
public final void SetTimeout(final int timeout) throws Exception
{
socket.setSoTimeout(timeout);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 獲得超時時間.
* @return 返回超時時間
* @throws Exception
*/
public int GetTimeout() throws Exception
{
return socket.getSoTimeout();
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public DatagramSocket GetSocket()
{
return socket;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 向指定的服務端發送數據信息.
* @param ip 服務器主機地址
* @param port 服務端端口
* @param bytes 發送的數據信息
* @return 返回構造后俄數據報
* @throws IOException
*/
public DatagramPacket Send(String ip,int port,String info) throws IOException
{
byte[] bytes = info.getBytes();
sendPacket = new DatagramPacket(bytes, bytes.length);
sendPacket.setAddress(InetAddress.getByName(ip));
sendPacket.setPort(port);
socket.send(sendPacket);
return sendPacket;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 接收從指定的服務端發回的數據.
* @param lhost 服務端主機
* @param lport 服務端端口
* @return 返回從指定的服務端發回的數據.
* @throws Exception
*/
public String Receive(String lhost,int lport) throws Exception
{
receivePacket = new DatagramPacket(buffer, buffer.length);
socket.receive(receivePacket);
// 數據報包包含發送方的 IP 地址
clientAddress = receivePacket.getAddress();
clientIP = clientAddress.getHostAddress();
// 數據報包包含發送方的端口號
clientPort = receivePacket.getPort();
// 數據報包包含發送方的數據
clientData = new String(receivePacket.getData(), 0, receivePacket.getLength());
return "["+clientData+"]";
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 關閉udp連接.
*/
public void close()
{
try
{
socket.close();
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
* 測試客戶端發包和接收回應信息的方法.
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String serverHost = "127.0.0.1";
int serverPort = 3344;
String myIP = "127.0.0.2";
int myPort = 3333;
Client client = new Client(myIP,myPort);
while(true)
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("["+myPort+"] ");
String str = br.readLine();
client.Send(serverHost, serverPort, str);
String info = client.Receive(serverHost, serverPort);
System.out.println("["+client.clientPort+"]->" + info);
}
}
}
~~~
- 前言
- [Hibernate開發之路](1)Hibernate配置
- [Hibernate開發之路](2)Hibernate問題
- [Hibernate開發之路](3)基礎配置
- [Hibernate開發之路](4)ID生成策略
- [Hibernate開發之路](5)聯合主鍵
- [設計模式實踐之路](1)單例模式
- [Java]UDP通信的簡單例子
- [Java]套接字地址InetAddress講解
- [Java開發之路](1)final關鍵字
- [Java開發之路](2)Java字符串
- [Java開發之路](3)Java常用類
- [Java開發之路](4)String、StringBuffer與StringBuilder詳解
- [Java開發之路](5)異常詳解
- [Java開發之路](6)File類的使用
- [Java開發之路](7)RandomAccessFile類詳解
- [Java開發之路](8)輸入流和輸出流
- [Java開發之路](9)對象序列化與反序列化
- [Java開發之路](10)DOM解析XML文檔
- [Java開發之路](11)SAX解析XML文檔
- [Java開發之路](12)JDOM和DOM4J解析XML文檔
- [Java開發之路](14)反射機制
- [Java開發之路](15)注解
- [Java開發之路](16)學習log4j日志
- [Java開發之路](18)關于Class.getResource和ClassLoader.getResource的路徑問題
- [Java開發之路](19)Long緩存問題
- [Java開發之路](20)try-with-resource 異常聲明
- [Java開發之路](21)Comparator與Comparable
- [Java]Java工程師成神之路
- [細說Java](1)圖說字符串的不變性
- [細說Java](2)Java中字符串為什么是不可變的
- [細說Java](3)創建字符串是使用" "還是構造函數?