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型的数字,然后输出,而不能还原成客户端本来信息的面目
》》不能同时让多个客户端连接进来