小小宅的网络编程进阶NO.2简单的serve_client

发布时间:2026/7/26 6:08:42

小小宅的网络编程进阶NO.2简单的serve_client 俺的网络编程NO.2相对于NO.1就是更可扩展了逻辑上更合理了上一个还是只是能跑通就行不会太考虑如果有好几个客户端怎么办怎么能好几个客户端都同时上线。为了后面的好扩展肯定不能把代码都写在一个main函数里面应该要分函数来写。最后就是这次这个用到了多线程这个是俺第一次接触到多线程编程多线程在里面的逻辑原理和运用目前都不是很熟悉但也是勉强用上了。下面我来说说写这次这个server_client遇到的问题和总结出来的邪修小经验。1.框架怎么搭因为一开始只是听了一遍宇哥怎么实现的这个功能所以一开始怎么下手也不清楚也有可能是我太久没有写过代码了后面是一点一点看回放才逐渐清晰起来了。首先把那些初始化收发信息的方法写好然后写一个main主函数按照先初始化一个客户端或者服务端然后在进行多线程编程来进行实现收发信息的功能也可以在方法内写入那个线程操作现在我写的是一个总线程里面写多个嵌套的线程监听连接是一个线程然后收发一个线程收发里面是并列多线程分配给每一个连接成功的客户端一个线程。publicstaticvoidmain(String[]args){ServerservernewServer();server.init();ArrayListSocketsocketsnewArrayList();/** * 线程1持续监听新连接每来一个客户端就为它开一个专属读取线程 */newThread(()-{while(true){System.out.println(1-server-等待连接...);Socketsserver.Listen();System.out.println(2-server-连接成功: s.getInetAddress());sockets.add(s);System.out.println(3-server-当前连接数: sockets.size());// 为每个客户端启动独立的读取转发线程newThread(()-server.handleClient(s,sockets)).start();}}).start();}2.byte数组的使用宇哥在讲的过程中用到了byte字节数组一开始我不清楚这个和String在这里面的应用有啥区别也只是到了读写的时候用上去。后面去了解了一下。byte是存储的原始二进制的数据在socket的网络数据传输中只能传二进制的原始数据知己而传string 数据是不行的。特点byte用的空间很小。可以承载所有的数据类型的底层二进制一切的计算机数据 任何计算机数据都可以通过编码转成byte类型来传输和操作。堵塞方法了解到一个很关键的概念就是堵塞方法有的方法是堵塞方法有的代码逻辑写的是堵塞的二有些场景是不应该有这个堵塞的这个时候就应该去用别的方法解决他目前这次我用到的就是用多线程或者多开循环让不应该循环的功能或者属性类型分割开来实现互不干扰。像这里的给每个客户端都开单开一个线程就是最好的例子如果让所有客户端都在一个线程接收消息那么肯定需要用到循环而这样就要保证所有客户端必须按照循环的顺序完成相关接收才能一起都执行了会造成3发消息了但1没有发就会导致3发不出去给等12发完才能发出去造成了堵塞。4.那些send,recevie方法的参数传啥一开始在着手写的时候无从下手一个是对整体的框架不清晰还有一个就是这些方法的参数不知道传啥也就导致这些方法不知道怎么写。对于网络编程这些方法参数首先要传的是目标socket的输入或者输出流看是要传哪个流就要看是要给他发信息还是接受他的信息那么就是传自己的输入流如果是发送就传目标socket的输出流。publicvoidhandleClient(Socketself,ArrayListSocketsockets){try{InputStreaminself.getInputStream();while(true){System.out.println(self.getInetAddress() - 等待消息...);Stringmsgreceive(in,self);if(msgnull)break;System.out.println(收到 [self.getInetAddress()] : msg);for(intj0;jsockets.size();j){Sockettargetsockets.get(j);try{OutputStreamostarget.getOutputStream();send(msg,os);}catch(IOExceptione){System.out.println(转发给 target.getInetAddress() 失败);}}}}catch(IOExceptione){System.out.println(self.getInetAddress() 连接异常);}finally{sockets.remove(self);System.out.println(移除 self.getInetAddress()当前连接数: sockets.size());}}publicvoidsend(Stringmsg,OutputStreamos)throwsIOException{byte[]datamsg.getBytes(UTF-8);intlendata.length;os.write((len8)0xFF);// 高字节os.write(len0xFF);// 低字节os.write(data);os.flush();System.out.println(发送成功: msg);}publicStringreceive(InputStreamin,Sockets)throwsIOException{inthiin.read();if(hi-1)returnnull;intloin.read();if(lo-1)returnnull;intlen(hi8)|lo;byte[]bufnewbyte[len];for(inti0;ilen;i){intbin.read();if(b-1)returnnull;buf[i](byte)b;}StringmsgnewString(buf,UTF-8);System.out.println(从 s.getInetAddress() 收到: msg);returnmsg;}

相关新闻