使用Java实现hello/hi的简单网络聊天程序
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(); } } } }