【发布时间】:2018-02-06 00:20:11
【问题描述】:
我有这两个类 Client.java 和 Server.java,每个类都包含一个 main 方法。这个想法非常简单,其中的代码非常相似。我试图实现的目标是打开一个服务器,它使用ServerSocket 监听特定端口,然后打开一个客户端并使用Socket 连接到服务器这样我终于可以将消息从 client 发送到 server 并反向直到我关闭连接。
到目前为止,我尝试了最简单的示例,在 port 4444 上打开 server,然后在 同一台 PC 上打开客户端连接到地址 127.0.0.1(localhost),在端口 4444。一切顺利,每次都建立成功,除了它不会发送任何消息,从服务器到客户端或从客户端到服务器。
最后一个问题是,我应该怎么做才能在服务器和客户端之间交换消息?我应该修改什么?
Client.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class Client {
private static Socket client;
private static BufferedReader in, console;
private static PrintWriter out;
private static String serverAddress;
private static int port;
public static void main(String[] args) {
try {
console = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Connect to server address (example 192.168.10.11): ");
serverAddress = console.readLine();
System.out.print("Port: ");
port = Integer.parseInt(console.readLine());
System.out.println("\nTrying to connect...");
client = new Socket(serverAddress, port);
System.out.println("Connected to " + client.getRemoteSocketAddress());
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream());
out.write("Connected!!!!!!");
Thread input = new Thread() {
public void run() {
String tmp;
try {
while((tmp = in.readLine()) != null) {
System.out.println("Server: " + tmp);
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
Thread output = new Thread() {
public void run() {
String tmp;
try {
while((tmp = console.readLine()) != null) {
out.print(tmp);
}
} catch(IOException e) {
e.printStackTrace();
}
}
};
input.start();
output.start();
while(true) {
if(!input.isAlive() && !output.isAlive()) {
client.close();
in.close();
console.close();
out.close();
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Server.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private static ServerSocket serverSocket;
private static Socket server;
private static BufferedReader in, console;
private static PrintWriter out;
private static int port;
public static void main(String[] args) {
try {
console = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Open server on port (example 1234): ");
port = Integer.parseInt(console.readLine());
System.out.println("Server open");
serverSocket = new ServerSocket(port);
System.out.println("Waiting for a client to connect...\n");
server = serverSocket.accept();
System.out.println("Client " + server.getRemoteSocketAddress() + " connected!");
in = new BufferedReader(new InputStreamReader(server.getInputStream()));
out = new PrintWriter(server.getOutputStream(), true);
Thread input = new Thread() {
public void run() {
String tmp;
try {
while((tmp = in.readLine()) != null) {
System.out.println("Client: " + tmp);
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
Thread output = new Thread() {
public void run() {
String tmp;
try {
while((tmp = console.readLine()) != null) {
out.print(tmp);
}
} catch(IOException e) {
e.printStackTrace();
}
}
};
input.start();
output.start();
while(true) {
if(!input.isAlive() && !output.isAlive()) {
serverSocket.close();
server.close();
in.close();
console.close();
out.close();
break;
}
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
【问题讨论】:
-
这是一个看起来很像您的代码的教程。它可以满足您的要求。 careerbless.com/samplecodes/java/beginners/socket/…
-
感谢您的回复。我已经看过很多这样的教程。问题是我试图在这两个类中使用这两个线程,就像任何经典的实时聊天一样,从服务器到客户端的输入和输出同时反向工作。我设法让它在没有线程的情况下工作,所以很可能问题出在 run() 方法中。 @Remixt
标签: java sockets server client-server serversocket