将两个文件(客户端和服务器)中的代码合并为一个后,控件再也不会到达客户端代码。但是,我需要在后台运行服务器代码,然后运行我的客户端代码。
这是我的代码:
//Server code
try {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(10007);
}
catch (IOException e)
{
System.err.println("Could not listen on port: 10007.");
System.exit(1);
}
Socket clientSocket = null;
System.out.println ("Waiting for connection.....");
try {
clientSocket = serverSocket.accept();
}
catch (IOException e)
{
System.err.println("Accept failed.");
System.exit(1);
}
System.out.println ("Connection successful");
System.out.println ("Waiting for input.....");
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),
true);
BufferedReader in = new BufferedReader(
new InputStreamReader( clientSocket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
{
System.out.println ("Server: " + inputLine);
out.println(inputLine);
if (inputLine.equals("Bye."))
break;
}
out.close();
in.close();
clientSocket.close();
serverSocket.close();
//Client code
String serverHostname = new String ("127.0.0.1");
System.out.println ("Attemping to connect to host " +
serverHostname + " on port 10007.");
Socket echoSocket = null;
try {
echoSocket = new Socket(serverHostname, 10007);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host: " + serverHostname);
} catch (IOException e) {
System.err.println("Couldn't get I/O for "
+ "the connection to: " + serverHostname);
}
BufferedReader stdIn = new BufferedReader(
new InputStreamReader(System.in));
String userInput;
System.out.print ("input: ");
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("echo: " + in.readLine());
System.out.print ("input: ");
}
out.close();
try {
in.close();
stdIn.close();
echoSocket.close();
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
我不明白如何在后台运行我的服务器代码然后运行我的客户端代码。
答案 0 :(得分:0)
您需要制作2个课程:
每个人都有自己的main()方法。
像这样你可以启动2个JVM的一个服务器,一个客户端
或者在一个班级中:
创建2个静态内部类工具Runnable
,然后从主类中开始:(我假设你的主类叫做Starter)
public static main(String args [ ]) {
new Thread(new Starter.Server()).start();
new Thread(new Starter.Client()).start();
}
我会让你做清理代码......
答案 1 :(得分:0)
使用嵌套在主public static class Client
类中的Server
。它们中的每一个都可以有自己的main
方法,因此这是一种在一个文件中实现所有目标的方法,同时还有两个单独的入口点。
另一个选择是拥有一个入口点,但让它启动两个线程,一个用于客户端,一个用于服务器。
答案 2 :(得分:0)
从技术上讲,你可以通过实例化调用服务器代码的线程来在一个源文件中完成所有这些
// Start the Server
new Thread(new Runnable() {
public void run() {
// .. all the server code
}
}).start();
// Start the client
// .. all the client code
在幕后,Java可能会为新的Runnable(){}技术创建匿名内部类。