Java学习笔记——Socket通信

一、Socket初识

        socket是指在一个特定编程模型下,进程之间通信链路的端口。一个socket包括两个流,一个输入流和一个输出流。
        在Java语言中,TCP/IP socket的连接是用java.net包中的类实现的。

1、实现思路

  1. 服务器分配一个端口号,监听端口是否有连接请求。如果客户请求一个连接,服务器使用accept()方法打开socket连接。
  2. 客户在host的port端口建立连接。
  3. 服务器和客户使用InputStream和OutputStream进行通信。

2、编程过程:

1. 创建Socket。
2. 打开连接到socket的输入/输出流。
3. 按照一定的协议对Socket进行读/写操作。
4. 关闭Socket。

二、客户套接字

        SeverSocket类设计成在等待客户建立之前什么也不做的“监听器”。

1、构造函数

public Socket(String hostName, int port)
	创建一个本地主机与给定名称的主机和端口的套接字连接。
public Socket(InetAddress ipAddress, int port)
	用一个预先存在的InetAddress对象和端口创建一个套接字。

2、常用函数

Int getPoet():取得与该Socket对象连接的远程端口。
Int getLocalPort():取得与该Socket连接的本地端口。
InetAddress getInetAddress():取得与Socket对象相关的InetAddress。

public InputStream getInputStream():获取与调用套接字相关的InputStream类。
public OutputStream getOutputStream():获取与调用套接字相关的OutputStream类。
void close():关闭InputStream和OutputStream。
举个栗子:
import java.io.*;
import java.net.*;

public class hostDemo
{
    public static void main(String[] args)
    {
        try
        {
            Socket connection = new Socket("www.baidu.com", 80);
            System.out.println("建立连接...");
            System.out.println("===========");
            System.out.println("本地连接信息:");
            System.out.println("地址:" + connection.getLocalAddress());
            System.out.println("端口:" + connection.getLocalPort());
            System.out.println("===========");
            System.out.println("远程连接信息:");
            System.out.println("地址:" + connection.getInetAddress());
            System.out.println("端口:" + connection.getPort());
        } catch (UnknownHostException e1)
        {
            System.out.println("未知主机:" + "www.baidu.com");
        } catch (IOException e2)
        {
            System.out.println("IOException:" + e2);
        }
    }
}

运行结果:

建立连接...
===========
本地连接信息:
地址:/192.168.1.5
端口:4280
===========
远程连接信息:
地址:www.baidu.com/14.215.177.39
端口:80

三、服务器套接字

        Java具有不同的用来创建服务器应用程序的套接字类。ServerSocket类用来创建服务器,并监听本地或远程客户程序通过公共端口的连接。
        ServerSocket与Socket类完全不同。当创建一个ServerSocket类时,它将设置与自己感兴趣的客户连接。

1、构造函数

ServerSocket(int port):在指定端口创建队列长度为50的服务器套接字。
ServerSocket(int port, int maxQueue):在指定端口创建一个最大队列长度为maxQueue的服务器套接字。
ServerSocket(int port, int maxQueue,InetAddress localAddress): 在指定端口创建一个最大队列长度为maxQueue的服务器套接字。在一个多地址主机上,localAddress指定该套接字约束吃的IP地址。

2、ServerSocket类的accept()方法

        该方法是一个等待客户开始通信的模块化调用,然后以一个用来与客户通信的常规Socket返回。accept()方法是阻塞性方法,调用后将等待客户的请求,直到有一个客户启动并请求连接到相同的端口。

举个栗子:
/*
服务器造5432端口提供服务,一直等待客户的请求。
如果客户发来请求,服务器端将发出提示信息,显示"Hello World!",关闭客户端连接,停止数据传输。
*/
public class hostDemo
{
    public static void main(String[] args)
    {
        ServerSocket server = null; // 创建服务器
        Socket socket1;
        String sendString = "Hello World!";
        OutputStream slout;
        DataOutputStream dos;
        try{
            server  = new ServerSocket(5432);   // 服务器在端口5432上开辟新的服务
        } catch (IOException e)
        {
            e.printStackTrace();
        }
        while (true)
        {
            try{
                socket1 = server.accept();  // 保持监听状态
                slout = socket1.getOutputStream();  // 通过Socket取得的数据流
                dos = new DataOutputStream(slout);
                dos.writeUTF(sendString);   // 将数据流统一编码为UTF
                slout.close();  // 接受数据流关闭
                socket1.close();    // Socket关闭
            } catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}
发布了27 篇原创文章 · 获赞 1 · 访问量 996

猜你喜欢

转载自blog.csdn.net/qq_41320782/article/details/105565942