黑马程序员技术交流社区

标题: socket中对象流的传输困惑 [打印本页]

作者: 曾正西    时间: 2012-9-2 11:01
标题: socket中对象流的传输困惑
各位大神,请教一个问题:我用对象流向socket的流中写实现了序列化的对象,但为什么不能通信呢,调试的时候显示在定义对象流的时候,就阻塞在这儿了,我在对象流的构造方法里写的就是socket中的getInputSream()方法,但是为什么就一直阻塞在这儿了呢,困惑求解
作者: 杨锦    时间: 2012-9-2 11:42
楼主应该把代码贴上来看看

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();
}
}


作者: 曾正西    时间: 2012-9-2 12:26
我用的是对象流,ObjectInputStream/ObjectOutputStream,写的是对象,其他跟你这代码差不多
作者: 庄星睿    时间: 2012-9-2 12:52
曾正西 发表于 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();
作者: 曾正西    时间: 2012-9-2 13:03
嗯,是的,两边都是对象流,不过现在已经解决问题了,还是谢谢你的回答
作者: AngieFans85    时间: 2012-9-3 08:29
没有代码,无法解决您的问题.
作者: 梁俊    时间: 2013-1-22 00:12
是不是你客户端,
while ((line = br.readLine()) != null) {
                        pw.println(line);
                }
之后
应该写这么一段代码

                //通过服务器,你别等了,我已经写完了
                s.shutdownOutput();





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2