一、 传输对像(服务器端和客户端对像一定要相同,并在包名一样,否则出错)
package net.chatSocket.vo;
public class SocketObject implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private String name;
private Integer count;
public SocketObject() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
}
二、服务器端,有两个类
package net.chatSocket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 多线程传输对像
* @author qili
*
*/
public class MultiServer_Object {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
ServerSocket server=new ServerSocket(6666);
System.out.println(" 监听: "+server.getLocalPort());
while(true){
Socket socket=server.accept();
System.out.println("新连接: "+socket);
new Thread(new MultiServer_Object_do(socket)).start();
}
}
}
在线程执行的类:
package net.chatSocket;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import net.chatSocket.vo.SocketObject;
/**
* 多线程传输对像
* @author qili
*
*/
public class MultiServer_Object_do implements Runnable{
private Socket socket;
public MultiServer_Object_do(Socket socket){
this.socket=socket;
}
public void run() {
GZIPInputStream gzipis = null;
ObjectInputStream ois = null;
GZIPOutputStream gzipos = null;
ObjectOutputStream oos = null;
try {
gzipis = new GZIPInputStream(socket.getInputStream());
ois = new ObjectInputStream(gzipis);
gzipos = new GZIPOutputStream(socket.getOutputStream());
oos = new ObjectOutputStream(gzipos);
Object obj = ois.readObject();
SocketObject sobj = (SocketObject)obj;
System.out.println("信息: " + sobj.getName() + + sobj.getCount());
sobj.setName(sobj.getName() + "_name");
sobj.setCount(sobj.getCount());
oos.writeObject(sobj);
oos.flush();
gzipos.finish();
}catch(Exception ex){
ex.printStackTrace();
}finally {
try {
ois.close();
} catch(Exception ex) {}
try {
oos.close();
} catch(Exception ex) {}
try {
socket.close();
} catch(Exception ex) {}
}
}
}
------------------------------------------------------------------------------
三、客户端
package net.chatClient;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.logging.Logger;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import net.chatSocket.vo.SocketObject;
/**
* 使用对像来传输
* @author qili
*
*/
public class clientObject {
private final static Logger logger = Logger.getLogger(clientObject.class.getName());
/**
* @param args
* @throws IOException
* @throws ClassNotFoundException
* @throws InterruptedException
*/
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
int i=0;
while(i<=100000) {
Thread.currentThread().sleep(50);
i++;
Socket socket=null;
GZIPOutputStream gzipos=null;
ObjectOutputStream oos=null;
GZIPInputStream gzipis=null;
ObjectInputStream ois=null;
try{
socket=new Socket();
SocketAddress socketAddress=new InetSocketAddress("localhost",6666);
socket.connect(socketAddress,10*1000);
socket.setSoTimeout(2*60*1000);
gzipos=new GZIPOutputStream(socket.getOutputStream());
oos=new ObjectOutputStream(gzipos);
SocketObject sobj=new SocketObject("sobj_"+i,i);
oos.writeObject(sobj);
oos.flush();
gzipos.finish();
gzipis=new GZIPInputStream(socket.getInputStream());
ois=new ObjectInputStream(gzipis);
Object obj=ois.readObject();
if(obj!=null){
sobj=(SocketObject)obj;
System.out.println("信息: " + sobj.getName() + " " + sobj.getCount());
}
} catch(IOException ex) {
//logger.log(Level.SEVERE, null, ex);
ex.printStackTrace();
} finally {
try {
ois.close();
} catch(Exception ex) {}
try {
oos.close();
} catch(Exception ex) {}
try {
socket.close();
} catch(Exception ex) {}
}
}
}
}
这里仅是最简单的传输类,离实用还有一些距离。这里用的不是NIO,每一个客户端连接上来,服务器会创建一个新的线程来处理。当连接的客户端多,服务器会创建大量的线程(一个连接对应一个线程)。