Socket也叫套接字
Socket编程也叫套接字编程,也叫网络编程。
服务端
1.创建一个服务端socket(ServerSocket),指定监听的端口号
2.监听并接收客户端的连接。 Socket c = ss.accept();
3.读取数据。 InputStream is = c.getInputStream(); 读取数据
4.使用数据 例如:存储,打印
5.关闭socket(c)
//服务端:
public static void main(String[] args) throws Exception {
//服务端监听11111端口
ServerSocket ss = new ServerSocket(11111);
Socket s = ss.accept();
Thread t = new Thread() {
@Override
public void run() {
synchronized(this) {
try (
InputStream is= s.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
OutputStream os = s.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os)
;){
int length = 0;
byte[] b = new byte[1024];
while((length = bis.read(b)) != -1) {
bos.write(b, 0, length);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
t.start();
}
客户端
1.创建一个客户端socket(Socket),指定连接的服务器的ip地址和端口号
2.获取输出流 OutputStream os = s.getOutputStream();
3.写数据 os.write(xxx);
4.关闭socket
//客户端:
public static void main(String[] args) {
//找到文件地址,发给服务端:
getChoose11("C:\\Users\\Desktop\\Java异常处理.txt");
}
public static void getChoose11(String s) {
try (
FileInputStream fis = new FileInputStream(s);
BufferedInputStream bis = new BufferedInputStream(fis);
//连接服务端电脑:
Socket s1 = new Socket("10.10.12.92", 8088);
OutputStream os = s1.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(os);
){
byte[] b = new byte[1024];
int length = 0;
while((length = bis.read(b)) != -1) {
bos.write(b, 0, length);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
包括Socket在内的5层通讯流程
Socket编程中, 运输层主要遵守以下两种协议:
传输控制协议 TCP(Transmisson Control Protocol): 提供面向连接的, 安全可靠的, 全双工数据传输服务
用户数据协议 UDP(User Datagram Protocol): 提供无连接的, 不一定安全可靠的, 半双工数据传输服务
UDP 的主要特点:
1. UDP 是无连接的;
2. UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);
3. UDP 是面向报文的;
4. UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 直播,实时视频会议等);
5. UDP 支持一对一、一对多、多对一和多对多的交互通信;
6. UDP 的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
TCP 的主要特点:
1. TCP 是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);
2. 每一条 TCP 连接只能有两个端点,每一条TCP连接只能是点对点的(一对一);
3. TCP 提供可靠交付的服务。通过TCP连接传送的数据,无差错、不丢失、不重复、并且按序到达;
4. TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
5. 面向字节流。TCP 中的“流”(Stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
TCP协议下的三次握手:
TCP协议下的四次挥手:
嗯…说人话:
三次握手:
李四看到张三向自己招手后,向对方点了点头挤出了-一个微笑(ack)。张三看到李四微笑后确认了李四成功辨认出了自己(进入estalished状态)。但是李四还有点狐疑,向四周看了-看,有没有可能张三是在看别人呢,他也需要确认一下。所以李四也向张三招了招手(syn),张三看到李四向自己招手后知道对方是在寻求自己的确认,于是也点了点头挤出了微笑(ack),李四看到对方的微笑后确认了张三就是在向自己打招呼(进入established状态)。于是两人加快步伐,走到了一起,相互拥抱。
四次挥手:
张三挥手(fin)---->李四伤感地微笑(ack)----> 李四挥手(fin)----> 张三伤感地微笑(ack)。