网络模型的基本概念
一个简单的网络模型可分为以下5层:
客户机服务器模型(client/server)
可以简单画图如下:
TCP/IP的概念
TCP/IP:Transmission Control Protocol/Internet Protocol的简写。TCP 是传输控制协议的缩写,它保 障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
TCP三次握手(Three-way handshake) :所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立连接。
-
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认; SYN:同步序列编号(Synchronize Sequence Numbers)。
-
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1), 同时自己也发送一个SYN包(seq=k),即SYN+ACK包, 此时服务器进入SYN_RECV状态;
-
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1), 此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功) 状态,完成三次握手。
-
完成三次握手,客户端与服务器开始传送数据
TCP编程
两个电脑之间的网络IO可以用上面的图表示:其中Socket是连接网卡和内存之间的桥梁。
下面我们来写一个聊天室的基本案例:
首先我们先写一个客户端和服务端的程序:
package Chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class ChatServer {
/**
* 服务器端
* @param args
*/
public static void main(String[] args) {
//在端口8888上创建服务器连接
try {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器创建成功!");
//监听等待连接,一旦连接上,就会返回一个socket,是一个阻塞
Socket socket = serverSocket.accept();
//获得远程服务端的信息(IP+端口)
System.out.println( socket.getRemoteSocketAddress()+"进入了聊天室!" );
//字节流-》字符流-》缓冲流
BufferedReader bReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println( socket.getRemoteSocketAddress()+":"+bReader.readLine() );
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package Chat;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.sound.sampled.Port;
public class ChatClinet {
/**
* 客户端
*/
public static void main(String[] args) {
//连接服务器,端口为服务器的启动端口,地址为服务器的IP地址
try {
//产生了随机的端口
Socket socket = new Socket( "127.0.0.1" ,8888);
//发送消息给服务器 输出流
//字节流转字符流
PrintWriter pWriter = new PrintWriter(socket.getOutputStream() );
pWriter.println("hello");
pWriter.flush();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出:
服务器创建成功!
/127.0.0.1:58212进入了聊天室!
/127.0.0.1:58212:hello