欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Socket编程

程序员文章站 2023-01-12 23:13:55
一、前提 多台客户端 / 服务器 之间传递实体类的序列化对象 需要实现四个类,即服务器类,线程类,客户端类及实体类 注:实体类需实现接口:implements Serializable 二、服务器类 服务器类,需要实现两个类:ServerSocket 和 Socket 。且 ServerSocket ......

一、前提

多台客户端 / 服务器 之间传递实体类的序列化对象

需要实现四个类,即服务器类,线程类,客户端类及实体类

注:实体类需实现接口:implements serializable

二、服务器类

服务器类,需要实现两个类:serversocket 和 socket 。且 serversocket 初始化需要给个参数(端口号)

.accept() 方法是阻塞当前 socket 对象(socket 在最后是需要关闭的)。处于等待状态,直到客户端发过来信息唤醒它

 1 public class servlet {
 2 
 3     public static void main(string[] args) {
 4         // 服务器
 5         try {
 6             
 7             serversocket serversocket = new serversocket(5000);
 8             socket socket = new socket();
 9 
10             // 无限循环,服务器保持开启状态
11             while(true){
12                 socket = serversocket.accept();    
13                 scoktthread st = new scoktthread(socket);
14                 st.start();
15             }
16         } catch (ioexception e) {
17             e.printstacktrace();
18         }
19     }
20 }

三、线程类

在有参构造方法中初始化 socket 对象。此线程类根据启动该线程对象来对该对象进行一系列操作。

 1 public class scoktthread extends thread{
 2 
 3     private socket socket;
 4     
 5     public scoktthread(socket socket) {
 6         super();
 7         this.socket = socket;
 8     }
 9 
10     @override
11     public void run() {
12         // todo auto-generated method stub
13         super.run();
14         inputstream is = null;
15         objectinputstream ois =null;
16         outputstream os =null;
17         
18         try {
19             // 获取客户端发来的信息
20             is = socket.getinputstream();
21             ois = new objectinputstream(is);
22             user user = (user) ois.readobject();
23             system.out.println("成功接收到客户端信息:"+user.getusername()+"-"+user.getpwd());
24             
25             // 获取客户端信息
26             inetaddress id = socket.getinetaddress();
27             string ip = id.gethostaddress();
28             system.out.println("客户 ip 地址:"+ip);
29             
30             // 反馈信息
31             string restr = "我是服务器,欢迎你加入";
32             os = socket.getoutputstream();
33             os.write(restr.getbytes());
34             
35         } catch (ioexception e) {
36             e.printstacktrace();
37         } catch (classnotfoundexception e) {
38             e.printstacktrace();
39         } finally {
40             try {
41                 ois.close();
42                 is.close();
43                 socket.close();
44             } catch (ioexception e) {
45                 e.printstacktrace();
46             }
47         }
48     }
49 }

四、客户端类

客户端类,需要实现 socket 类。初始化时需要两个参数:要连接服务器的 ip 地址(localhost,即127.0.0.1 是本地地址)+对应的端口号

 1     public static void main(string[] args) {
 2         // 客户端
 3         socket socket;
 4         try {
 5             socket = new socket("localhost",5000);
 6     
 7             outputstream os = socket.getoutputstream();
 8             objectoutputstream oos = new objectoutputstream(os);
 9             user user = new user("小居","居先生");
10             oos.writeobject(user);
11             
12             // 成功发送后需要暂时关闭输出流
13             socket.shutdownoutput();
14             
15             inputstream in = socket.getinputstream();
16             bufferedreader br = new bufferedreader(new inputstreamreader(in));
17             string str = null;
18             while((str = br.readline())!=null){
19                 system.out.println(str);
20             }
21             
22             br.close();
23             in.close();
24             oos.close();
25             os.close();
26             socket.close();
27             
28         
29         } catch (unknownhostexception e1) {
30             e1.printstacktrace();
31         } catch (ioexception e1) {
32             e1.printstacktrace();
33         }
34     }

五、实体类(不重要)

实体类仅需注意,要实现 serializable 接口。

 1 /**
 2  * 用户类
 3  * @author ice_debj
 4  *
 5  */
 6 public class user implements serializable{
 7 
 8     /**
 9      * 
10      */
11     private static final long serialversionuid = 3144628657162072787l;
12     private string username;
13     private string pwd;
14     
15     public user() {
16         super();
17     }
18     public user(string username, string pwd) {
19         super();
20         this.username = username;
21         this.pwd = pwd;
22     }
23     
24     public string getusername() {
25         return username;
26     }
27     public void setusername(string username) {
28         this.username = username;
29     }
30     public string getpwd() {
31         return pwd;
32     }
33     public void setpwd(string pwd) {
34         this.pwd = pwd;
35     }    
36 }

六、总结

Socket编程