【Java】Java UDP 套接字編程亂碼問題


零、發現問題

  • 用Java寫了個UDP收發程序,發現中文有問題!
package socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class send {
	/**
	 * 發送UDP數據
	 * @param args
	 */
	public static void main(String[] args) {
		
		String str = "hello 這是一個JavaUDP實例!";
		
		DatagramSocket socket = null;
		
		try {
			
			socket = new DatagramSocket();//創建數據包套接字
			
			DatagramPacket packet = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("127.0.0.1"), 7217);//構建數據包
			
			socket.send(packet);//發送數據包
			
			socket.close();//關閉套接字
			
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(socket!=null) {
				socket.close();//關閉套接字
			}
		}

	}

}

package socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class recive {
	
	static int port = 7217;//監聽的端口
	
	/**
	 * 接收UDP數據
	 * @param args
	 */
	public static void main(String[] args) {
		
		DatagramSocket socket = null;

		try {
			
			socket = new DatagramSocket(port);//開始監聽端口
			
			DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//創建緩存區
			
			socket.receive(packet);//接收數據,這里阻塞
			
			byte[] dataArray = packet.getData();//獲取收到的數據
			int portSend = packet.getPort();//獲取發送的端口
			InetAddress address = packet.getAddress();//獲取發送的地址
			int length = packet.getLength();//獲取數據的長度
			
			System.out.println(
					"地址:"+address.getHostAddress()
					+"\n端口:"+portSend
					+"\n數據:\t"
					+ "長度:"+dataArray.length+"\n"
					+ "\t內容:"+new String(dataArray,0,length));//顯示內容
			
			socket.close();//關閉套接字
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			if(socket!=null) {
				socket.close();//關閉套接字
			}
		}
	}

}

一、顯示不全

顯示不全

解決方法:把發送端的

DatagramPacket packet = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("127.0.0.1"), 7217);//構建數據包

修改為

DatagramPacket packet = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("127.0.0.1"), 7217);//構建數據包

總結:收發雙方應統一使用

str.getBytes().length

獲取長度

二、顯示亂碼

顯示亂碼

解決方法:使用統一編碼
發送端的

DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 7217);//構建數據包

修改為

DatagramPacket packet = new DatagramPacket(str.getBytes(), str.getBytes("UTF-8").length, InetAddress.getByName("127.0.0.1"), 7217);//構建數據包

接收端的

System.out.println(
					"地址:"+address.getHostAddress()
					+"\n端口:"+portSend
					+"\n數據:\t"
					+ "長度:"+dataArray.length+"\n"
					+ "\t內容:"+new String(dataArray,0,length));//顯示內容

修改為

System.out.println(
					"地址:"+address.getHostAddress()
					+"\n端口:"+portSend
					+"\n數據:\t"
					+ "長度:"+dataArray.length+"\n"
					+ "\t內容:"+new String(dataArray,0,length,"UTF-8"));//顯示內容

總結:收發雙方String在跟Byte數組轉換時應該指定編碼

三、收到很多方塊

在解決第二個問題的時候,出現過這種問題:
方塊問題

是因為一開始從Byte轉到String時指定了編碼沒有指定長度

new String(dataArray,"UTF-8");

指定一下長度就可以了

new String(dataArray,0,length,"UTF-8");

四、總結

基本上亂碼都是跟編碼有關或者轉換的時候收發雙方處理不一致造成的。在以后的開發中需要注意!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM