Java网络客户端只发送一条消息
我正在学习Java,并且正在编写一个客户机-服务器应用程序的示例。 Sok凯特连接正常,在客户端应用程序发出第二条消息之前,一切正常。它无法到达服务器。如果我启动另一个客户端,它也会在第一条消息中成功,而在第二条消息中失败 有人有主意吗?提前谢谢 服务器代码:Java网络客户端只发送一条消息,java,networking,Java,Networking,我正在学习Java,并且正在编写一个客户机-服务器应用程序的示例。 Sok凯特连接正常,在客户端应用程序发出第二条消息之前,一切正常。它无法到达服务器。如果我启动另一个客户端,它也会在第一条消息中成功,而在第二条消息中失败 有人有主意吗?提前谢谢 服务器代码: package networking; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStream; import j
package networking;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private static Socket socket;
public static void main(String[] args) {
try {
int port = 25000;
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("Server Started and listening to the port 25000");
//Server is running always. This is done using this while(true) loop
while (true) {
//Reading the message from the client
socket = serverSocket.accept();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String incomingMessage = br.readLine();
System.out.println("((( " + incomingMessage);
String returnMessage = incomingMessage;
//Sending the response back to the client.
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
bw.write(returnMessage + "\n");
bw.flush();
System.out.println("))) " + returnMessage);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (Exception e) {
}
}
}
}
客户呢
package networking;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Client {
private static Socket socket;
public static void main(String args[]) {
try {
String host = "localhost";
int port = 25000;
InetAddress address = InetAddress.getByName(host);
socket = new Socket(address, port);
//Send the message to the server
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String message = "";
/*
while(!message.equals("q")) {
System.out.print("Message: ");
message = console.readLine();
bw.write(message + "\n");
bw.flush();
System.out.println("))) " + message);
//Get the return message from the server
String incomingMessage = br.readLine();
System.out.println("((( " + incomingMessage);
}
*/
for (int i = 0; i < 10; i++) {
bw.write(i + "\n");
bw.flush();
System.out.println("))) " + i);
String incomingMessage = br.readLine();
System.out.println("((( " + incomingMessage);
}
} catch (Exception exception) {
exception.printStackTrace();
} finally {
//Closing the socket
try {
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
包联网;
导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.io.OutputStream;
导入java.io.OutputStreamWriter;
导入java.net.ServerSocket;
导入java.net.Socket;
公共类客户端{
专用静态插座;
公共静态void main(字符串参数[]){
试一试{
String host=“localhost”;
int端口=25000;
InetAddress=InetAddress.getByName(主机);
套接字=新套接字(地址、端口);
//将消息发送到服务器
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=新的OutputStreamWriter(os);
BufferedWriter bw=新的BufferedWriter(osw);
BufferedReader控制台=新的BufferedReader(新的InputStreamReader(System.in));
InputStream=socket.getInputStream();
InputStreamReader isr=新的InputStreamReader(is);
BufferedReader br=新的BufferedReader(isr);
字符串消息=”;
/*
而(!message.equals(“q”)){
系统输出打印(“消息:”);
message=console.readLine();
写入(消息+“\n”);
bw.flush();
System.out.println(“)”+消息);
//从服务器获取返回消息
字符串incomingMessage=br.readLine();
System.out.println(“(“+输入消息”);
}
*/
对于(int i=0;i<10;i++){
写入(i+“\n”);
bw.flush();
System.out.println(“)”+i);
字符串incomingMessage=br.readLine();
System.out.println(“(“+输入消息”);
}
}捕获(异常){
异常。printStackTrace();
}最后{
//合上插座
试一试{
socket.close();
}捕获(例外e){
e、 printStackTrace();
}
}
}
}
您的服务器未设置为处理此问题。您正在读取一行,然后放弃GC的连接,而不关闭它。服务器读取一行,然后忽略所有其他行,并开始侦听下一个连接
也可以考虑使用线程。
没有设置服务器来处理这个问题。您正在读取一行,然后放弃GC的连接,而不关闭它。服务器读取一行,然后忽略所有其他行,开始监听下一连接。也可以考虑使用线程。
< p>您的<代码> 在您的服务器代码中被错误放置,并且实际上您需要2代码>而Roo:- 一个是用来接受新客户的
- 一个用于通过客户端管理多条消息
while (true):
accept new client
while (client connected):
read message from client
write back message to client
close client socket
如果要使用线程,则必须将内部while
循环任务委托给新线程
注意:
accept
在新客户端到来之前一直处于阻止状态。这就是为什么客户端只能发送一条消息。您的while
在服务器代码中放错了位置,实际上您需要2个while
循环:
- 一个是用来接受新客户的
- 一个用于通过客户端管理多条消息
while (true):
accept new client
while (client connected):
read message from client
write back message to client
close client socket
如果要使用线程,则必须将内部while
循环任务委托给新线程
注意:
accept
在新客户端到来之前一直处于阻止状态。这就是为什么客户端只能发送一条消息。在服务器上,在完成连接后关闭conn。否则,它将使您更容易受到DDoS攻击!在服务器上,在完成连接后关闭conn。否则,它将使您更容易受到DDoS攻击re!我将尝试使用线程重写它,然后返回结果。谢谢!我将尝试使用线程重写它,然后返回结果。谢谢!但是如果没有线程,您一次不能使用多个客户端…但是如果没有线程,您一次不能使用多个客户端。。。