socket编程

本文介绍了socket的概念及编程原理,包括socket的通信模式、编程流程,并通过Java语言提供了客户端和服务端的具体编程示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.socket是什么?

socket又叫套接字,是在应用层和传输层的抽象层。它把复杂的TCP/IP协议族隐藏在Socket接口后面,从而进行简单的接口调用就可以达到进程通信的效果。
socket是一种”打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个”文件”,在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

2.socke编程原理

这是TCP下面向连接的socket的流程图

TCP下socket的流程图

我们可以大致得出socket的流程是
1.创建socket,做好绑定主机端口,监听和等待客户端socket连接的准备
2.accept()堵塞中,直到客户端连接
3.对socket进行读写操作
4.关闭socket

这是UDP下面向非连接的socket的流程图
UDP下socket的流程图
由于UDP特性是无连接的,客户端和服务器不用建立连接,所以客户端和服务器界限是模糊的,两者的运行原理也会相同的。它无法保证数据报文的安全性,通信对方能否收到数据包。它只关心通信的对方的IP和端口号就可以通信

3.socke编程示例

java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。两个类多个构造器
socket

    public Socket()


public Socket(String host, int port)
     throws UnknownHostException, IOException
------------------------------------------------------------------------

    public Socket(InetAddress address, int port)
        throws IOException
    public Socket(String host, int port, InetAddress localAddr,int localPort) 
        throws IOException
    public Socket(InetAddress address, int port, InetAddress localAddr,int localPort) 
        throws IOException 
    public Socket(String host, int port, boolean stream) 
        throws IOException 

address:另一方的IP地址
host:另一方的主机名
port:另一方的端口号
localPort:本机的端口号
localAddr:本机的IP地址
stream:决定使用的是TCP还是UDP

ServerSocket


public ServerSocket(int port) throws IOException
------------------------------------------------

public ServerSocket(int port, int backlog) 
    throws IOException 
public ServerSocket(int port, int backlog, InetAddress bindAddr) 
    throws IOException

port:本地的端口号

TCP面向连接代码示例

客户端

package socket;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientSocketTest {
    public static void main(String[] args){
        Socket s = null;
        try {
            s = new Socket("127.0.0.1",8087);
        } catch (Exception e1) {

            System.out.println("客户端出错"+e1.getMessage());
        }
        try {
            PrintStream serverOut = new PrintStream(s.getOutputStream());
            BufferedInputStream clientIn = new BufferedInputStream(System.in);
            //BufferedInputStream serverIn =  new BufferedInputStream(s.getInputStream());
            byte[] b = new byte[1024];
            clientIn.read(b);
            serverOut.print(new String(b));
            serverOut.close();
            //serverIn.close();
            clientIn.close();
        } catch (IOException e) {
            System.out.println("读写出错"+e.getMessage());
        }
        try {
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}

服务器

package socket;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketTest {
    public static void main(String[] args){
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(8087);
            System.out.println("服务器已启动");

        } catch (IOException e) {
            System.out.println("服务器未启动"+e.getMessage());
        }
        Socket clientSocket = null;
        try {
            System.out.println("服务器开始堵塞,等待用户连接");
            clientSocket = serverSocket.accept();
        } catch (IOException e) {
            System.out.println("服务器出错"+e.getMessage());
        }

        try {
            System.out.println("服务器与客户端已经连接,正在进行读写操作");
            PrintStream clientOut = new PrintStream(clientSocket.getOutputStream());
            //BufferedInputStream serverIn = new BufferedInputStream(System.in);
            BufferedInputStream clientIn = new BufferedInputStream(clientSocket.getInputStream());
            byte[] b = new byte[1024];
            clientIn.read(b);
            System.out.print("客户端说:"+new String(b));
            clientOut.close();
            //serverIn.close();
            clientIn.close();
        } catch (IOException e) {
            System.out.println("读写出错"+e.getMessage());
        }
        try {
            clientSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
运行结果
ServerSocketTest
服务器已启动
服务器开始堵塞,等待用户连接
服务器与客户端已经连接,正在进行读写操作
客户端说:sadfsdafasd

ClientSocketTest
输入:sadfsdafasd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值