Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使java套接字工作?如此困惑_Java_Sockets - Fatal编程技术网

如何使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);}
}