A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 没有退路 初级黑马   /  2019-10-10 12:06  /  876 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 没有退路 于 2019-10-10 12:11 编辑

1Socket简介

Socket原理:
Socket:通常称为套接字,用于描述IP地址和端口,是一个通信连的句柄。在internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应不同的服务。
应用程序网络通信原理:通常通过套接字向网络发出请求或者应答网络请求。Socket和ServerSocket类位于java.net包中。ServerSocket位于服务端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会生成一个Socket实例,操作这个实例,完成所需对话。
网络编程分类:
java.net 包中提供了两种常见的网络协议的支持:
TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
UDP:UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。

2TCP通信模型和编程

TCP通信模型(客户端和服务端通信):
TCP编程的核心类(ServerSocket和Socket):
ServerSocket类:
服务器应用程序通过使用 java.net.ServerSocket 类以获取一个端口,并且侦听客户端请求。常用方法如下:

方法名

简介

ServerSocket(int   port)

构造函数:创建绑定到特定端口的服务器套接字

ServerSocket(int   port, int backlog, InetAddress address)

构造函数:使用指定的端口、侦听和要绑定到的本地 IP 地址创建服务器。

int getLocalPort()
返回此套接字在其上侦听的端口
Socket accept()
侦听并接受到此套接字的连接
void setSoTimeout(int timeout)
通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位
void bind(SocketAddress host, int backlog)
将 ServerSocket 绑定到特定地址(IP 地址和端口号)
Socket类:
java.net.Socket 类代表客户端和服务器都用来互相沟通的套接字。常用方法如下:
方法名
简介
Socket(String host, int port)
构造函数:创建一个流套接字并将其连接到指定主机上的指定端口号
Socket(InetAddress host, int port)
构造函数:创建一个流套接字并将其连接到指定 IP 地址的指定端口号
void connect(SocketAddress host, int timeout)
将此套接字连接到服务器,并指定一个超时值
InetAddress   getInetAddress()
返回套接字连接的地址
int getPort()
返回此套接字连接到的远程端口
int getLocalPort()
返回此套接字绑定到的本地端口
SocketAddress getRemoteSocketAddress()
返回此套接字连接的端点的地址,如果未连接则返回 null
InputStream getInputStream()
返回此套接字的输入流
OutputStream getOutputStream()
返回此套接字的输出流
void close()
关闭此套接字

TCP网络编程模型:

TCP编程实例:

服务端代码:

package com.example.socket;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TestTcpServer {

    public static void main(String[] args) {

        try {
             ServerSocket listen = newServerSocket(3333);
            Socket server  = listen.accept();
InputStream in = server.getInputStream();
            OutputStream out = server.getOutputStream();

            byte[] content = new byte[30];
              in.read(content);
            System.out.println("服务端收到:" + new String(content));

            String sendInfo  = "No Problem!";
            out.write(sendInfo.getBytes());

            out.close();
            in.close();
            server.close();
            listen.close();
        } catch (Exception e) {
             e.printStackTrace();
        }


    }

}

客户端代码:
package com.example.socket;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;


public class TestTCPClient {

    public static void main(String[] args) {
        try {
             Socket client = newSocket("127.0.0.1" , 3333);
            InputStream in = client.getInputStream();
            OutputStream out = client.getOutputStream();

            String content  = "hello,world!";
            out.write(content.getBytes());

            byte[] receiveInfo = newbyte[30];
              in.read(receiveInfo);
            System.out.println("客户端收到:" + new String(receiveInfo));

            out.close();
            in.close();
            client.close();
        } catch (Exception e) {
             e.printStackTrace();
        }

    }

}

3UDP通信模型和编程编程

UDP通信模型(客户端和服务端通信):
UDP编程的核心类(DatagramSocket和DatagramPacket):
DatagramSocket类:
此类表示用来发送和接收数据报包的套接字。常用方法如下:
方法
简介
DatagramSocket()
构造函数:构造数据报套接字并将其绑定到本地主机上任何可用端口
DatagramSocket(int   port)
构造函数:创建数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket(int port, InetAddress   laddr)
构造函数:创建数据报套接字,将其绑定到指定的本地地址。
void   receive(DatagramPacket p)
从此套接字接收数据报包。
void   send(DatagramPacket p)
从此套接字发送数据报包。
close()
关闭此数据报套接字。
DatagramPacket类:
此类表示数据报包。常用方法如下:
方法
简介
DatagramPacket
(byte[]   buf, int length)
构造函数:构造 DatagramPacket,用来接收长度为 length 的数据包。
DatagramPacket
(byte[]   buf, int length, InetAddress address, int port)
构造函数:构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
InetAddress    getAddress()
返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
byte[]   getData()
返回数据缓冲区。
int   getLength()
返回将要发送或接收到的数据的长度。
int   getPort()
返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。

UDP网络编程模型:

UDP编程实例:

服务端代码:

package com.example.socket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class TestUDPServer {
    public static void main(String[] args){
        try {
             DatagramSocket server = newDatagramSocket(6666);

            byte[] recvBuf = new byte[30];
            DatagramPacket recvPacket = newDatagramPacket(recvBuf , recvBuf.length);
            server.receive(recvPacket);
            String recvStr = newString(recvPacket.getData() , 0 , recvPacket.getLength());
            System.out .println("服务端收到: " + recvStr);

            int port = recvPacket.getPort();
            InetAddress addr = recvPacket.getAddress();
            String sendStr = "UDPsever send content";
            byte[] sendBuf;
            sendBuf = sendStr.getBytes();
            DatagramPacket sendPacket = newDatagramPacket(sendBuf , sendBuf.length , addr , port );
            server.send(sendPacket);

            server.close();
        } catch (Exception e) {
             e.printStackTrace();
        }
    }
}
客户端代码:
package com.example.socket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class TestUDPClient {
    public static void main(String[] args){
        try {
             DatagramSocket client = newDatagramSocket();

            String sendStr = "UDPClient send content";
            byte[] sendBuf;
            sendBuf = sendStr.getBytes();
            InetAddress addr = InetAddress.getByName("127.0.0.1");
            int port = 6666;
            DatagramPacket sendPacket = newDatagramPacket(sendBuf ,sendBuf.length , addr , port);
            client.send(sendPacket);

            byte[] recvBuf = new byte[30];
            DatagramPacket recvPacket = newDatagramPacket(recvBuf , recvBuf.length);
            client.receive(recvPacket);
            String recvStr = newString(recvPacket.getData() , 0 ,recvPacket.getLength());
            System.out .println("客户端收到: " + recvStr);

            client.close();
        } catch (Exception e) {
             e.printStackTrace();
        }
    }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马