java socket 多线程



一、 传输对像(服务器端和客户端对像一定要相同,并在包名一样,否则出错)
 
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,每一个客户端连接上来,服务器会创建一个新的线程来处理。当连接的客户端多,服务器会创建大量的线程(一个连接对应一个线程)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值