java利用Socket在控制台互发信息没有正常显示

【网络编程】java利用Socket在控制台互发信息。但是在客户端控制台输入信息后,服务器端控制台无消息显示。
原因:PrintWriter printWriter = new PrintWriter(outputStream, true); 必须在加上true,意味着想要将数据打印到outputStream中,并使用自动刷新。
加上后代码如下,结果如图:
在这里插入图片描述

客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Client3 {
public static void main(String[] args) throws IOException {
// 创建socket对象,指定数据接收方的ip地址和端口号
Socket client = new Socket("localhost", 10001);
//----------------从控制台输入服务器端输出----------
// 从控制台输入数据
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
// 存入缓冲区
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
// 获取输出流对象,向服务端发送数据
OutputStream outputStream = client.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream, true);
//------------接收服务器端数据--------------------
InputStream inputStream = client.getInputStream();
InputStreamReader inputStreamReader2 = new InputStreamReader(inputStream);
BufferedReader bufferedReader2 = new BufferedReader(inputStreamReader2);

while (true) {
System.out.println("我说:");
String str = bufferedReader.readLine(); // 获取数据
printWriter.println(str);

String receive = bufferedReader2.readLine(); // 获取数据
System.out.println("服务器说:" + receive);
}
}
}

服务器端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package server;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
* 多线程解决
*/
public class Server3 {
public static void main(String[] args) throws IOException {

try {
// 服务端需要使用serversocket来开放本地的端口
ServerSocket serverSocket = new ServerSocket(10001);
Socket socket = serverSocket.accept();
//------------接收客户端数据---------------
// 通过server获取输入流对象
InputStream inputStream = null;
inputStream = socket.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader br = new BufferedReader(inputStreamReader);
//------------向客户端输出数据---------------
OutputStream outputStream = null;
outputStream = socket.getOutputStream();
PrintWriter printWriter = new PrintWriter(outputStream, true);
InputStreamReader isr2 = new InputStreamReader(System.in);
BufferedReader br2 = new BufferedReader(isr2);
while (true) {
String str = null; //读出缓存区数据
str = br.readLine();
System.out.println("客户端说:" + str);

System.out.println("我说:");
String str2 = null;
str2 = br2.readLine();
printWriter.println(str2);
}
} catch (Exception e){

}
}
}

也可以利用多线程实现上述代码。只需要改变Server3.java,再增加一个ServerThread.java即可。

Server3.java
public class Server3 {
    public static void main(String[] args) throws IOException {
        // 服务端需要使用serversocket来开放本地的端口
        ServerSocket serverSocket = new ServerSocket(10001);
        Socket socket = serverSocket.accept();
        ServerThread serverThread = new ServerThread(socket);
        new Thread(serverThread).start();
    }
}
ServerThread.java
public class ServerThread implements Runnable{
    private Socket socket;

public ServerThread(Socket socket) {
    this.socket = socket;
}

@Override
public void run() {
    try {
        //------------接收客户端数据---------------
        // 通过server获取输入流对象
        InputStream inputStream = null;
        inputStream = socket.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader br = new BufferedReader(inputStreamReader);
        //------------向客户端输出数据---------------
        OutputStream outputStream = null;
        outputStream = socket.getOutputStream();
        PrintWriter printWriter = new PrintWriter(outputStream, true);
        InputStreamReader isr2 = new InputStreamReader(System.in);
        BufferedReader br2 = new BufferedReader(isr2);
        while (true) {
            String str = null; //读出缓存区数据
            str = br.readLine();
            System.out.println("客户端说:" + str);

            System.out.println("我说:");
            String str2 = null;
            str2 = br2.readLine();
            printWriter.println(str2);
        }
    } catch (Exception e){

    }
}

}