| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 508 人关注过本帖
标题:java新手提问:关于多线程和网络
只看楼主 加入收藏
halfsoul
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-2-22
收藏
 问题点数:0 回复次数:2 
java新手提问:关于多线程和网络

最近刚学到网络,有些原理想问问,这是我写的一个程序
服务端:

package net.con2;
import java.io.*;
import java.net.*;
import java.util.*;

public class net2{
public static void main(String[] args) throws IOException{
System.out.println("server starting....");
ServerSocket server =new ServerSocket(8000);//创建一个服务端的监听
while(true){
Socket sk=server.accept(); //创建接收,当client发送时,不为null,否则为null
System.out.println("accepting connect ....");
new ServerThread(sk).start();
}
}
}

class ServerThread extends Thread{
private Socket sk;
ServerThread(Socket sk){this.sk=sk;}
public void run(){
BufferedReader in=null;
PrintWriter out =null;
try{
InputStreamReader isr=new InputStreamReader(sk.getInputStream());
in=new BufferedReader(isr); //创建输入
out =new PrintWriter(new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())),true);
//创建输出
while(true){
String cmd =in.readLine(); // 接受客户端的请求
System.out.println(cmd);
if(cmd==null) break;
cmd=cmd.toUpperCase();
if(cmd.startsWith("BYE")){
out.println("Bye"); //如果客户端的请求是BYE,则跳出while
break;
}else{
//否则...
out.println("你好,我是服务器");
}
}
}catch(IOException e){
System.out.println(e);
}finally{
System.out.println("closing connection....");
try{
if(in!=null) in.close();
if(out!=null) out.close();
if(sk!=null) sk.close();
}catch(IOException e){
System.out.println("close err "+e);
}
}
}
}

客户端:
package net.con2;
import java.io.*;
import java.net.*;
class client extends Thread{
public static int count =0;
public client(InetAddress addr){
count++;
BufferedReader in =null;
Socket sk=null;
PrintWriter out1=null ;
try{
sk= new Socket(addr,8000);//创建连接
in=new BufferedReader (new InputStreamReader(sk.getInputStream()));
//输入缓存
out1=new PrintWriter(new BufferedWriter (new OutputStreamWriter(sk.getOutputStream())),true);
//输出缓存
System.out.println("count: "+count);
out1.println("hello:"); //向服务端发送
System.out.println(in.readLine()); //由服务端接收
out1.println("BYE");
System.out.println(in.readLine());
}catch(IOException e){
System.out.println(e);
}finally{
out1.println("end");
try{
if(in!=null) in.close();
if(out1!=null) out1.close();
if(sk!=null) sk.close();
}catch(IOException e){
System.out.println(e);
}
}
}
}

public class send{
public static void main(String[] args) throws IOException,InterruptedException {
InetAddress addr =InetAddress.getLocalHost();
for(int i=0;i<10;i++){
new client(addr); //用for循环创建10个client
Thread.currentThread().sleep(1000);//休眠一秒
}
}
}


我想问的是为甚么服务端的红色部分写成这样下面两种时,是多线程客户端发送数剧,服务端只出现一次accepting connect ....,然后客户端和服务端都没反应。

while(true){
Socket sk=server.accept(); //创建接收,当client发送时,不为null,否则为null
System.out.println("accepting connect ....");
//new ServerThread(sk).start();


Socket sk=server.accept(); //创建接收,当client发送时,不为null,否则为null
while(true){
System.out.println("accepting connect ....");
new ServerThread(sk).start();

还有,在正常的写法中:
public class net2{
public static void main(String[] args) throws IOException{
System.out.println("server starting....");
ServerSocket server =new ServerSocket(8000);//创建一个服务端的监听
while(true){
Socket sk=server.accept(); //创建接收,当client发送时,不为null,否则为null
System.out.println("accepting connect ....");
new ServerThread(sk).start();
}
}
}

客户端即使甚么也不干,难道服务端不会执行到while循环而死循环吗?

[此贴子已经被作者于2007-2-22 18:30:37编辑过]

搜索更多相关主题的帖子: 网络 java 线程 提问 
2007-02-22 18:29
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
加一个flush()方法

可惜不是你,陪我到最后
2007-02-22 21:00
黄袖标
Rank: 4
等 级:贵宾
威 望:13
帖 子:676
专家分:0
注 册:2007-3-22
收藏
得分:0 
其实server每次接到一个client就会起一个线程为这个client服务。然后他还干自己的事,就是继续兼听了。。。

我胡汉三又回来啦!物是人非啊,只有静夜思大大还在。
2007-03-22 13:40
快速回复:java新手提问:关于多线程和网络
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028949 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved