Socket又称套接字,是基于应用服务与TCP/IP通信之间的一个抽象,它是计算机之间进行通信的一种约定或一种方式。通过socket这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。socket是用来连接到因特网的工具。将TCP/IP协议里面的通信逻辑进行分装,只要通过一组简单的API就可以实现网络的链接。

socket中TCP的三次握手建立连接详解
我们知道tcp建立连接要进行“三次握手”,即交换三个分组。大致流程如下:

1.客户端向服务器发送一个SYN J
2.服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1
3.客户端再想服务器发一个确认ACK K+1

服务器端先初始化socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器的连接就建立了,客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,最后关闭连接,一次交互结束。

通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器,而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合,这就是为什么通常服务器在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个

accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,称为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。

服务器端:

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; public class Server extends Netutil { public static void main(String[] args) {
new Server().Get();
} /*进入的方法*/
public void Get() {
try {
ServerSocket serverSocket = new ServerSocket(4432);
InetAddress inetAddress = InetAddress.getLocalHost(); // System.out.println("开启服务器");
Socket accept;
while (true) {
accept = serverSocket.accept();
//System.out.println("主机"+accept.getRemoteSocketAddress()+"连接服务器"); Thread hander = new Thread(new Handler(accept));
hander.start(); }
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 内部处理类
*/
class Handler extends Netutil implements Runnable {
Socket socket; public Handler(Socket socket) {
this.socket = socket;
} @Override
public void run() {
try {
super.Oprate(socket);
} catch (IOException e) {
e.printStackTrace();
} }
} }

客户端:

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; public class Server extends Netutil { public static void main(String[] args) {
new Server().Get();
} /*进入的方法*/
public void Get() {
try {
ServerSocket serverSocket = new ServerSocket(4432);
InetAddress inetAddress = InetAddress.getLocalHost(); // System.out.println("开启服务器");
Socket accept;
while (true) {
accept = serverSocket.accept();
//System.out.println("主机"+accept.getRemoteSocketAddress()+"连接服务器"); Thread hander = new Thread(new Handler(accept));
hander.start(); }
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 内部处理类
*/
class Handler extends Netutil implements Runnable {
Socket socket; public Handler(Socket socket) {
this.socket = socket;
} @Override
public void run() {
try {
super.Oprate(socket);
} catch (IOException e) {
e.printStackTrace();
} }
} }

最新文章

  1. Unix目录结构的来历(转)
  2. PAT 1007. 素数对猜想 (20)
  3. python实现自动输入命令回车操作
  4. linux 下如何安装Telnet ?
  5. 中国广核集团:BPM与ERP紧密结合
  6. jQuery checkBox 全选的例子
  7. python 中 struct 用法
  8. Android Loader详解四:回调及完整例子
  9. sql server统计字段的值在某些范围内中的个数
  10. 【CSS入门基础,有需要的看过来哦】心境,心静,不轻言放弃!---致CSS
  11. SSH的Eclips环境搭建
  12. urllib.parse
  13. (办公)TOKEN
  14. Chrome 插件PPAPI 开发(一)环境搭建
  15. 【php】php实现数组分块
  16. Ant之build.xml详解
  17. 【公众号系列】在SAP里查看条件记录的方法
  18. Shell变量的取用、删除、取代与替换
  19. pyqt环境安装
  20. SpringMVC学习笔记:数据的接收与返回

热门文章

  1. 错误信息:[ERR] Sorry, can't connect to node 10.211.55.8:7001
  2. fatal: refusing to merge unrelated histories(git pull)
  3. 1 Java面向对象
  4. luogu4930
  5. python_bisect模块的使用
  6. 2个最好的JavaScript编辑器 必须要知道
  7. python中的break continue之用法
  8. map,实现技巧,id
  9. 微擎转移服务器后,出现 require()错误,解决方案
  10. NUnit -- Test discovery or execution might not work for this project