溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android中如何使用UDP協(xié)議傳輸數(shù)據(jù)

發(fā)布時(shí)間:2021-11-24 11:58:26 來(lái)源:億速云 閱讀:302 作者:小新 欄目:移動(dòng)開(kāi)發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)Android中如何使用UDP協(xié)議傳輸數(shù)據(jù),小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

1.使用UDP協(xié)議傳輸數(shù)據(jù)

UDP協(xié)議不可靠,數(shù)據(jù)包發(fā)送出去之后無(wú)法確定是否被接收方接收到

在Java里寫(xiě)好Server如下

package com.umgsai.server;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Calendar;
import java.util.Date;

public class Server {
	static Date date ;
	public static void main(String[] args) {
		while (true) {
			try {
				// 創(chuàng)建一個(gè)DatagramSocket對(duì)象,并指定監(jiān)聽(tīng)的端口號(hào)
				DatagramSocket socket = new DatagramSocket(4572);
				byte data[] = new byte[1024];
				// 創(chuàng)建一個(gè)空的DatagramPacket對(duì)象
				DatagramPacket packet = new DatagramPacket(data, data.length);
				// 使用receive方法接收客戶端所發(fā)送的數(shù)據(jù)
				socket.receive(packet);
				String result = new String(packet.getData(),
						packet.getOffset(), packet.getLength());
				date = Calendar.getInstance().getTime();
				System.out.println(date);
				System.out.println("result--->" + result);
				socket.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

客戶端在Android里面編寫(xiě)

界面activity_main.xml

  <Button 
	android:id="@+id/sendMessage"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="發(fā)送消息"
    />

Android4.0+操作系統(tǒng)中連接網(wǎng)絡(luò)的操作不能在主線程中進(jìn)行

public class MainActivity extends Activity {

	private Button sendMessage = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		sendMessage = (Button) findViewById(R.id.sendMessage);
		sendMessage.setOnClickListener(new clientListener());
		
	}

	class clientListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			HandlerThread handlerThread = new HandlerThread("handler_Thread");
            handlerThread.start();
            ClientHandler clientHandler = new ClientHandler(handlerThread.getLooper());
            Message msg = clientHandler.obtainMessage();
            Bundle bundle = new Bundle();
            msg.setData(bundle);
            // 將msg發(fā)送到目標(biāo)對(duì)象,即生成msg對(duì)象的Handler對(duì)象
            msg.sendToTarget();
		}
		
	}
	
	class ClientHandler extends Handler {
        public ClientHandler() {
 
        }
 
        public ClientHandler(Looper looper) {
            super(looper);
        }
 
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Bundle bundle = msg.getData();
            try {
				// 首先創(chuàng)建一個(gè)DatagramSocket對(duì)象
				DatagramSocket socket = new DatagramSocket(4572);
				// 創(chuàng)建一個(gè)InetAddree
				InetAddress serverAddress = InetAddress.getByName("192.168.77.215");
				String str = "hello";
				byte data[] = str.getBytes();
				// 創(chuàng)建一個(gè)DatagramPacket對(duì)象,并指定要講這個(gè)數(shù)據(jù)包發(fā)送到網(wǎng)絡(luò)當(dāng)中的哪個(gè)地址,以及端口號(hào)
				DatagramPacket packet = new DatagramPacket(data,
						data.length, serverAddress, 4572);
				// 調(diào)用socket對(duì)象的send方法,發(fā)送數(shù)據(jù)
				socket.send(packet);
				socket.close();
				Toast.makeText(MainActivity.this, "數(shù)據(jù)已發(fā)送", Toast.LENGTH_SHORT).show();
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
        }
    }
}

客戶端需要的權(quán)限

  <uses-permission android:name="android.permission.INTERNET" />


TCP協(xié)議是可靠的協(xié)議

TCPServer.java

public class TCPServer {
	public static void main(String[] args) throws IOException {
		ServerSocket listen = new ServerSocket(5050);

		Socket server = listen.accept();

		InputStream in = server.getInputStream();
		OutputStream out = server.getOutputStream();

		char c = (char) in.read();
		System.out.println("收到:" + c);

		out.write('s');

		out.close();
		in.close();
		server.close();
		listen.close();
	}

}

TCPClient.java

public class TCPClient {
	public static void main(String[] args) throws IOException {
		Socket client = new Socket("127.0.0.1", 5050);

		InputStream in = client.getInputStream();
		OutputStream out = client.getOutputStream();

		out.write('c');

		char c = (char) in.read();
		System.out.println("收到:" + c);

		out.close();
		in.close();
		client.close();
	}

}

Socket編程與Android操作系統(tǒng)無(wú)關(guān),使用的是Java.net包里的類(lèi)。

在Android里面進(jìn)行網(wǎng)絡(luò)編程的時(shí)候要注意不能將連接網(wǎng)絡(luò)的代碼放到主線程里。

PS:在非UI線程里顯示Toast的時(shí)候要按照下面的方式寫(xiě)

Looper.prepare();
Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
Looper.loop();


Mars視頻提供的TCP例子如下

Server端

class ServerThread extends Thread {
		public void run(){
		//聲明一個(gè)ServerSocket對(duì)象
		ServerSocket serverSocket = null;
		try {
			//創(chuàng)建一個(gè)ServerSocket對(duì)象,并讓這個(gè)Socket在4567端口監(jiān)聽(tīng)
			serverSocket = new ServerSocket(4567);
			//調(diào)用ServerSocket的accept()方法,接受客戶端所發(fā)送的請(qǐng)求
			Socket socket = serverSocket.accept();
			//從Socket當(dāng)中得到InputStream對(duì)象
			InputStream inputStream = socket.getInputStream();
			byte buffer [] = new byte[1024*4];
			int temp = 0;
			//從InputStream當(dāng)中讀取客戶端所發(fā)送的數(shù)據(jù)
			while((temp = inputStream.read(buffer)) != -1){
				System.out.println(new String(buffer,0,temp));
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally{
			try {
				serverSocket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	
	}
}

Client端

public class TCPClient {
	public static void main(String[] args) {
		try {
			//創(chuàng)建一個(gè)Socket對(duì)象,指定服務(wù)器端的IP地址和端口號(hào)
			Socket socket = new Socket("192.168.1.104",4567);
			//使用InputStream讀取硬盤(pán)上的文件
			InputStream inputStream = new FileInputStream("f://file/words.txt");
			//從Socket當(dāng)中得到OutputStream
			OutputStream outputStream = socket.getOutputStream();
			byte buffer [] = new byte[4*1024];
			int temp = 0 ;
			//將InputStream當(dāng)中的數(shù)據(jù)取出,并寫(xiě)入到OutputStream當(dāng)中
			while((temp = inputStream.read(buffer)) != -1){
				outputStream.write(buffer, 0, temp);
			}
			outputStream.flush();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

在調(diào)試的時(shí)候拋如下異常,暫未解決

java.net.SocketException: Connection reset

at java.net.SocketInputStream.read(Unknown Source)

at java.net.SocketInputStream.read(Unknown Source)

at java.net.SocketInputStream.read(Unknown Source)

at com.umgsai.server.TCPServer.main(TCPServer.java:25)

關(guān)于“Android中如何使用UDP協(xié)議傳輸數(shù)據(jù)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI