我在Netbeans中有一个简单的客户端 - 服务器应用程序,它向服务器发送登录请求并从服务器收听答案。
我在Client的构造函数中声明了这些代码:
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
类:
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
仅在第一次点击时调用一次,第二次点击不会调用它,因此它不会执行我的代码。
看起来当发送请求时,它会在Server中创建一个新线程,但在这种情况下,它已经创建,因此它不会再次运行。无论如何,我可以多次发送请求,服务器会全部收听吗?
谢谢
答案 0 :(得分:0)
使用while循环调用processThread()
中方法run()
中的ClientThread
方法。
public void run(){
while(true) processThread();
}
希望这会有所帮助..