服务器未收到客户端的消息

时间:2018-09-21 23:11:49

标签: java sockets

我是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时,似乎第一个控制器正在发送消息(打印“正在发送消息”),但是在第二个控制器上接收消息似乎存在问题,因为收到的消息未打印。

出什么问题了?

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