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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾正西 注册黑马   /  2012-9-2 11:01  /  2515 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

各位大神,请教一个问题:我用对象流向socket的流中写实现了序列化的对象,但为什么不能通信呢,调试的时候显示在定义对象流的时候,就阻塞在这儿了,我在对象流的构造方法里写的就是socket中的getInputSream()方法,但是为什么就一直阻塞在这儿了呢,困惑求解

7 个回复

倒序浏览
楼主应该把代码贴上来看看

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
  // 创建客户端Socket, 指定服务端地址和端口, 连接服务器. 本地地址和端口自动绑定.
  Socket socket = new Socket("192.168.1.254", 9999);
  
  // 获取客户端输入流, 可以读取服务端写出的数据
  InputStream in = socket.getInputStream();
  
  // 获取客户端输出流, 可以写出数据到服务端
  OutputStream out = socket.getOutputStream();
  
  // 客户端读取服务端写出的数据. 如果服务端还未写出, 阻塞等待.
  byte[] buffer = new byte[1024];
  int len = in.read(buffer);
  String msg = new String(buffer, 0, len);
  System.out.println(msg);
  
  Thread.sleep(3000);
  
  // 客户端写出数据到服务端
  out.write("我要报名JavaEE就业班!".getBytes());
  
  // 释放资源
  socket.close();
}



import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
  // 创建服务端ServerSocket, 绑定指定端口号
  ServerSocket serverSocket = new ServerSocket(9999);
  
  // 阻塞, 等待服务端接收客户端请求
  Socket socket = serverSocket.accept();
  
  // 获取服务端输入流, 可以读取客户端写出的数据
  InputStream in = socket.getInputStream();
  
  // 获取服务端输出流, 可以写出数据到客户端
  OutputStream out = socket.getOutputStream();
  
  Thread.sleep(3000);
  
  // 服务端写出数据到客户端
  out.write("欢迎拨打传智播客报名热线, 请问需要什么帮助?".getBytes());
  
  // 服务端读取客户端写出的数据. 如果客户端还未写出, 阻塞等待.
  byte[] buffer = new byte[1024];
  int len = in.read(buffer);
  String msg = new String(buffer, 0, len);
  System.out.println(msg);
  
  // 释放资源
  socket.close();
  serverSocket.close();
}
}

回复 使用道具 举报
我用的是对象流,ObjectInputStream/ObjectOutputStream,写的是对象,其他跟你这代码差不多
回复 使用道具 举报
曾正西 发表于 2012-9-2 12:26
我用的是对象流,ObjectInputStream/ObjectOutputStream,写的是对象,其他跟你这代码差不多 ...

您没贴出代码,我觉得您客户端用的是ObjectOuputStream将对象写入到Socket流中,那么服务端必须还的用ObjectInputStream流才能读取对象,例如:
Client:
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
oos.writeObject(file);//客户端发送一个文件对象

Server: //服务端接收并读取文件对象
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
File file = (File) ois.readObject();
回复 使用道具 举报
嗯,是的,两边都是对象流,不过现在已经解决问题了,还是谢谢你的回答
回复 使用道具 举报
没有代码,无法解决您的问题.
回复 使用道具 举报
梁俊 黑马帝 2013-1-22 00:12:58
7#
是不是你客户端,
while ((line = br.readLine()) != null) {
                        pw.println(line);
                }
之后
应该写这么一段代码

                //通过服务器,你别等了,我已经写完了
                s.shutdownOutput();
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马