【问题标题】:Run application both as server and client作为服务器和客户端运行应用程序
【发布时间】:2011-07-22 22:43:56
【问题描述】:

我想让我的电脑既是服务器又是客户端。 这是我的代码

import java.net.*;
class tester {
static int pos=0; 
 static byte buffer[]=new byte[100];
   static void Client() throws Exception {
    InetAddress address=InetAddress.getLocalHost();
  DatagramSocket ds=new DatagramSocket(3000,address);
   while(true) {
    int c=System.in.read();
    buffer[pos++]=(byte)c;
    if((char)c=='\n')
      break;
   }
   ds.send(new DatagramPacket(buffer,pos,address,3000));
  Server();
}                   

static void Server() throws Exception {
 InetAddress address=InetAddress.getLocalHost();
 DatagramSocket ds=new DatagramSocket(3001,address);
 DatagramPacket dp=new DatagramPacket(buffer,buffer.length);
 ds.receive(dp);
 System.out.print(new String(dp.getData(),0,dp.getLength()));
}
  public static void main(String args[])throws Exception {

 if(args.length==1) {
  Client();
   } 
 }

}

在此我尝试将我的计算机作为服务器和客户端。 我在 cmd 上运行这个程序 java tester hello 但程序一直在等待。我应该怎么做才能收到输入的消息。

*如果对代码有任何修改,请提出。注意,我的目的是让我的电脑既是服务器又是客户端。

【问题讨论】:

  • 为什么要在每个问题的末尾加上 _networking?如果您的意思是说这是一个与网络相关的问题,您可以在问题中使用多个标签

标签: java networking server


【解决方案1】:

目前,您的应用程序将作为服务器作为客户端运行,具体取决于您是否提供命令行参数。要在同一进程中同时运行,您需要(至少)启动两个线程 - 一个用于服务器,一个用于客户端。

目前,我只需要在两个不同的命令窗口中启动它两次——一次带有命令行参数(使其成为客户端),一次没有(使其成为服务器)。

编辑:我刚刚注意到您的主要方法永远不会运行Server()。所以你需要把它改成这样:

if (args.length == 1) {
  Client();
} else {
  Server();
}

(您可能还想同时开始遵循 Java 命名约定,顺便将方法重命名为 client()server()。)

然后将Client()末尾的Server()调用去掉,在Client()中调用无参数的DatagramSocket构造函数,避免试图成为服务器...

完成的代码可能看起来像这样

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

public class ClientServer {

   private static void runClient() throws IOException {
     InetAddress address = InetAddress.getLocalHost();
     DatagramSocket ds=new DatagramSocket();
     int pos = 0;
     byte[] buffer = new byte[100];
     while (pos < buffer.length) {
       int c = System.in.read();
       buffer[pos++]=(byte)c;
       if ((char)c == '\n') {
         break;
       }
     }
     System.out.println("Sending " + pos + " bytes");
     ds.send(new DatagramPacket(buffer, pos, address, 3000));
  }                   

  private static void runServer() throws IOException {
    byte[] buffer = new byte[100];
    InetAddress address = InetAddress.getLocalHost();
    DatagramSocket ds = new DatagramSocket(3000, address);
    DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
    ds.receive(dp);
    System.out.print(new String(dp.getData(), 0, dp.getLength()));
  }

  public static void main(String args[]) throws IOException {
    if (args.length == 1) {
      runClient();
    } else {
      runServer();
    }
  }
}

请注意,这仍然不是很棒的代码,尤其是使用系统默认字符串编码...但它可以工作。通过运行java ClientServer 在一个窗口中启动服务器,然后在另一个窗口中运行java ClientServer xxx,键入一条消息并按回车键。您应该在服务器窗口中看到它。

【讨论】:

  • @Jon Skeet 请告诉您“按返回”是什么意思?
  • @Suhail:按键盘上的“return”键。否则称为“输入”。
  • @Suhail:我刚刚在 Windows 7 上尝试过,它没有任何改变就可以工作。它确实要求我解除对防火墙应用程序的阻止……这可能是问题吗?
  • @Suhail:这就是为什么我在半小时前给了你非常详细的说明。下次有人花时间给你详细的帮助时,请确保你在说它不起作用之前仔细阅读了他们的答案。
  • 您是一名软件开发人员..您不知道“按返回”是什么意思?我很确定这是非法的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多