您的位置:首页 > 其它

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

2014-07-16 15:03 921 查看
摘要: 由于多客户端之间通信,可能要发送的数据信息很多,包含基本的发送人,发送内容,发送时间,更复杂的包括接收人,消息类型等等这些,所以客户端之间的数据传输的时候使用对象进行传输将会很方便。。。。但是问题也不少。。。

直接看代码,

服务器端:

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
相关文章推荐