当前位置:编程学习 > JAVA >>

求高手点拨一个“输出与预期不符”的Java开发代码问题..

高手,您好:
    我在做一个通信程序,现在我利用“字节流”写出了一个“防止EOFException异常”的Lib类.
    并且,我进行了测试,源代码如下:
    (S端源代码..)
    
package s;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class S_port {
String str = "";
ServerSocket s =null;
Socket so = null;
S_port(){
try {
s = new ServerSocket(60000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(true){
try {
so = s.accept();
break;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
SystemThread m1 = new SystemThread(so);
m1.start();
try {
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static void main(String[] args){
new S_port();
}
}

    (S端的子线程:SystemThread类..)
    
package s;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class SystemThread extends Thread{
Socket so = null;
DataInputStream dips = null;
InputStream inputstream = null;
String str = null;

public SystemThread(Socket s){
so = s;
}

public void run(){
String str0 = Lib.readsocketUTF(so);
        System.out.println(str0);
}
}

    (我写的Lib类..)
    
package c_port_packageBJDoctor;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class Lib {
static InputStream inputstream = null;
static String readsocketUTF(Socket s){
byte[]   buf   =   new   byte[2048*2];   
        int num = 0;
        try {
inputstream = s.getInputStream();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
        
        while   (num   !=   (-1))   {//是否读完所有数据   
                try {
num   =   inputstream.read(buf);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//继续从网络中读取文件   
        }   
        String str0 = new String(buf);
        String msg = str0.trim(); 
        return msg;
    }
}

    (我的C端源代码..)
    
package s;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class C_port {
Socket s = null;
OutputStream outputstream = null;
public C_port(){
try {
s = new Socket("127.0.0.1",60000);
outputstream = new DataOutputStream(s.getOutputStream());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String str = "CJ必胜!!CJCO!!CJHMF,这个问题解决了,我高兴了,现在我们的群里,加入了143个人\r\n我们群里的人,都决心互相学习,增长本领";
byte[] b = str.getBytes();
int len = b.length;
try {
outputstream.write(b,0,len);
outputstream.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public static void main(String[] args){
new C_port();
}

}

    希望得到高手的点拨:
    为什么在我运行了S端和C端之后,会出现S端的console窗口,打印出下面的场景的内容....:
    
    希望得到CSDN中的高手的尽快的点拨!!
    谢谢高手!!
    谢谢CSDN!!
    一百分奉上!!
                                                            一位日日夜夜向着理想奔跑的筑梦者 
                                                            2013年11月5日下午15点7点 Java调试 Java Socket Java异常 Java排错 Java流 --------------------编程问答-------------------- 。。又是你,连格式都不变的

你的S端主线程接收完请求立马就退出了,主线程退出子线程就没了,怎么会打印结果 --------------------编程问答-------------------- 楼主这个问题我记得问了若干遍了。。
去把我发的那个例子下载下来仔细研究下:http://blog.csdn.net/withiter/article/details/7734062
搞明白了,基本上Socket通信的基本知识就掌握了 --------------------编程问答--------------------
引用
。。又是你,连格式都不变的

你的S端主线程接收完请求立马就退出了,主线程退出子线程就没了,怎么会打印结果

希望须等待哥能够点拨:
    我的S端修改成了:
    
package s;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class S_port {
String str = "";
ServerSocket s =null;
Socket so = null;
S_port(){
try {
s = new ServerSocket(60000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(true){
try {
so = s.accept();
SystemThread m1 = new SystemThread(so);
m1.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

public static void main(String[] args){
new S_port();
}
}

    这里的代码结构,为什么还不能让我的S端的窗口,打印出结果...?
    
    谢谢须等待哥!! --------------------编程问答-------------------- 希望CSDN中的诸位高手,同仁,尽快的点拨!!
    谢谢CSDN!!
    谢谢须等待哥!!
    谢谢版主withiter!! --------------------编程问答-------------------- 自顶一个!!
    Mark!! --------------------编程问答--------------------
引用 4 楼 u012609640 的回复:
希望CSDN中的诸位高手,同仁,尽快的点拨!!
    谢谢CSDN!!
    谢谢须等待哥!!
    谢谢版主withiter!!


你要先想清楚你看不到结果的原因,你不想原因就动手去改代码,看不到预期不是很正常?
我说了,不打印的原因是你的主线程退出了,你能解释一下你改动的代码是什么意思么? --------------------编程问答--------------------
引用
你要先想清楚你看不到结果的原因,你不想原因就动手去改代码,看不到预期不是很正常?
我说了,不打印的原因是你的主线程退出了,你能解释一下你改动的代码是什么意思么?


须等待哥,弟我的主线程,原先的代码里,是进行了:
    
    S_port(){
        try {
            s = new ServerSocket(60000);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        while(true){
            try {
                so = s.accept();
                break;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        SystemThread m1 = new SystemThread(so);
        m1.start();
        try {
            s.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    构造方法的书写的,在其中的第10行,第11行的“S端接业务”的代码设计的...
    在第11行,S端接收到一单业务后,将循环“break”,S端的主线程到达地17行启动子线程,然后,让子线程中的代码运行..
    按照须等待哥您的指导:
    S端的子线程刚刚启动,S端的主线程就将水管给关闭了..
    之后,子线程就由于S端的关闭,也随之关闭了...
    须等待哥,现在弟我将S端构造方法的代码修改成了:
    
	S_port(){
try {
s = new ServerSocket(60000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(true){
try {
so = s.accept();
SystemThread m1 = new SystemThread(so);
m1.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

    这个结构.
    在第10行,我的S端的主线程接收到一个Socket请求之后,在第11行创建一个子线程对象,并且在第12行将这个对象启动.
    之后,我的S端的主线程会继续执行,运行到第16行代码,循环回到第8行的while语句处,走到第10行语句,主线程阻塞等待下一位客户的业务.
    我的子线程没有修改,会执行我的原来的逻辑:“打印我的主线程中的水管中的数据”..
    须等待哥,弟我是借助循环,将弟我的程序中的“主线程首先退出”的问题解决的..
    您看,须等待哥,弟我说的对吗...? --------------------编程问答-------------------- 希望CSDN的版主,CSDN中的诸位高手,CSDN中的诸位伙伴,能够点拨!!
    谢谢CSDN!!
    谢谢须等待哥!!
    谢谢诸位伙伴!!
    自顶一个!!
    Mark!! --------------------编程问答-------------------- 求CSDN中的版主,CSDN中的诸位高手,CSDN中的诸位伙伴,能够点拨!!
    谢谢CSDN!!
    谢谢须等待哥!!
    谢谢诸位伙伴!!
    自顶一个!!
    Mark!! --------------------编程问答-------------------- 你最好重新去研究一下 socket, --------------------编程问答-------------------- 希望得到真正帮助我的朋友的点拨.
    而非楼上的这种哥们儿的回答.
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,