如何使java套接字工作?如此困惑
这是我的服务器的代码,它应该从用户那里获取输入,打印到控制台,然后发送回用户如何使java套接字工作?如此困惑,java,sockets,Java,Sockets,这是我的服务器的代码,它应该从用户那里获取输入,打印到控制台,然后发送回用户 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 DateServer { publi
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 DateServer {
public static void main(String[] args) throws Exception {
ServerSocket listener = new ServerSocket(10219);
Socket s = listener.accept();
InputStreamReader in = new InputStreamReader(s.getInputStream());
BufferedReader input = new BufferedReader(in);
PrintWriter out = new PrintWriter(s.getOutputStream());
out.println("connected");
out.flush();
System.out.println("connected");
String test;
while (true) {
try {
test = input.readLine();
System.out.println(test);
out.println(test + " is what I recieved");
out.flush();
} catch(Exception X) {System.out.println(X);}
}
}
}
这是客户端的代码:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.*;
public class DateClient {
public static Scanner keyboard = new Scanner(System.in);
public static void main(String[] args) throws Exception {
System.out.println("Enter IP Address of a machine that is");
System.out.println("running the date service on port 10219:");
String serverAddress = keyboard.next();
Socket s = new Socket(serverAddress, 10219);
BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter out = new PrintWriter(s.getOutputStream());
System.out.println(input.readLine());
while(true){
try{
System.out.println(input.readLine());
out.println(keyboard.next());
out.flush();
} catch(Exception X){System.out.println(X);}
}
}
}
这是为在局域网上工作而设计的。我不知道它为什么不工作,所发生的一切是客户端将收到消息“已连接”,而无论在客户端键入什么,都不会发生其他任何事情。说到java,我是个笨蛋,但在谷歌搜索了一大堆java库之后,我似乎无法让它工作。我做错了什么?您的客户端和服务器都互相等待对方尝试执行
input.readLine()
如果删除服务器的out.println(“已连接”)
及其相应客户端的第一个input.readLine()
,则很容易看到这一点
在客户机上,您可能应该先编写响应,然后再读取响应。尝试对以下行重新排序:
System.out.println(input.readLine());
out.println(keyboard.next());
out.flush();
得到
out.println(keyboard.next());
out.flush();
System.out.println(input.readLine());
从服务器向客户机发送一行,但在客户机中,在接受用户输入发送到服务器之前,需要等待两行 请记住,
input.readLine()
在收到数据之前会一直阻塞,您能否在此处找到以下问题:
服务器:
out.println("connected");
while (true) {
try {
input.readLine();
}
}
客户:
input.readLine();
while(true) {
try {
input.readLine();
out.println(keyboard.next());
}
}
(多余的代码被删除,只显示有问题的语句序列)在客户端,尝试更改
PrintWriter out = new PrintWriter(s.getOutputStream());
System.out.println(input.readLine());
while(true){
try{
System.out.println(input.readLine());
out.println(keyboard.next());
out.flush();
} catch(Exception X){System.out.println(X);}
}
到
您的客户端尝试读取两行,但您的服务器只发送一行,然后轮询输入,因此两行都被锁定。此外,由于您的服务器正在逐行读取数据,所以您的客户机应该逐行发送数据
PrintWriter out = new PrintWriter(s.getOutputStream());
while(true){
try{
System.out.println(input.readLine());
out.println(keyboard.nextLine());
out.flush();
} catch(Exception X){System.out.println(X);}
}