我正在练习一个简单的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
如果这可以帮助..在这两个循环之后
您的服务器将首先通过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();
同样,在客户端上(假设bin
和bout
定义与上面相同):
// 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);
这是因为BufferedReader在读取过程中有一个默认缓冲区= 8K,这个过程是块I / O,所以这将挂起。您应该从服务器端读取客户端的完整消息。
你的问题在于客户端的循环。当它等待无限地从服务器发送的readlines时,它将被卡在循环中。 (即,在从服务器读取第一行之后,它将期望来自服务器的更多行并等待读取它们)。
要退出循环,您需要发送EOF信号或流信号结束(根据文档:http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html#readLine%28%29)