客户/服务器编程

问题描述 投票:0回答:3

我正在练习一个简单的java程序,我正在演示简单的客户端服务器交互。来自服务器的消息的第一部分被转移。程序只是继续运行而不执行?我们是否需要为每个单独的流量创建一个新套接字?

服务器代码

server = new ServerSocket(4587);
System.out.print("Starting the Server on port " + server.getLocalPort() + "\n");
System.out.println("Waiting for client...");

Socket client = server.accept();
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
BufferedReader br1 = new BufferedReader(new InputStreamReader(client.getInputStream()));
br.write("Hello, you are connected to Server. What is your name?");
br.write("\n");
br.flush();



while((s=br1.readLine())!=null)
    {

    }
     br.write("Thank you ");
     br.newLine();
    br.flush();
    }

客户代码

String stdin;
System.out.println("Attempting to connect to " + hostname + ":" + port);
client = new Socket("localhost", 4587);
System.out.println("Connection Established");

BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
while ((stdin = br.readLine()) != null) {
    System.out.println(stdin);
}

BufferedWriter br1 = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
br1.write("Mike");
br1.write("\n");
br1.flush();

while ((stdin = br.readLine()) != null) {
    System.out.println(stdin);
}

服务器输出

Starting the Server on port4587
Waiting for client....

客户输出

 Attempting to connect to :123
 Connection Established
 Hello you are connected to Server, What is ur name

如果这可以帮助..在这两个循环之后

java sockets tcp
3个回答
0
投票

您的服务器将首先通过accept方法与客户端建立连接。如果您希望拥有多个客户端,则需要相应地更改代码以接受该代码。

在客户端,您使用\n来描述消息的结束。这样可以正常工作。每次发送新消息时,请使用\n指示消息的结束。

在服务器端,您应该继续从I / O读取,直到看到\n。此时您已收到整条消息。处理它,然后再开始听。

编辑:

由于您正在等待客户端的名称,因此您只需在服务器上执行以下操作:

BufferedWriter bout = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
BufferedReader bin = new BufferedReader(new InputStreamWriter(client.getInputStream()));
// Wait for incoming name from client.
String name = bin.readline();
System.out.println(name);
// Send a reply.
bout.write("Thank you\n");
bout.flush();

同样,在客户端上(假设binbout定义与上面相同):

// Send name to server.
bout.write("Name\n");
bout.flush();
// Get a response from the server and print to console.
String response = bin.readline();
System.out.println(response);

0
投票

这是因为BufferedReader在读取过程中有一个默认缓冲区= 8K,这个过程是块I / O,所以这将挂起。您应该从服务器端读取客户端的完整消息。


0
投票

你的问题在于客户端的循环。当它等待无限地从服务器发送的readlines时,它将被卡在循环中。 (即,在从服务器读取第一行之后,它将期望来自服务器的更多行并等待读取它们)。

要退出循环,您需要发送EOF信号或流信号结束(根据文档:http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine%28%29

© www.soinside.com 2019 - 2024. All rights reserved.