Skip to content

19.网络编程

19.1 介绍

19.2 Socket

  • Socket—套接字

  • 是网络应用程序编程的接口和一种机制

  • 用套接字中的相关函数来建立连接和完成通信

  • Socket可以看成在两个程序进行通讯连接中的一个端点

  • 将区分不同应用程序进程的三个参数

    • 通信的目的的IP地址
    • 使用的传输层协议
    • 使用的端口号
  • 与一个socket绑定

    利用TCP协议进行通信

    • 两个应用程序,有主从之分 一个称为服务器程(Server), 另外一个称为客户机程(Client)
    • 交互过程
      • 服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接
      • 客户端程序创建一个socket并请求与服务器建立连接
      • 刚才建立了连接的两个socket在一个单独的线程上对话
      • 服务器开始等待新的连接请求

19.3 ServerSocket

java
package com.neusoft.socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 * 项目:      javaadvice
 * 类名:       MyServer
 * 创建时间:  2020/11/24  13:42
 * 描述 :    服务器
 * 作者 :     张金山
 * QQ :     314649444
 * Site:      https://jshand.gitee.io
 */
public class MyServer {

    public static final int port = 9999;


    public static void main(String[] args) {

        try {
            ServerSocket server = new ServerSocket(port);

            while (true){
                System.out.println("server init @ localhost on "+port);
                Socket scoket = server.accept();
                System.out.println("有新的连接:");

                InetAddress address = scoket.getInetAddress();
                System.out.println(address.getHostName());

                //跟客户端进行交互
                InputStream is = scoket.getInputStream();;// 读客户端的信息
                OutputStream os = scoket.getOutputStream();// 向客户端写内容
                Scanner scanner = new Scanner(System.in);

                byte[] bts = new byte[1024];
                int len = -1;
                System.out.println("等待客户端输入内容:");
                while ((len = is.read(bts)) != -1 ){
                    String info = new String(bts,0,len);
                    System.out.println("client:"+info);
                    System.out.print("server:");
                    String sendInfo = scanner.nextLine();
                    os.write(sendInfo.getBytes());
                    os.flush();

                    if("bye".equals(info) || "bye".equals(sendInfo)){
                        os.close();
                        break;
                    }
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

19.4 Socket 客户端

java
package com.neusoft.socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * 项目:      javaadvice
 * 类名:       MyClient
 * 创建时间:  2020/11/24  14:25
 * 描述 :     Socket
 * 作者 :     张金山
 * QQ :     314649444
 * Site:      https://jshand.gitee.io
 */
public class MyClient {

    public static final String ip = "192.168.85.11";
    public static final int port = 6666;

    public static void main(String[] args) {
        try {
            Socket socket = new Socket(ip,port);
            InputStream is = socket.getInputStream();;// 读服务端的信息
            OutputStream os = socket.getOutputStream();// 向服务端写内容
            Scanner scanner = new Scanner(System.in);

            byte[] bts = new byte[1024];
            int len = -1;

            while (true){

                System.out.print("client:");
                String sendInfo = scanner.nextLine();
                os.write(sendInfo.getBytes());
                os.flush();
                len = is.read(bts);

                String info = new String(bts,0,len);
                System.out.println("server:"+info);


                if("bye".equals(info) || "bye".equals(sendInfo)){
                    socket.close();
                    break;
                }
            }




        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

19.5 多线程服务器封装

java
package com.neusoft.socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

/**
 * 项目:      javaadvice
 * 类名:       ServerThread
 * 创建时间:  2020/11/24  14:43
 * 描述 :
 * 作者 :     张金山
 * QQ :     314649444
 * Site:      https://jshand.gitee.io
 */
public class ServerThread implements  Runnable {
    Socket socket;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        System.out.println("有新的连接:");

        InetAddress address = socket.getInetAddress();
        System.out.println(address.getHostName());

        //跟客户端进行交互
        InputStream is = null;
        try {
            is = socket.getInputStream();  // 读客户端的信息
            OutputStream os = socket.getOutputStream();// 向客户端写内容
            Scanner scanner = new Scanner(System.in);
            byte[] bts = new byte[1024];
            int len = -1;
            System.out.println("等待客户端输入内容:");
            while ((len = is.read(bts)) != -1 ) {
                String info = new String(bts, 0, len);
                System.out.println("client:" + info);
                System.out.print("server:");
                String sendInfo = scanner.nextLine();
                os.write(sendInfo.getBytes());
                os.flush();

                if ("bye".equals(info) || "bye".equals(sendInfo)) {
                    socket.close();
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}
java
package com.neusoft.socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 * 项目:      javaadvice
 * 类名:       MyServer
 * 创建时间:  2020/11/24  13:42
 * 描述 :    服务器
 * 作者 :     张金山
 * QQ :     314649444
 * Site:      https://jshand.gitee.io
 */
public class MyServer {

    public static final int port = 9999;
    ServerSocket server = null;
    public MyServer() {
        try {
            server = new ServerSocket(port);
            System.out.println("server init @ localhost on "+port);


        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public void start(){
        while (true){
            Socket socket = null;
            try {
                socket = server.accept();
                new Thread(new ServerThread(socket)).start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {

        MyServer server = new MyServer();
        server.start();

    }

}

Released under the MIT License.