Java为Socket编程封装了几个重要的类。
1.1 Socket类
Socket类实现了一个客户端socket,作为两台机器通信的终端,默认采用的传输层协议为TCP,是一个可靠传输的协议。Socket类除了构造函数返回一个socket外,还提供了connect, getOutputStream, getInputStream和close方法。connect方法用于请求一个socket连接,getOutputStream用于获得写socket的输出流,getInputStream用于获得读socket的输入流,close方法用于关闭一个流。
1.2 DatagramSocket类
DatagramSocket类实现了一个发送和接收数据报的socket,传输层协议使用UDP,不能保证数据报的可靠传输。DataGramSocket主要有send, receive和close三个方法。send用于发送一个数据报,Java提供了DatagramPacket对象用来表达一个数据报。receive用于接收一个数据报,调用该方法后,一直阻塞接收到直到数据报或者超时。close是关闭一个socket。
1.3 ServerSocket类
ServerSocket类实现了一个服务器socket,一个服务器socket等待客户端网络请求,然后基于这些请求执行操作,并返回给请求者一个结果。ServerSocket提供了bind、accept和close三个方法。bind方法为ServerSocket绑定一个IP地址和端口,并开始监听该端口。accept方法为ServerSocket接受请求并返回一个Socket对象,accept方法调用后,将一直阻塞直到有请求到达。close方法关闭一个ServerSocket对象。
1.4 SocketAddress
SocketAddress提供了一个socket地址,不关心传输层协议。这是一个虚类,由子类来具体实现功能、绑定传输协议。它提供了一个不可变的对象,被socket用来绑定、连接或者返回数值。
1.5 InetSocketAddress
InetSocketAddress实现了IP地址的SocketAddress,也就是有IP地址和端口号表达Socket地址。如果不制定具体的IP地址和端口号,那么IP地址默认为本机地址,端口号随机选择一个。
1.6. DatagramPacket
DatagramSocket是面向数据报socket通信的一个可选通道。数据报通道不是对网络数据报socket通信的完全抽象。socket通信的控制由DatagramSocket对象实现。DatagramPacket需要与DatagramSocket配合使用才能完成基于数据报的socket通信。
2、相关联的API:
首先先来看下ServerSocket
类 ServerSocket
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
服务器套接字的实际工作由 SocketImpl
类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。
一些重要的方法:(具体大家查看官方api吧)
ServerSocket(int port, int backlog)
利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。
bind(SocketAddress endpoint, int backlog)
将 ServerSocket
绑定到特定地址(IP 地址和端口号)。
accept()
侦听并接受到此套接字的连接
getInetAddress()
返回此服务器套接字的本地地址。
close()
关闭此套接字。
3.再来看下Socket
类 Socket
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
套接字的实际工作由 SocketImpl
类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
一些重要的方法:(具体大家查看官方api吧)
Socket(InetAddress address, int port)
创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
getInetAddress()
返回套接字连接的地址。
shutdownInput()
此套接字的输入流置于“流的末尾”。
shutdownOutput()
禁用此套接字的输出流。
close()
关闭此套接字。
以上转自https://blog.csdn.net/OscarNile/article/details/78578285
4、基于TCP的socket编程
(1)客户端:
- 建立连接
- 打开socket关联的输入输出流
- 数据流中读写信息
- 关闭所有数据流和socket
(2)服务端:
- 建立连接,处理发送到指定端口的数据
- 获取客户端对象
- 数据流中读写信息
- 关闭所有数据流和socket
TCP客户端
//1、创建socket对象
Socket client = new Socket("localhost",8888);
//2.创建缓冲字符流
BufferedIReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
//3.创建输出流
PrintWriter pw = new PrintWriter(client.getOutputStream(),true);
pw.println(str);
pw.flush();
client.shutDownOutput();
//4.客户端从socket中读取信息
BufferReader br2 = new BufferReader(new InputStreamReader(client.getInputStream(),"gdk"));
System.out.println(br2.readLine());
client.shutDownInput();
br2.close();
pw.close();
br.close();
client.close();
TCP服务器端
//接收
ServerSocket server = new ServerSocket(8888);
Socket client = server.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream());
system.out.println(client.getInetAddress().getHostName()+"说:"+br.readLine();
client.shutdownInput();
//发送
PrintWriter pw = new PrintWriter(client.getOutputStream(),true);
pw.println("ok,get it");
pw.flush();
client.shutdowmOutput();
pw.close();
br.close();
client.close();
5、基于UDP的socket 编程
//发送方
Scanner input = new Scanner(System.in);
//1创建DatagramSocket对象 用于发送或者接受数据包
DatagramSocket ds = new DatagramSocket(9000);//9000是自己端口,这个端口号可以不指定,系统随机分配一个没有被使用用的端口号
while(true){
//2、创建数据包 发送数据
String str = input.next();//从9000端口 发送到8000端口
//发送数据 字节数组
DatagramPacket dp = new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("127.0.0.1"),8000);
//3、发送
ds.send(dp);
if("bye".equals(str)){
break;
}
/*现在发送方变成接收方*/
byte[] buf = new byte[1024];
//3/创建数据包对象 接受数据
DatagramPacket dp1 = new DatagramPacket(buf,buf.length);
ds.receive(dp1);
//4、显示一下接受的信息
System.out.println(new String(dp1.getData(),0,dp1.getLength()));
}
//关闭
ds.close();
//接收方
Scanner input = new Scanner(System.in);
//1、DatagramSocket对象
DatagramSocket ds = new DatagramSocket(8000);
while(true){
//2、接受数据包
byte[] buf = new byte[1024];
//3/创建数据包对象 接受数据
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
//4、显示一下接受的信息
String s = new String(dp.getData(),0,dp.getLength());
System.out.println(s);
if("bye".equals(s)){
break;
}
/* 现在接收方就变成发送方*/
String str = input.next();//从8000端口 发送到9000端口
//发送数据 字节数组
DatagramPacket dp1 = new DatagramPacket(str.getBytes(),str.getBytes().length,dp.getAddress(),dp.getPort());
//3、发送
ds.send(dp1);
}
//关闭
ds.close();