我写一个网络socket服务器端的界面,但不知怎么回事,老是死在线程里,具体如下:
/////////开启服务方法
private void startActionPerformed(java.awt.event.ActionEvent evt) {
try {
serverSocket = new ServerSocket(port);
displayArea.setText("服务器启动成功...");
//若注掉下面××中的代码,可以显示 "服务器启动成功..."
//但若未注掉,就不显示 "服务器启动成功...",且处于无响应状态
//××××××××××××××××××××××××××××××××××××××××
while(true){
Socket socket;
try {
socket = serverSocket.accept();
Thread workThread = new serverThread(socket);
workThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
//×××××××××××××××××××××××××××××××××××××××× } catch (IOException ex) {
Logger.getLogger(serverJFrame.class.getName()).log(Level.SEVERE, null, ex);
} }
///////////////////////////若有请求,服务端调用的线程
package sock.network;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;/**
*
* @author qinguan
*/
public class serverThread extends Thread{
public serverThread(Socket socket) {
this.socket = socket;
}
public void run(){
BufferedReader br = null;
PrintWriter pw = null;
try {
str = "New connection accepted " + socket.getInetAddress() + ":" + socket.getPort();
System.out.println(str);
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw = new PrintWriter(socket.getOutputStream(), true);
while ((msg = br.readLine()) != null) {
msg=socket.getInetAddress()+":"+socket.getPort()+"say:"+msg;
System.out.println(msg);
pw.println(msg);
if(msg.equals("bye"))
break;
}
} catch (IOException ex) {
Logger.getLogger(serverThread.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
br.close();
} catch (IOException ex) {
Logger.getLogger(serverThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
} private Socket socket;
private String str;
private String msg;
}不知道为什么,求知道的指点下。谢谢。。
/////////开启服务方法
private void startActionPerformed(java.awt.event.ActionEvent evt) {
try {
serverSocket = new ServerSocket(port);
displayArea.setText("服务器启动成功...");
//若注掉下面××中的代码,可以显示 "服务器启动成功..."
//但若未注掉,就不显示 "服务器启动成功...",且处于无响应状态
//××××××××××××××××××××××××××××××××××××××××
while(true){
Socket socket;
try {
socket = serverSocket.accept();
Thread workThread = new serverThread(socket);
workThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
//×××××××××××××××××××××××××××××××××××××××× } catch (IOException ex) {
Logger.getLogger(serverJFrame.class.getName()).log(Level.SEVERE, null, ex);
} }
///////////////////////////若有请求,服务端调用的线程
package sock.network;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;/**
*
* @author qinguan
*/
public class serverThread extends Thread{
public serverThread(Socket socket) {
this.socket = socket;
}
public void run(){
BufferedReader br = null;
PrintWriter pw = null;
try {
str = "New connection accepted " + socket.getInetAddress() + ":" + socket.getPort();
System.out.println(str);
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw = new PrintWriter(socket.getOutputStream(), true);
while ((msg = br.readLine()) != null) {
msg=socket.getInetAddress()+":"+socket.getPort()+"say:"+msg;
System.out.println(msg);
pw.println(msg);
if(msg.equals("bye"))
break;
}
} catch (IOException ex) {
Logger.getLogger(serverThread.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
br.close();
} catch (IOException ex) {
Logger.getLogger(serverThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
} private Socket socket;
private String str;
private String msg;
}不知道为什么,求知道的指点下。谢谢。。
线程写在循环里了,
只需要在run方法里循环监听就可以了。
你这样等于无限创造线程了,不死才怪啊
public void run()
{
try
{
/** 监听端口,如果有用户登陆就建立连接 */
while(true)
{
socket = serverSocket.accept();
new serverThread(socket);
//然后在serverThread的构造方法里启动线程this.start();
}
}
catch(IOException e)
{
System.err.println("Not listening......"+e);
}
}
这个run方法指的是哪里的?serverThread里的?如果依旧放在主类中,还是卡死啊?
try {
// TODO add your handling code here:
serverSocket = new ServerSocket(port);
displayArea.setText("服务器启动成功...");
this.start();//color=#FF0000]方法未找到[[/color]
// this.service();
} catch (IOException ex) {
Logger.getLogger(serverJFrame.class.getName()).log(Level.SEVERE, null, ex);
} }
Socket socket;
try {
//监听端口,如果有用户登陆就建立连接
while(true){
socket = serverSocket.accept();
new serverThread(socket);
//然后在serverThread的构造方法里启动线程this.start();
}
} catch (Exception e) {
System.err.println("Not listening......"+e);
}
}
Thread current;
然后按钮里
多个判断,免得重复启动了
if(current == null && !current.isAlive()) {
current= new Thread(this);
current.start();
}