使用Socket模拟简单的C/S通信,客户端之间数据传输采用对象流

直接看代码,

服务器端:

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

}


问题产生在,当客户端不断的读取从服务器端广播来的数据的时候,第一次读取正常,但是到第二次读取的时候就会报错,错误截图:

使用Socket模拟简单的C/S通信,客户端之间数据传输采用对象流_第1张图片

错误代码:

while ( (message = (Message)ois.readObject()) != null ) {


你可能感兴趣的:(socket)