黑马程序员技术交流社区
标题:
各位大神们,帮忙看下小问题啊。
[打印本页]
作者:
一碗小米周
时间:
2013-12-5 10:45
标题:
各位大神们,帮忙看下小问题啊。
本帖最后由 一碗小米周 于 2013-12-5 13:02 编辑
package gui;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class LoginInClient {
public static void main(String[] args){
try
{
Socket s = new Socket("172.16.21.50",10030);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw =new PrintWriter(s.getOutputStream(),true);
BufferedReader brr =new BufferedReader(new InputStreamReader(s.getInputStream()));
for(int i=0;i<3;i++){
String line =br.readLine();
pw.println(line);
s.shutdownOutput();
String str =brr.readLine();
System.out.println(str);
}
br.close();
s.close();
}
catch (UnknownHostException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
复制代码
package gui;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class LoginInServer {
public static void main(String[] args){
try
{
ServerSocket ss = new ServerSocket(10030);
Socket s = ss.accept();
System.out.println("shhit");
while(true)
{
new Thread(new myThread2(s)).start();
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
class myThread2 implements Runnable{
private Socket s;
public myThread2(Socket s) {
this.s=s;
}
public void run(){
try
{
for(int i=0;i<3;i++){
BufferedReader br =new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = br.readLine();
BufferedReader brr = new BufferedReader(new FileReader("E:\\sql.txt"));
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
String line =null;
while((line=brr.readLine())!=null){
if(str.equals(line))
{
pw.println("登陆成功");
break;
}
else {
pw.println("登陆失败,请尝试登陆!");
break;
}
}
}
}
catch (Exception e)
{
}
}
}
复制代码
上面是我写的一个登陆到服务器的一个简单小程序。但是当我开启服务器段的时候,再开启客户端,myeclipse就会死了。cpu运行达到100%。出现卡机现象。求大神帮忙看看啊。谢谢各位了。
作者:
Jim-剣◆﹏
时间:
2013-12-5 11:02
本帖最后由 Jim-剣◆﹏ 于 2013-12-5 11:20 编辑
哈哈,一看你的问题描述就知道怎么回事,肯定是写了多线程,我曾经遇到过这个问题,小研究了下
你的问题出在服务端
在这段代码里
try
16. {
17. ServerSocket ss = new ServerSocket(10030);
18. Socket s = ss.accept();
19. System.out.println("shhit");
20. while(true)
21. {
22. new Thread(new myThread2(s)).start();
23. }
24. }
很明显,你的循环条件是true,这样写的后果会:无论有没有客户端连接进来,我都无限开启线程,那么这是一个死循环,会不断地开启线程,CPU使用率自然会达到100%
应该把Socket s = ss.accept();这句放进循环体中,因为 ss.accept();这个方法是阻塞式的方法
只有当有新的客户端连接进来的时候才会返回一个Socket对象,此时才会往下执行这句代码:new Thread(new myThread2(s)).start();
如果没有客户端连接,就一直阻塞,直到有新的连接
那么这样的效果就是,只有当有客户端连接的时候才开启一个线程,,那么这样就不会死循环了,并且达到有多少个客户端连接进来就开启多少个线程
程序改为:
try
16. {
17. ServerSocket ss = new ServerSocket(10030);
19. System.out.println("shhit");
20. while(true)
21. {
Socket s = ss.accept();
22. new Thread(new myThread2(s)).start();
23. }
24. }
作者:
一碗小米周
时间:
2013-12-5 13:02
Jim-剣◆﹏ 发表于 2013-12-5 11:02
哈哈,一看你的问题描述就知道怎么回事,肯定是写了多线程,我曾经遇到过这个问题,小研究了下
你的问题出 ...
原来是这样啊。谢谢大神。。。:lol
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2