网络编程知识
BS:Browser/Server 浏览器/服务器模式
CS: Client/Server(客户机/服务器)结构。
区别:
-
开发维护成本 cs开发维护成本高于bs。因为采用cs结构时,对于不同的客户端要开发不同的程序,而且软件安装调试和升级都需要在所有客户机上进行。 bs只需要将服务器上的软件版本升级,然后从新登录就可以了。
-
客户端负载 cs客户端负载大。cs客户端不仅负责和用户的交互,收集用户信息,而且还需要通过网络向服务器发出请求。 bs把事务处理逻辑部分交给了服务器,客户端只是负责显示。
-
安全性 cs安全性高。cs适用于专人使用的系统,可以通过严格的管理派发软件。 bs使用人数多,不固定,安全性低。
-
作用范围 Client/Server是建立在局域网的基础上的。Browser/Server是建立在广域网的基础上的。
三次握手
第一次握手:Client将SYN置1,随机产生一个初始序列号seq发送给Server,进入SYN_SENT状态; 第二次握手:Server收到Client的SYN=1之后,知道客户端请求建立连接,将自己的SYN置1,ACK置1,产生一个acknowledge number=sequence number+1,并随机产生一个自己的初始序列号,发送给客户端;进入SYN_RCVD状态; 第三次握手:客户端检查acknowledge number是否为序列号+1,ACK是否为1,检查正确之后将自己的ACK置为1,产生一个acknowledge number=服务器发的序列号+1,发送给服务器;进入ESTABLISHED状态;服务器检查ACK为1和acknowledge number为序列号+1之后,也进入ESTABLISHED状态;完成三次握手,连接建立。
四次挥手
第一次挥手:Client将FIN置为1,发送一个序列号seq给Server;进入FIN_WAIT_1状态; 第二次挥手:Server收到FIN之后,发送一个ACK=1,acknowledge number=收到的序列号+1;进入CLOSE_WAIT状态。此时客户端已经没有要发送的数据了,但仍可以接受服务器发来的数据。 第三次挥手:Server将FIN置1,发送一个序列号给Client;进入LAST_ACK状态; 第四次挥手:Client收到服务器的FIN后,进入TIME_WAIT状态;接着将ACK置1,发送一个acknowledge number=序列号+1给服务器;服务器收到后,确认acknowledge number后,变为CLOSED状态,不再向客户端发送数据。客户端等待2*MSL(报文段最长寿命)时间后,也进入CLOSED状态。完成四次挥手。
详细参考:视频讲解
网络分层图:
Socket:网络之间的通信
ServerSocket:服务器 Socket:客户端
accept:监听接收请求,创建连接
getHostAddress():返回文本显示IP地址
getHostName():获取IP地址的主机名
代码实例:
//User类 public class User implements Serializable { private String name; private String password; 有参、无参、get、set。。。。 } //提取出来的LoginThread public class LoginThread extends Thread{ Socket sk = null; public LoginThread(Socket sk) { this.sk = sk; } public void run(){ try { //通过输入流获取请求(返序列化) InputStream is = sk.getInputStream(); ObjectInputStream ois = null; ois = new ObjectInputStream(is); User user = (User)ois.readObject(); System.out.println("客户端说:"+user.getName()+"-"+user.getPassword()); //获取客户端IP InetAddress id = sk.getInetAddress(); String ip = id.getHostAddress(); System.out.println("用户Ip为:"+ip); //用输入流给与响应 OutputStream os = sk.getOutputStream(); String si = "登录成功!"; os.write(si.getBytes()); os.close(); ois.close(); is.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } //服务器 LoginServer public class LoginServer { public static void main(String[] args) { try { //创建Socket对象 ServerSocket ss = new ServerSocket(1314); //通过accpet方法来监听服务,创建连接 while (true){ Socket sk = ss.accept(); LoginThread lt = new LoginThread(sk); lt.start(); } } catch (IOException e) { e.printStackTrace(); } } //输出 客户端说:admin-1234 Ip为127.0.0.1 客户端说:zhangsan-1234 Ip为127.0.0.1 //客户端 public class LoginClent { public static void main(String[] args) { try { //创建客户端Socket对象 Socket sk = new Socket("localhost",1314); //创建输出流对象 OutputStream os = sk.getOutputStream(); //通过对象发送信息给服务端 ObjectOutputStream oos = new ObjectOutputStream(os); User user = new User("admin", "1234"); oos.writeObject(user); //关闭之前的输出流 sk.shutdownOutput();//半关闭状态 //通过输入流接收响应 InputStream is = sk.getInputStream(); BufferedReader bf = new BufferedReader(new InputStreamReader(is, "utf-8")); String str; while ((str = bf.readLine())!=null){ System.out.println("服务器响应说:"+str); } bf.close(); is.close(); oos.close(); os.close(); sk.close(); } catch (IOException e) { e.printStackTrace(); } } //输出 服务器响应说:登录成功!
未完待续。。
个人笔记--也摘抄了来自个网站的资源和自己总结
感谢默默的陪伴