我是Java套接字编程的新手,我正在尝试编写一个应在2个单独的控制器上运行的程序。我编写了一个用作通信类的线程。
我已经定义了一个名为SFlag的标志,以便在程序中的任何位置将此标志的值更改为1时,相应的控制器都会通过sendPackets()函数向另一个控制器发送问候消息。另一个控制器将通过 ReceivePackets 类接收此消息,并打印结果。这是代码:
#get the count of headings in the modal contaier
headingsCount = len(driver.find_elements_by_xpath("//div[@class='modal-
content']//*[contains(@class,'Package-channels--heading ng-binding')]"))
#use this count as an iterator
for index in range(headingsCount):
#get the first heading - we use replace method bc xpath is not zero-indexed
head = driver.find_element_by_xpath("(//div[@class='modal-content']//*
[contains(@class,'Package-channels--heading ng-binding')])
[index]".replace('index',str(index+1)))
header_placeholder = head.text
##takes heading element as text to use for dataframe row index label
#goes to //ul tag in accordance with current index, finds all BUT the
#headings
channelsPerheading = driver.find_elements_by_xpath("(//div[@class='modal-
content']//ul[@ng-if='vm.channels'])[index]/li[not
(contains(@class,'Package-channels--heading ng-
binding'))]".replace('index',str(index+1)))
temp_list=[]
for channel in channelsPerheading: #append the channels as text to a temp
list
temp_list.append(channel.text.encode('utf-8'))
当SFlag的值更改为1时,似乎第一个控制器正在发送消息(打印“正在发送消息”),但是在第二个控制器上接收消息似乎存在问题,因为收到的消息未打印。
出什么问题了?
答案 0 :(得分:0)
您的代码存在一些问题:
(1)由于两个线程都依靠SFlag
进行通信,因此请确保使用volatile
关键字对其进行声明:
private volatile int SFlag = 0;
volatile
关键字可防止对该变量进行缓存,因此两个线程始终会看到相同的值。除此之外,对volatile
变量的读写操作是原子的。
(2)您在此行中有一个硬编码的端口号:
sentPacket.setPort(20222);
确保这是ReceivePackets
线程使用的端口号。理想情况下,我们永远不要将魔术数字与代码混在一起。因此,您应该将该端口号移至单独的变量或常量。
(3)在Java中,您不应使用String
创建一个new
。例如,这是一种不好的做法:
String tempString = new String("Hello"); // bad practice
您应该这样做:
String tempString = "Hello";
我的最后一条建议是:清理代码。您可以在此处查看有关发送和接收数据报包的Oracle教程:https://docs.oracle.com/javase/tutorial/networking/datagrams/clientServer.html