我有一个简单的 socket
/serversocket
示例,我正在尝试运行该示例,但是当客户端和服务器的 BufferedReader
时,客户端和服务器都会挂起code>s 尝试阅读。以下是每个的代码:
服务器
package picturePerfect;
--imports--
public class PictureServer implements Runnable{
static ServerSocket serverSocket;
public static void main(String[] args) throws IOException {
serverSocket = new ServerSocket(2342);
Thread firstSessionThread = new Thread(new PictureServer());
firstSessionThread.start();
}
@Override
public void run() {
Socket socket = null;
try {
socket = serverSocket.accept();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String clientRequest = bufferedReader.readLine();
System.out.println(clientRequest);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
printWriter.println("Sent from server!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端
package picturePerfect;
--imports--
public class PictureClient {
public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
Socket socket = new Socket("localhost", 2342);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
printWriter.write("Sent from client!");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String response = bufferedReader.readLine();
System.out.println(response);
socket.close();
}
}
这是我可以简化代码的最低限度。我有一个我一直在关注的示例程序,它看起来几乎完全相同。这是示例服务器和客户端(确实工作):
示例服务器
--imports--
public class Server implements Runnable{
static ServerSocket ss;
public static void main(String[] args) throws IOException {
ss = new ServerSocket(3142);
Thread thread = new Thread(new Server());
thread.start();
}
@Override
public void run() {
while ( true ) {
Socket s = null;
try {
s = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String operands = br.readLine();
System.out.println(operands + " was received");
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
pw.println(operands + " right back!");
} catch ( IOException e ) {
e.printStackTrace();
}
}
}
}
示例客户端
--imports--
public class Server implements Runnable{
static ServerSocket ss;
public static void main(String[] args) throws IOException {
ss = new ServerSocket(3142);
Thread thread = new Thread(new Server());
thread.start();
}
@Override
public void run() {
while ( true ) {
Socket s = null;
try {
s = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String operands = br.readLine();
System.out.println(operands + " was received");
PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
pw.println(operands + " right back!");
} catch ( IOException e ) {
e.printStackTrace();
}
}
}
}
我尝试将 while 循环放入我的服务器中,并将我的客户端和服务器移至默认包,但都没有帮助。我还尝试使用 read()
而不是 readLine()
,并以 \r\n
结束 printWriter 的行,但同样不成功那里。
为什么我的代码在 readLine()
上挂起,特别是当示例代码没有挂起时?
最佳答案
readline() 的作用是等待它看到一个新行字符,直到它返回,因此是 readLine()。
在您的客户端中,您不需要编写新行。您使用:
printWriter.write("Sent from client!");
相反,使用 println 将换行符写入流中,
printWriter.println("Sent from client!");
关于Java客户端/服务器不通过Socket/ServerSocket进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23067911/