可能是一个noobish Q:
所以我做了一个非常简单的单线程服务器/客户端模型。现在,当我在eclipse IDE中执行程序时,它向我显示服务器的System.out而不是客户端的System.out。 当我按下终止时,应该由客户端生成的System.out.println行显示。
我现在已经挣扎了好几天了。希望有人可以帮助我。
提前致谢!
SERVER:
import java.net.*;
import java.io.*;
public class Server {
public static void main(String[] args)
{
new Server();
}
public Server()
{
try
{
ServerSocket serverSocket = new ServerSocket(8000); //nieuw instantie van een ServerSocket
System.out.println("Waiting for clients..");
Socket socket = serverSocket.accept(); // lister for socket requests
while(true)
{
BufferedReader inputClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
DataOutputStream clientOutput = new DataOutputStream(socket.getOutputStream());
String clientInput = inputClient.readLine();
System.out.println("Server: clientInput= : " + clientInput);
InetAddress hostAddress = InetAddress.getByName(clientInput);
String iPaddress = hostAddress.getHostAddress();
System.out.println("Server: IP = : " + iPaddress);
clientOutput.writeBytes(iPaddress);
clientOutput.flush();
}
}
catch(IOException ex)
{
System.err.println(ex);
}
}
}
客户端:
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) {
new Client();
}
public Client()
{
try
{
Socket socket = new Socket("localhost", 8000);
DataOutputStream toServer = new DataOutputStream(socket.getOutputStream());
BufferedReader fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
toServer.writeBytes("google.com" + '\n');
String ip = fromServer.readLine();
System.out.println("Client: "+ ip);
}
catch(IOException ex)
{
System.err.println(ex);
}
}
}
答案 0 :(得分:2)
启动客户端和服务器程序时,它们将有2个独立的控制台。在"控制台"中一次只能看到一个。 Eclipse的视图。这就是你只看到服务器的原因。
您可以使用"显示所选控制台"在活动控制台之间切换。图标(它是一个监视器图标),还可以看到活动的控制台列表。
此外,您还拥有全双工连接。客户端和服务器都可以读/写。您使用DataOutputStream
- BufferedReader
表示形式进行单向通信,这是错误的。
DataOutputStream
写入二进制数据,BufferedReader
读取文本(字符)数据。
您应该使用以下配对之一:
DataOutputStream - DataInputStream and use writeUTF() and readUTF() methods
OR
PrintWriter - BufferedReader and use println() and readLine() methods
答案 1 :(得分:1)
clientOutput.writeBytes(iPaddress);
clientOutput.write("\n".getBytes());
clientOutput.flush();
只需在服务器类中添加这些行(第二行)。
<强>原因强>
在客户端类中,您正在从缓冲区读取器读取一行,但您没有从服务器发送任何指示行尾的字符。所以在第二行,我们正在编写表示行尾的新行字符。
关闭服务器时,将重置连接并读取可用输入。这就是关闭服务器时客户打印的原因。
如果您只想修改Client类,可以选择编写这些行
char [] a = new char[100];
int length = fromServer.read(a);
System.out.println("Client: "+(new String(a)).substring(0,length));
而不是这些
String ip = fromServer.readLine();
System.out.println("Client: "+ ip);
答案 2 :(得分:0)
好的,然后用&#39; \ n&#39;对行进行索引。放线:
套接字socket = serverSocket.accept();
在while循环内部而不是内部尝试{}我摆脱了所有问题。
谢谢,现在我尝试多线程这个东西!