无法在 Java 中使用 Serversocket 多次发送请求
Cannot send request for more than once with Serversocket in Java
我在 Netbeans 中有一个简单的客户端-服务器应用程序,它向服务器发送登录请求并听取服务器的响应。
我在客户端的构造函数中声明了这些代码:
try {
socket = new Socket("localhost", 12345);
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
}catch (Exception e) {
e.printStackTrace();
}
点击str
按钮时的请求发送者是登录信息:
public void request_login(String str) {
try {
this.oos.writeInt(1);
this.oos.writeUTF(str);
this.oos.flush();
System.out.println("CLIENT: Sent!");
int responseCode = this.ois.readInt();
if (responseCode == Protocol.OK) {
//OK handler
}else {
//Fail handler
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NullPointerException ee) {
ee.printStackTrace();
}
}
这是我的服务器:
public ServerATM() {
try {
this.serversocket = new ServerSocket(12345);
System.out.println("Server is listening!");
for(;;){
Socket socket = this.serversocket.accept();
Thread t = new ClientThread(socket);
t.start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
和 ClientThread
class:
public ClientThread(Socket socket) {
this.socket = socket;
try {
this.ois = new ObjectInputStream(socket.getInputStream());
this.oos = new ObjectOutputStream(socket.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void processThread() {
try {
int requestCode = this.ois.readInt();
switch(requestCode) {
case 1:
String request = ois.ReadUTF();
// Handle the code with the request.
//Then return the result for client
oos.writeInt(5);
oos.flush();
break;
case 2:
break;
}
} catch (IOException ex) {
Logger.getLogger(ClientThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void run(){
processThread();
}
代码在第一次点击时运行良好。但是当我更改输入字符串并再次单击时,代码就会挂起。 processThread
仅在第一次点击时调用一次,第二次点击不会调用它,因此不会执行我的代码。
看起来在发送请求时,它会在服务器中创建一个新线程,但在这种情况下它已经创建,因此不会再次 运行。无论如何我可以发送多次请求并且服务器会全部监听?
谢谢
使用 while 循环在 ClientThread
的方法 run()
中调用 processThread()
方法。
public void run(){
while(true) processThread();
}
希望这会有所帮助..
我在 Netbeans 中有一个简单的客户端-服务器应用程序,它向服务器发送登录请求并听取服务器的响应。
我在客户端的构造函数中声明了这些代码:
try {
socket = new Socket("localhost", 12345);
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
}catch (Exception e) {
e.printStackTrace();
}
点击str
按钮时的请求发送者是登录信息:
public void request_login(String str) {
try {
this.oos.writeInt(1);
this.oos.writeUTF(str);
this.oos.flush();
System.out.println("CLIENT: Sent!");
int responseCode = this.ois.readInt();
if (responseCode == Protocol.OK) {
//OK handler
}else {
//Fail handler
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NullPointerException ee) {
ee.printStackTrace();
}
}
这是我的服务器:
public ServerATM() {
try {
this.serversocket = new ServerSocket(12345);
System.out.println("Server is listening!");
for(;;){
Socket socket = this.serversocket.accept();
Thread t = new ClientThread(socket);
t.start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
和 ClientThread
class:
public ClientThread(Socket socket) {
this.socket = socket;
try {
this.ois = new ObjectInputStream(socket.getInputStream());
this.oos = new ObjectOutputStream(socket.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void processThread() {
try {
int requestCode = this.ois.readInt();
switch(requestCode) {
case 1:
String request = ois.ReadUTF();
// Handle the code with the request.
//Then return the result for client
oos.writeInt(5);
oos.flush();
break;
case 2:
break;
}
} catch (IOException ex) {
Logger.getLogger(ClientThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void run(){
processThread();
}
代码在第一次点击时运行良好。但是当我更改输入字符串并再次单击时,代码就会挂起。 processThread
仅在第一次点击时调用一次,第二次点击不会调用它,因此不会执行我的代码。
看起来在发送请求时,它会在服务器中创建一个新线程,但在这种情况下它已经创建,因此不会再次 运行。无论如何我可以发送多次请求并且服务器会全部监听?
谢谢
使用 while 循环在 ClientThread
的方法 run()
中调用 processThread()
方法。
public void run(){
while(true) processThread();
}
希望这会有所帮助..