使用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();
            }

        }
    }

}
posted @ 2019-12-10 18:58  lyp1020k  阅读(217)  评论(0编辑  收藏  举报