第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定

UDP編程,使用多線程的時候為什么在run方法中獲取不到值?

如圖:我將接受到的packet傳過來后,在構(gòu)造方法中能夠獲取對應(yīng)的值(可以看到通過構(gòu)造方法獲取到的port是55419),但是如果要在run方法中獲取端口號(第三個紅框標(biāo)記部分)等信息,就獲取不到,程序變成阻塞中,沒有其他報錯信息~

https://img1.sycdn.imooc.com//5baa01a80001081908980546.jpg




我的代碼如下:

Server:

package?com.socket.socketsender.UDPSoceket;

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

public?class?UDPServer?{

????public?static?void?main(String[]?args)?throws?IOException?{
????????//接收請求
????????DatagramSocket?socket?=?new?DatagramSocket(8110);//指定服務(wù)器端口
????????byte[]?data?=?new?byte[1024];
????????DatagramPacket?packet?=?new?DatagramPacket(data,?data.length);//創(chuàng)建數(shù)據(jù)報,用于接收客戶端發(fā)送的數(shù)據(jù)
????????System.out.println("========服務(wù)器已啟動,正在等待客戶端發(fā)送數(shù)據(jù)======");
????????while?(true)?{
????????????socket.receive(packet);//此方法在接收到客戶端數(shù)據(jù)之前會一直阻塞
????????????new?Thread(new?ThreadUDPServer(socket,?packet)).start();
????????}
????}

????private?static?class?ThreadUDPServer?implements?Runnable?{
????????private?DatagramPacket?packet;
????????private?String?info;
????????private?DatagramSocket?socket;
????????private?InetAddress?address;
????????private?int?port;

????????public?ThreadUDPServer(DatagramSocket?socket,?DatagramPacket?packet)?{
????????????this.socket?=?socket;
????????????this.packet?=?packet;
????????????this.info?=?new?String(packet.getData(),?0,?packet.getLength());//在run方法中獲取不到info???
????????????this.address=packet.getAddress();
????????????this.port=packet.getPort();
????????}
????????@Override
????????public?void?run()?{
????????????int?test?=?packet.getPort();
????????????System.out.println("接收到客戶端的消息是:"?+?info);
????????????//發(fā)送響應(yīng)信息
????????????byte[]?data2?=?"這是服務(wù)器的響應(yīng)信息:登錄成功".getBytes();
????????????DatagramPacket?packet2?=?new?DatagramPacket(data2,?data2.length,?address,?port);
????????????try?{
????????????????socket.send(packet2);
????????????}?catch?(IOException?e)?{
????????????????e.printStackTrace();
????????????}
????????}
????}
}


client:

package?com.socket.socketsender.UDPSoceket;

import?java.io.IOException;
import?java.net.*;

public?class?UDPClient?{

????public?static?void?main(String[]?args)?throws?IOException?{


????????try?(DatagramSocket?socket?=?new?DatagramSocket())?{
????????????//發(fā)送請求
????????????InetAddress?addresses?=?InetAddress.getByName("localhost");
????????????byte[]?data?=?"用戶名:小王;密碼:123456".getBytes();
????????????int?port?=?8110;
????????????DatagramPacket?packet?=?new?DatagramPacket(data,?data.length,?addresses,?port);
????????????byte[]?data2?=?new?byte[1024];
????????????socket.send(packet);
????????????//接收響應(yīng)信息
????????????DatagramPacket?packet2?=?new?DatagramPacket(data2,?0,?data2.length);
????????????socket.receive(packet2);
????????????String?info?=?new?String(data2,0,packet2.getLength());
????????????System.out.println("接收到服務(wù)器的響應(yīng)信息:"+info);
????????}



????}
}


正在回答

2 回答

你的DatagramSocket socket是主線程的東西,新建的其他線程當(dāng)然用不了,你把sokect放在公共區(qū)用volatile修飾讓所有線程共享就可以了,親測。

代碼:

????

public?class?UDPServer2?{

????public?static?volatile?DatagramSocket?socket;//指定服務(wù)器端口

????static?{
????????try?{
????????????socket?=?new?DatagramSocket(8110);
????????}?catch?(SocketException?e)?{
????????????e.printStackTrace();
????????}
????}
????public?static?volatile?byte[]?data?=?new?byte[1024];
????public?static?volatile?DatagramPacket?packet?=?new?DatagramPacket(data,?data.length);//創(chuàng)建數(shù)據(jù)報,用于接收客戶端發(fā)送的數(shù)據(jù)

????public?static?void?main(String[]?args)?throws?IOException?{
????????//接收請求
//????????DatagramSocket?socket?=?new?DatagramSocket(8110);//指定服務(wù)器端口
//????????byte[]?data?=?new?byte[1024];
//????????DatagramPacket?packet?=?new?DatagramPacket(data,?data.length);//創(chuàng)建數(shù)據(jù)報,用于接收客戶端發(fā)送的數(shù)據(jù)
????????System.out.println("========服務(wù)器已啟動,正在等待客戶端發(fā)送數(shù)據(jù)======");
????????while?(true)?{
????????????socket.receive(packet);//此方法在接收到客戶端數(shù)據(jù)之前會一直阻塞
????????????new?Thread(new?ThreadUDPServer(socket,?packet)).start();
????????????try?{
????????????????Thread.sleep(100);
????????????}?catch?(InterruptedException?e)?{
????????????????e.printStackTrace();
????????????}
????????}
????}

}


0 回復(fù) 有任何疑惑可以回復(fù)我~

還有如要非要用while(true)最好用

Thread.sleep();

解放一下cpu,不然沒很有可能卡機(jī)

0 回復(fù) 有任何疑惑可以回復(fù)我~

舉報

0/150
提交
取消
Java Socket應(yīng)用---通信是這樣練成的
  • 參與學(xué)習(xí)       125006    人
  • 解答問題       627    個

分享的是 Java 中的網(wǎng)絡(luò)編程,使用Socket實現(xiàn)網(wǎng)絡(luò)聊天通信

進(jìn)入課程

UDP編程,使用多線程的時候為什么在run方法中獲取不到值?

我要回答 關(guān)注問題
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號