我正在使用Datagramsocket和DatagramPacket制作一个简单的server_client应用程序。我想做的是:一个客户端将数据发送到服务器,服务器将这些数据发送到另一个客户端。问题是服务器从第一个客户端接收数据,但不将它们发送到另一个客户端,我怎么知道我将发送到的客户端的端口?端口没有改变吗?
这是客户端类:
public class DatagramClient extends JFrame {
private JTextField jtf = new JTextField();
private JTextArea jta = new JTextArea();
private DatagramSocket socket;
private byte[] buf = new byte[256];
private InetAddress address;
private DatagramPacket sendPacket;
private DatagramPacket receivePacket;
public static void main(String[] args) {
new DatagramClient();
}
public DatagramClient() {
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
p.add(new JLabel("Enter radius"), BorderLayout.WEST);
p.add(jtf, BorderLayout.CENTER);
jtf.setHorizontalAlignment(JTextField.RIGHT);
setLayout(new BorderLayout());
add(p, BorderLayout.NORTH);
add(new JScrollPane(jta), BorderLayout.CENTER);
jtf.addActionListener(new ButtonListener()); // Register listener
setTitle("DatagramClient");
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
try {
socket = new DatagramSocket();
address = InetAddress.getByName("localhost");
sendPacket =
new DatagramPacket(buf, buf.length, address, 8000);
receivePacket = new DatagramPacket(buf, buf.length);
}
catch (IOException ex) {
ex.printStackTrace();
}
}
private class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
try {
Arrays.fill(buf, (byte)0);
sendPacket.setData(jtf.getText().trim().getBytes());
socket.send(sendPacket);
socket.receive(receivePacket);
jta.append("Radius is " + jtf.getText().trim() + "\n");
jta.append("Area received from the server is "
+ Double.parseDouble(new String(buf).trim()) + '\n');
}
catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
服务器类:
public class DatagramServer extends JFrame {
private JTextArea jta = new JTextArea();
private byte[] buf = new byte[256];
public static void main(String[] args) {
new DatagramServer();
}
public DatagramServer() {
setLayout(new BorderLayout());
add(new JScrollPane(jta), BorderLayout.CENTER);
setTitle("DatagramServer");
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
try {
DatagramSocket socket = new DatagramSocket(8000);
jta.append("Server started at " + new Date() + '\n');
DatagramPacket receivePacket =
new DatagramPacket(buf, buf.length);
DatagramPacket sendPacket ;
while (true) {
Arrays.fill(buf, (byte)0);
socket.receive(receivePacket);
jta.append("The client host name is "+receivePacket.getAddress().getHostAddress() +
" and port number is " + receivePacket.getPort() + '\n');
jta.append("Radius received from client is " +
new String(buf).trim() + '\n');
double radius = Double.parseDouble(new String(buf).trim());
double area = radius * radius * Math.PI;
jta.append("Area is " + area + '\n');
InetAddress addr=InetAddress.getByName("127.0.0.1");
sendPacket = new DatagramPacket(buf, buf.length);
sendPacket.setAddress(addr);
sendPacket.setData(new Double(area).toString().getBytes());
socket.send(sendPacket);
}
}
catch(IOException ex) {
ex.printStackTrace();
}
}
}
我是这么想的——我没有运行你的代码来验证。
从您的代码来看,客户端套接字似乎没有绑定到任何端口——我假设您的代码也用于其他客户端。基本上,如果UDP服务器(接收器)需要接收数据包(数据报),则必须将其绑定到端口,UDP客户端(发送器)必须在该端口上发送数据包。对于客户端的发送端,当您将数据包构建为“DatagramPacket(buf,buf.length,address,8000);”时,您可以正确地执行此操作。
当服务器接收到这个数据包时,它会将数据包发送到本地主机(“127.0.0.1”),但您似乎没有指定这个传出数据包的端口号。所以,你需要做两件事。首先,将客户端绑定到另一个端口(比如9000),然后创建包9000的目标端口并发送它。
顺便说一句,如果您只有一个发送者和接收者,那么您可以使用接收到的数据包的端口号“receivePacket.getPort()”来将响应反映回发送者。但是,由于您有两个客户端,因此不能使用此方法。因此,您需要确保第二个客户端也绑定到端口。
我正在Unity中制作一个游戏,我试图将数据从客户端发送到服务器并返回到客户端(试图保存实例),但当我收到数据并尝试将数据发送回客户端时,它表示udp客户端未连接。 它成功地将数据从我的Unity客户端发送到服务器,但一旦它到达那里,套接字就会断开连接,我就无法返回任何内容。正如你所看到的,我试图设置一些多播选项,但它似乎不能正常工作。 客户: 服务器: 因此,服务器中UdpClient的实例会保
我使用的是Netty 3.9.5,我有一个简单的客户机-服务器设置,我从http://en.wikipedia.org/wiki/Netty_(软件)#Netty\u TCP\u示例。我扩展了这个示例,将Java search plan对象从客户端发送到服务器。在这个网站上跟踪用户的帮助下,我已经能够让这个程序按预期运行。 现在,我想让我的读卡器/服务器程序同时接受多个客户端。我想我会使用下面列出
问题内容: 好吧,我正在尝试使用SocketServer构建一个小型python prgram,该服务器应该将其接收的消息发送给所有连接的客户端。我被困住了,我不知道如何在服务器端存储客户端,也不知道如何发送到多个客户端。哦,我的程序每次连接1个以上的客户端时失败,并且每次客户端发送的1条以上消息都失败… 到目前为止,这是我的代码: 显然,我不知道自己在做什么,所以任何帮助都将非常有用。 提前致谢
我需要实现一个github授权,然后将接收到的数据(JSON)发送到客户端。 我找到了这篇教程http://shiya.io/how-to-do-3-legged-oauth-with-github-a-general-guide-by-example-with-node-js/ 在该教程中,开发人员向我们展示了如下内容:“/”->“/login”->“/redirect”->“/user”(此处
客户端要做的是: 连接服务器 发送信息 发送的每个信息,等待和接收从服务器返回的同样的信息 关闭连接 用 ChannelHandler 实现客户端逻辑 跟写服务器一样,我们提供 ChannelInboundHandler 来处理数据。下面例子,我们用 SimpleChannelInboundHandler 来处理所有的任务,需要覆盖三个方法: channelActive() - 服务器的连接被建立
说明 此接口用于门店终端用掉一个排队号码 请求地址 http://api.dc78.cn/Api/wwnext 请求方式 GET 请求参数 URL参数 参数名称 必填 描述 范例 id 排队号码id state 使用状态 -1:作废过号,1:就餐,0:恢复一个作废号 POST参数 描述 无 GET参数 参数名称 必填 描述 范例 id 排队号id 是 协议9.1中取得的id 5573 state