A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 梁小波 于 2012-6-14 08:19 编辑

今天做了一个程序主要作用是:在线的编译器;(十分简单的那种)
步骤:在服务端,接受客户端的一个序列化好的javaobj文件里面是一个类有两个成员1.java文件的名字;2.java文件的内容;
         接受后,调用函数,进行编译,产生。class文件;然后传回客户端;
但由于没有经验把tcp的两个流放在了一个类中;即(仅仅说明意思,简化了代码)
class sever
{
init()
{
s.getOutputStream();
...
s.getInputStream();
...
}
}
结果发现io阻塞了;
一般这类问题怎么解决?我的意思是在不重构代码,分两个线程;
就在一个线程中。怎么解决的?最好的话有一个demo;
欢迎大家讨论一下。

3 个回复

倒序浏览
我也做了一个用tcp发送文本的,你可以借鉴一下
我的思路是:
客户端:
1、建立一个客户端Socket,传入相应的端口。
2、定义4个缓冲区,一个是接受从键盘输入的数据,一个是读取服务器端反会来的数据,一个是将客户端的数据发给服务端,
一个是用来读取文本数据的。
3、判断键盘输的字符是不是等于“end”,是就结束程序
4、关闭资源
服务器:
1、建立一个客户端ServerSocket,并监听客户端的端口。
2、定义2个缓冲区:一个是接收客户端的数据,一个是用来想客户端返回数据
3、关闭资源.



/**
* @param args
* @throws IOException
* @throws
*/
public static void main(String[] args) throws IOException {
Socket so = new Socket("169.254.101.68",8080);
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(so.getOutputStream()));
BufferedReader bufin = new BufferedReader(new InputStreamReader(so.getInputStream()));

String lin = null;
while((lin = buf.readLine())!=null){
if("end".equals(lin)){
break;
}
File f = new File(lin);
if(f.exists()){
BufferedReader bufs = new BufferedReader(new FileReader(f));
String l = null;
while((l = bufs.readLine())!=null){
bufw.write(l);
bufw.newLine();
bufw.flush();
String str = bufin.readLine();
System.out.println(str);
}
}else{
bufw.write(lin);
bufw.newLine();
bufw.flush();
String str = bufin.readLine();
System.out.println(str);
}
}
buf.close();
so.close();
}
/**
* 服务端
* @author zcq
*
*/
public class Servers{
public static void main(String args[]) throws IOException{
ServerSocket server = new ServerSocket(8080);
Socket s =server.accept();//接受数据
BufferedReader buf = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter buffw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+".......连接成功!");
String lin =null;
while((lin=buf.readLine())!=null){
buffw.write(lin.toString());
buffw.newLine();
buffw.flush();
}
s.close();
server.close();
}
}

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为流的read,write方法都是阻塞式的,当你客户端这边调用了socket的read流,那么服务端就必须先用write流发送信息出去,如果服务端没有发送信息,也采用了read流,那么就会两边同时都在等待读取信息,这样就双阻塞,程序就运行不下去了,你可以看看你的程序是不是在某个时候两边都在read或者两边都在write!

点评

good!  发表于 2012-6-14 08:12

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 新手奖励~~

查看全部评分

回复 使用道具 举报
总结一下吧:在tcp传输中;两端会建立两个通道:即io流的通道!那么你可以再这两个通道中传输数据!
但在结构上必须是不阻塞的,意思就是服务端读了之后必须先关闭读取,才可向客户端写东西!
其中最重要 的是shutdownInput和ShutdownOutput;
再每次接受完或写入玩。都必须用上面的函数打断当前的阻塞流!才可以进行下一步的写入或接受数据!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马