通信学习----循序渐进
1.通信循序渐进过程①.能够收发字节的服务器端
package Serverv1;import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Server { private InputStream in; private OutputStream ou; /** * 创建服务器 * * @param port * :端口号 */ public void setupServer(int port) { try { // 创建服务器套接字 ServerSocket ss = new ServerSocket(port); while (true) { // 等待客户端的链接 Socket sc = ss.accept(); System.out.println("一个客户端接入"); //得到输入输出流对象 in=sc.getInputStream(); ou=sc.getOutputStream(); String s="欢迎那个谁!"; this.sendMsg(s); int t; //遇到回车结束读取 while((t=in.read())!=13){ System.out.println(t); } //关闭客户端的链接 sc.close(); } } catch (Exception ef) { ef.printStackTrace(); } } //发送信息的私有方法 private void sendMsg(String msg)throws Exception{ ou.write(msg.getBytes()); ou.flush(); } //程序入口 public static void main(String args[]) { Server s=new Server(); s.setupServer(12345); } }
代码分析:
1.由于程序中sc=ss.accept();//该处阻塞,所以即使是使用while(true){...}这等让人心惊胆战的语句也不用担心,但是要尽量把条件设置为一个变量如:boolean b=true; while(b){....}
2.private void sendMsg()方法:在该方法中的代码常常会被复用,所以在该类中直接定义一个私有方法无疑会是程序变得简化,但是还必须注意的一点是,private 关键字,像这种方法就是只在该类的内部使用,它本身是为简化该类内部的一些核心的方法而设计,而不希望在外部类中调用,所以使用pirvate 不就体现了面向对象的封装特性。
缺陷分析:
》》当telnet客户端断开后,在服务器端会陷入死循环,不停的输出-1(可添加一个判断然后结束死循环)
》》客户端发送过来的任何信息都将被解析为一个byte型的数字,然后输出,而不能还原成客户端本来信息的面目
》》不能同时让多个客户端连接进来
页:
[1]