我发现了线程实现的问题,这对我来说很奇怪.也许有些人可以向我解释,会很棒.
我正在开发类似代理的程序,一个程序(在不同的机器上运行),它通过eth0接收数据包并通过ath0(无线)发送到另一台机器,它正在完成同样的事情.实际上我完全不确定是什么导致了我的问题,那是因为我对一切,linux和c编程都是新手.
我开始两个线程,
如果我使用线程,我会得到一个错误:
sh-2.05b# ./socketex
Failed to send network header packet.
: Interrupted system call
Run Code Online (Sandbox Code Playgroud)
如果我使用fork(),程序按预期工作.有人可以向我解释这种行为吗?
只是为了显示发送者实现,它的代码片段是:
while(keep_going) {
memset(&buffer[0], '\0', sizeof(buffer));
recvlen = recvfrom(sockfd_in, buffer, BUFLEN, 0, (struct sockaddr *) &incoming, &ilen);
if(recvlen < 0) {
perror("something went wrong / incoming\n");
exit(-1);
}
strcpy(msg, buffer);
buflen = strlen(msg);
sentlen = ath_sendto(sfd, &btpinfo, &addrnwh, &nwh, buflen, msg, &selpv2, &depv);
if(sentlen == E_ERR) {
perror("Failed to send network header packet.\n");
exit(-1);
}
}
Run Code Online (Sandbox Code Playgroud)
更新:我的主文件,启动线程或进程(fork)
int main(void) { …Run Code Online (Sandbox Code Playgroud) 我刚开始使用JavaFX,已经需要一些建议.我applicaton.fxml在MainApplication的start(Stage ...)方法(在我的application.fxml文件中指定了ApplicationController )中使用FXMLLoader 加载(使用Oracle SceneBuiler创建).
<AnchorPane id="AnchorPane" disable="false" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" styleClass="theme" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="app.AppController">
...more code here...
<ComboBox id="cmb_locations" fx:id="cmb_locations">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="Item 1" />
<String fx:value="Item 2" />
<String fx:value="Item 3" />
</FXCollections>
</items>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
现在,我有一个ComboBox在applicaton.fxml,其中有三个项目(默认项).我需要的是ComboBox在启动期间使用我自己的值填充它.有谁知道如何实现这一点以及在何处放置相关的代码片段(app.AppController或类似的东西)?提前致谢.
我是OSGi的新手,也是接近它的一切.
跳进问题:我有一个服务器类,它保存了一个监听器列表,监听器可以通过一个方法(register(this))将自己的监听器放入上面提到的列表中来注册它们(所有监听器当然都实现了服务器类监听器接口) :
public void register(ServerListener listener) {
if(theListeners == null)
theListeners = new ArrayList<ServerListener>();
theListeners.add(listener);
}
Run Code Online (Sandbox Code Playgroud)
这是ServerListener界面:
public interface ServerListener {
public void update(JsonObject data);
}
Run Code Online (Sandbox Code Playgroud)
现在,服务器类通过一种update(JsonObject object)方法不时向监听器提供新数据.
public void updateListeners() {
new Thread() {
public void run() {
for(ServerListener l : theListeners) {
l.update(jsonObject);
}
}
}.start();
}
Run Code Online (Sandbox Code Playgroud)
现在,我想将服务器类修改为OSGi框架(Knopflerfish)中的服务包.我根本不熟悉.我想尝试只是为了好玩,但我现在这样做的方式不起作用,听众实际上并不知道他们应该实现ServerListener接口.因此服务器无法通过接口注册它们.
问题是,我想服务器推送数据,而不是客户端拉(根据我的理解,这会更容易).有人(了解我的不良解释)能指出我正确的方向吗?
我正在开发的应用程序应该能够监听多个(现在是 4 个)端口号。我是否需要为每个端口创建一个套接字,例如:
if((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
perror("error: could not create UDP socket\n");
exit(EXIT_FAILURE);
}
bzero(&sock_addr, sizeof(sock_addr));
sock_addr.sin_family = AF_INET;
sock_addr.sin_port = htons(port1);
sock_addr.sin_addr.s_addr = inet_addr(INADDR_ANY);
if(bind(sock_fd, (struct sockaddr *) &sock_addr, sock_len) < 0) {
perror("error: could not bind UDP socket to AU\n");
exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)
或者有更优雅的方法来做到这一点吗?我还读到了该select()声明,我应该使用它吗?我想监听多个端口的原因很简单,它应该识别我正在与之通信的应用程序。例如,每个端口一个应用程序。
预先感谢您的评论。
// 更新:我应该如何为每个端口设置一个套接字?
我试图找到一个基于中心点绘制椭圆的解决方案,而不是在Ellipse2D.Double的构造函数中指定的左上角.如图所示,椭圆应具有相同的中心点和比例,是否有可能?

在此先感谢您的帮助.
我需要一些Java Swing组件及其功能方面的帮助.我需要一个添加JPanel到JFrame和油漆的Ellipse2D就可以了.在Ellipse2D我想要添加另一个元素,在我的情况下它是一张图片(现在我使用一个ImageIcon,也许是错误的).如何Ellipse2D在面板上添加和添加图片,如附图所示?
我需要分离图像的原因是,因为我需要有时改变椭圆的填充颜色.
谢谢你的帮助.
我有一个问题是将Windows批处理文件更改为unix shell脚本,以便在我的linux机器上执行相同的java代码.
我的shell脚本看起来像这样:
#!/bin/bash
libdir=../lib
bindir=.
LIBS=$libdir/lib_1.jar;$libdir/lib_2.jar;$libdir/lib_3.jar;$libdir/lib_4.jar
java -cp $bindir;$LIBS com.sample.SampleServer
Run Code Online (Sandbox Code Playgroud)
对我来说它看起来正确但我收到以下错误信息:
Failed to load Main-Class manifest attribute from /home/user/development/lib/lib_2.jar
在此先感谢您的帮助.
我知道之前已经讨论过这个问题了,但我找不到合适的解决方案来解决我的问题.我想ServerSocket在后台运行一个线程,监听指定的端口.它实际上工作,但只有一次.似乎服务器正在侦听的端口从未正确关闭,并且在我尝试重新启动时仍然处于活动状态(O不重新启动线程本身).有人能说出为什么它不能正常工作吗?在此先感谢您的帮助......!
编辑:
我在客户端遇到同样的问题.我有一个发送者线程,也不能停止.最好的方法是什么?
的ClientConnector只是它连接到服务器端口和发送数据的类.这不是一个线程或类似的东西.
这是我的发件人类:
private class InternalCamSender extends Thread {
private int sendInterval = 500; // default 500 ms
private ClientConnector clientConn = null;
public InternalCamSender() {
this.sendInterval = getSendingInterval();
this.clientConn = new ClientConnector();
}
@Override
public void run() {
while(!Thread.currentThread().isInterrupted()) {
clientConn.sendCamPdu(CodingScheme.BER, createNewPDU());
try {
Thread.sleep(sendInterval);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我试着像这样处理它的行为:
if(jButton_startSending.getText().equals(STARTSENDING)) {
new Thread() {
public void run() {
iSender = new InternalCamSender();
iSender.start();
jButton_startSending.setText(STOPSENDING);
}
}.start(); …Run Code Online (Sandbox Code Playgroud)