日期:2014-05-20  浏览次数:20695 次

java多线程 Socket
我的主要想法是做一个服务器 可以让两个用户之间进行消息,文件传输。为此我在客户端为每个用户开辟了两个线程 一个用于文件传输一个用于消息传输,每个线程都有一个与之对应的Socket连接 同样在服务器端也为每个与它连接的客户端开了两个线程(文件传输线程,消息线程) 用来在两个客户端之间进行消息的转发。同时我将客户端与服务器端的线程都做成了死循环 以此来不断得读取传送过来的消息和文件信息。可是当我创建了一个用户时cpu的占用率就40%左右了再开一个就100% 有点崩溃了在这样下去的话,后来的什么也做不了了?求大神们帮帮看看啊到底是哪里出了问题啊,是因为我没有将线程休眠吗?那又应该在哪里休眠呢?新手请求大家的指教
同时还有一个问题在下面代码中已经标注也请大家看看啊,小女子不胜感激。
服务器端代码
public class Server1 {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(9999);
System.out.println("服务器9999号端口在监听。。");
int a = 1;//这里的a没有任何的意义,只是为了简化代码,使第一次是消息线程连接 与之连接  第二次是文件传输线程

while (true) {
Socket s = ss.accept();
if (a == 1) {
MessageServerThread mst = new MessageServerThread(s);
mst.start();
System.out.println("服务器端传输消息线程开启" + mst.getName());
a = 2;
} else if (a == 2) {
TransportFileServerThread tfst = new TransportFileServerThread(
s);
tfst.start();
System.out.println("服务器端传输文件线程开启" + tfst.getName());
a = 1;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
客户端代码:

public class LoginFrame {
public static void main(String[] args) {
// 启动两个线程
Socket s;
try {
// 用户1
s = new Socket("127.0.0.1", 9999);
MessageClientThread mct = new MessageClientThread(s);
mct.start();
System.out.println("客户端1消息线程开启" + mct.getName());
s = new Socket("127.0.0.1", 9999);
TransportFileClientThread tfct = new TransportFileClientThread(s);
tfct.start();
System.out.println("客户端1文件传输线程开启" + tfct.getName());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
客户端文件传输线程代码:
public class TransportFileClientThread extends Thread {
Socket s;

public TransportFileClientThread(Socket s) {
this.s = s;
}
    public void run() {
while (true) {
try {
DataInputStream dis = new DataInputStream(
new BufferedInputStream(s.getInputStream()));
//之后将文件保存在本地
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
客户端消息线程代码:

public class MessageClientThread extends Thread {
Socket s;

public MessageClientThread(Socket s) {
this.s = s;
}

public void run() {
while (true) {
try {
ObjectInputStream ois = new ObjectInputStream(
s.getInputStream());
//之后处理得到的消息
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}