求高手点拨一个“输出与预期不符”的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端修改成了:
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!! --------------------编程问答--------------------
你要先想清楚你看不到结果的原因,你不想原因就动手去改代码,看不到预期不是很正常?
我说了,不打印的原因是你的主线程退出了,你能解释一下你改动的代码是什么意思么? --------------------编程问答--------------------
须等待哥,弟我的主线程,原先的代码里,是进行了:
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