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 }
六、总结