使用Socket模拟简单的C/S通信,客户端之间数据传输采用对象流
2014-07-16 15:03
921 查看
摘要: 由于多客户端之间通信,可能要发送的数据信息很多,包含基本的发送人,发送内容,发送时间,更复杂的包括接收人,消息类型等等这些,所以客户端之间的数据传输的时候使用对象进行传输将会很方便。。。。但是问题也不少。。。
直接看代码,
服务器端:
ChartServer类:
ServerThread类:
客户端:
ChartClient类:
ClientThread类: 产生问题的类,请看run方法中的第一段注释
问题产生在,当客户端不断的读取从服务器端广播来的数据的时候,第一次读取正常,但是到第二次读取的时候就会报错,错误截图:
错误代码:
直接看代码,
服务器端:
ChartServer类:
package com.koma.chartdemo; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.LinkedList; import java.util.List; public class ChartServer { public static List<Socket> clients = new LinkedList<Socket>(); /** * @param args */ public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(8888); while ( true ) { Socket s = ss.accept(); clients.add(s); new Thread(new ServerThread(s)).start(); } } catch (IOException e) { e.printStackTrace(); } } }
ServerThread类:
package com.koma.chartdemo; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; public class ServerThread implements Runnable { private Socket cs; private ObjectInputStream ois = null; public ServerThread(Socket s){ this.cs = s; } @Override public void run() { try { ois = new ObjectInputStream(cs.getInputStream()); Message msg = null; while ( (msg = readFromClient()) != null ) { //进行广播 for ( Socket s : ChartServer.clients ) { ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); oos.writeObject(msg); } } } catch (Exception e) { e.printStackTrace(); } } private Message readFromClient() { try { Message message = (Message)ois.readObject(); return message; } catch (Exception e) { e.printStackTrace(); //产生异常时将当前客户端删除 ChartServer.clients.remove(cs); } return null; } }
客户端:
ChartClient类:
package com.koma.chartdemo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectOutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Random; public class ChartClient { /** * @param args */ public static void main(String[] args) { try { Socket s = new Socket("127.0.0.1", 8888); //开启单独的线程接收来自服务器的数据 new Thread(new ClientThread(s)).start(); ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); //不断的轮询键盘,来获取用户的输入 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String content = null; while ( (content = br.readLine()) != null ) { Message msg = new Message(); msg.setUsername("Koma"+new Random().nextInt(100)); msg.setMsgtype(MessageType.TEXT_MSG); msg.setMsgcontent(content); oos.writeObject(msg); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
ClientThread类: 产生问题的类,请看run方法中的第一段注释
package com.koma.chartdemo; import java.io.ObjectInputStream; import java.net.Socket; public class ClientThread implements Runnable { private Socket s; private ObjectInputStream ois = null; public ClientThread(Socket s){ this.s = s; } @Override public void run() { try { //问题:使用这种方式不断读取来自服务器端的数据的时候会报错 //错误内容:java.io.StreamCorruptedException: invalid type code: AC //错误行数:22行 // ois = new ObjectInputStream(this.s.getInputStream()); // Message message = null; // while ( (message = (Message)ois.readObject()) != null ) { // System.out.println( "===>"+message.getUsername()+" Say:"+message.getMsgcontent() ); // } //使用这种方式不会报错 while ( true ) { ois = new ObjectInputStream(this.s.getInputStream()); Message message = (Message) ois.readObject(); System.out.println( "===>"+message.getUsername()+" Say:"+message.getMsgcontent() ); } } catch (Exception e) { e.printStackTrace(); } } }
问题产生在,当客户端不断的读取从服务器端广播来的数据的时候,第一次读取正常,但是到第二次读取的时候就会报错,错误截图:
错误代码:
while ( (message = (Message)ois.readObject()) != null ) {
相关文章推荐
- 使用Socket模拟简单的C/S通信,客户端之间如何互发文件
- 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)
- 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)
- 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)
- 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)
- 【网络通信】服务器端Socket监听80端口,建立连接传输数据时也是使用的80端口么?
- android端和pc端使用usb进行socket通信,其中android是服务器端,pc是客户端。如何实现安卓端输入的数据通过按钮发送到pc端?
- 在Android系统使用socket在Java层和native之间数据通信
- 使用socket实现简单数据文件传输
- Android中使用Socket来实现服务器端和客户端,进行数据通信(使用原生Socket)
- 使用socketserver模块和socket模块模拟客户端和服务器端通信
- Android 2.0上使用蓝牙通信代码片断(服务端、客户端、数据传输)
- 在Android系统使用socket在Java层和native之间数据通信
- 使用Scala模拟简单的RPC通信,Socket编程
- Socket通信:简单传输到增加多线程进行多数据传输
- 简单通过java的socket&serversocket以及多线程技术实现多客户端的数据的传输,并将数据写入hbase中
- Java Socket服务器端和客户端之间传输对象
- Android系统使用socket在Java层和native之间数据通信
- android 客户端与服务器端之间采用JSON进行数据通信之一
- 安卓使用socket建立通信客户端不显示数据