运行应用程序作为服务器和客户端

Suh*_*pta 3 java networking server

我想让我的电脑和服务器兼容.这是我的代码

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();
   } 
 }
Run Code Online (Sandbox Code Playgroud)

}

在这里,我试图使我的计算机既服务器又客户端. 我在cmd上运行这个程序, java tester hello但程序一直在等待.我应该怎么做以接收键入的消息.

*如果代码中有任何修改,请提出建议.请注意,目的是使我的电脑和服务器兼容.

Jon*_*eet 35

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

暂时,我只是在两个不同的命令窗口中启动两次 - 一次使用命令行参数(使其成为客户端),一次不启动(使其成为服务器).

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

if (args.length == 1) {
  Client();
} else {
  Server();
}
Run Code Online (Sandbox Code Playgroud)

(您可能还希望同时开始遵循Java命名约定,顺便说一下,将方法重命名为client()server().)

然后Server()从结尾删除调用Client(),并调用无参数DatagramSocket构造函数Client()以避免尝试成为服务器...

完成的代码看起来事情是这样的:

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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Suhail:按键盘上的"返回"键.否则称为"进入". (21认同)
  • @Suhail:这就是我半小时前给你*非常详细的指示的原因.下次有人花时间给你详细的帮助时,请确保在说它不起作用之前仔细阅读了他们的答案. (19认同)
  • 你是一个软件开发人员......你不知道'回报'是什么意思?我很确定这是非法的. (9认同)
  • +1 @Jon你值得一百万名代表:) (8认同)
  • @Jon Skeet请告诉'回复'是什么意思? (4认同)