定义
- Socket – 本意”插座”,在网络编程中表示用于通信的逻辑载体/端点,俗称“套接字”。
- 是对TCP/IP协议的抽象,是操作系统对外开放的API。
服务端
- 创建ServerSocket类型的对象,并绑定参数指定的端口号。
- 等待客户端的连接请求,调用accept()方法。
- 得到Socket类型的对象并使用输入输出流进行通信。
- 关闭Socket并释放有关的资源。
客户端
- 创建Socket类型的对象,并提供服务器的IP地址和端口号。
- 使用输入输出流进行通信。
- 关闭Socket并释放有关的资源。
简介
Socket是对TCP/IP协议的抽象,是操作系统对外开放的接口

Socket通信流程

Socket相关的面试题
编写一个网络应用程序,有客户端与服务器端,客户端向服务器发送一个字符串,服务器收到该字符串后将其打印到命令行上,然后向客户端返回该字符串的长度,最后,客户端输出服务器端返回的该字符串的长度,分别用TCP和UDP两种方式去实现
在IDEA的工程中创建socket的包

TCP通信代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| package demo.socket;
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;
public class LengthCalculator extends Thread {
private final Socket socket;
public LengthCalculator(Socket socket) { this.socket = socket; }
@Override public void run() { try { OutputStream os = socket.getOutputStream(); InputStream is = socket.getInputStream(); int ch = 0; byte[] buff = new byte[1024]; ch = is.read(buff); String content = new String(buff, 0, ch); System.out.println(content); os.write(String.valueOf(content.length()).getBytes()); is.close(); os.close(); } catch (IOException e) { e.printStackTrace(); } } }
|
服务器端
- 创建ServerSocket类型的对象,并绑定参数指定的端口号。
- 等待客户端的连接请求,调用accept()方法。
- 得到Socket类型的对象并使用输入输出流进行通信。
- 关闭Socket并释放有关的资源。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| package demo.socket;
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket;
public class TcpServer {
public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(65000); while (true) { Socket socket = serverSocket.accept(); new LengthCalculator(socket).start(); } } }
|
客户端
- 创建Socket类型的对象 并提供接收方的IP地址和端口号
- 获取发送数据输入输出流。
- 接受服务端返回的字符串长度输出。
- 关闭输入输出流及Socket并释放有关的资源。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package demo.socket;
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;
public class TcpClient { public static void main(String[] args) throws IOException { Socket socket = new Socket("127.0.0.1", 65000); OutputStream os = socket.getOutputStream(); InputStream is = socket.getInputStream(); os.write(new String("hello world").getBytes()); int ch = 0; byte[] buff = new byte[1024]; ch = is.read(buff); String content = new String(buff, 0, ch); System.out.println(content); is.close(); os.close(); socket.close(); } }
|
执行结果
代码编写完成,首先启动TcpServer,再启动TcpClient,结果如下


UDP通信代码实现
服务器端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package demo.socket;
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket;
public class UdpServer { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(65001); byte[] buff = new byte[100]; DatagramPacket packet = new DatagramPacket(buff, buff.length); socket.receive(packet);
byte[] data = packet.getData(); String content = new String(data, 0, packet.getLength()); System.out.println("客户端发送来的数据:" + content); byte[] sendContent = String.valueOf(content.length()).getBytes(); DatagramPacket packetToClient = new DatagramPacket(sendContent, sendContent.length, packet.getAddress(), packet.getPort()); socket.send(packetToClient); } }
|
客户端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| package demo.socket;
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;
public class UdpClient { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(); byte[] buf = "Hello World".getBytes(); InetAddress address = InetAddress.getByName("127.0.0.1"); DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 65001); socket.send(packet);
byte[] data = new byte[100]; DatagramPacket receivedPacket = new DatagramPacket(data, data.length); socket.receive(receivedPacket); String content = new String(receivedPacket.getData(), 0, receivedPacket.getLength()); System.out.println("服务端发送过来的数据:" + content); } }
|
执行结果
代码编写完成,首先启动UdpServer,再启动UdpClient,结果如下

