1.Socket
1.TCP通信
- 客户端:
java.net.Socket
类表示. 创建Socket
对象 - 服务端:
java.net.ServerSocket
类表示. 创建ServerSocket
对象
2.Socket类
构造方法
-
public Socket(String host, int port)
: 创建套接字对象, 指定主机和端口号, 如果host是null, 则相当于指定地址为回送地址例子
Socket client = new Socket("127.0.0.1", 6666);
成员方法
public InputStream getInputStream()
: 返回套接字的输入流- 如果此Socket具有相关联的通道, 则生成的
InputStream
的所有操作也关联该通道 - 关闭生成的
InputStream
也将关闭相关的Socket.
- 如果此Socket具有相关联的通道, 则生成的
public OutputStream getOutputStream()
: 返回套接字的输出流- 如果此Socket具有相关联的通道, 则生成的
OutputStream
的所有操作也关联该通道 - 关闭生成的
OutputStream
也将关闭相关的Socket.
- 如果此Socket具有相关联的通道, 则生成的
public void close()
:关闭套接字- 一旦关闭,则不可使用
- 关闭Socket,也关闭
OutputStream
和InputStream
public void shutdownOutput()
:禁止此套接字的输出流- 任何先前写出的数据将被发送,随后终止输出流
3.ServerSocket
构造方法
-
public ServerSocket(int port)
: 使用该构造方法创建ServerSocket
对象时,就可以将其绑定到一个指 定的端口号上,参数port
就是端口号例子
ServerSocket server = new ServerSocket(6666);
成员方法
public Socket accept()
: 侦听并接受连接, 返回一个新的Socket对象,用于和客户端实现通信。该方法 会一直阻塞直到建立连接。
4.简单的使用
TCP通信分析图解
-
【服务端】启动,创建ServerSocket对象,等待连接。
-
【客户端】启动,创建Socket对象,请求连接。
-
【服务端】接收连接,调用accept方法,并返回一个Socket对象。
-
【客户端】Socket对象,获取OutputStream,向服务端写出数据。
-
【服务端】Scoket对象,获取InputStream,读取客户端发送的数据。 到此,客户端向服务端发送数据成功。 自此,服务端向客户端回写数据。
-
【服务端】Socket对象,获取OutputStream,向客户端回写数据。
-
【客户端】Scoket对象,获取InputStream,解析回写数据。
-
【客户端】释放资源,断开连接。
服务端实现
public class ServerTCP{
public static void main(String[] args) throws IOException{
System.out.println("服务端启动, 等待连接");
// 1.创建ServerSocket对象,绑定端口,开始等待连接
ServerSocket ss = new ServerSocket(6666);
// 2.接受连接accept方法, 返回Socket
Socket server = ss.accept();
// 3.通过Socket获取输入流
InputStream is = server.getInputStream();
// 4.一次性读取数据
// 1.创建字节数数组
byte[] b = new byte[1024];
// 2.读取数据到字节数组中
int len = is.read(b);
// 3.解析数据,打印字符串信息
String msg = new String(b,0,len);
System.out.prinln(msg);
/*服务端回送数据
// 5. 通过 socket 获取输出流
OutputStream out = server.getOutputStream();
// 6. 回写数据
out.write("我很好,谢谢你".getBytes());
*/
// 5.关闭资源
is.close();
server.close();
}
}
客户端实现
public class ClientTCP{
public static void main(String[] args) throws Exception{
System.out.println("客户端,发送数据");
//1.创建Socket(ip, port), 确定连接数据
Socket client = new Socket("localhost", 6666);
//2.通过Socket,获取输出流对象
OutputStream os = client.getOutputStream();
// 3.写出数据
os.write("你好,约吗?".getBytes());
//4.Socket获取输入流对象
InputStream in = client.getInputStream();
//5.读取数据
byte[] b = new byte[1024];
int len = in.read(b);
System.out.println(new String(b,0,len));
//6.关闭资源
in.close();
os.close();
client.close();
}
}
UDP
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java,.net.InetAddress;
/*
udp客户端
*/
public class UDPClient{
public static void main(String[] args)throws IOException{
// 要发送的消息
byte[] bs = "我是客户端给你发消息".getBytes();
// 本机ip地址巡回
InetAddress ip = InetAddress.getLocalHost();
// 数据报文,udp服务端口为多少 10000代表的是服务端的端口号
DatagramPacket p = new DatagramPacket(bs, bs.length,ip,10000);
// 创键客户端套接字, 设置端口号
DatagramSocket socket = new DetagramSocket(10010);
//向服务端发送数据
socket.send(p);
//关闭套接字
socket.close();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java,.net.InetAddress;
public class UDPServer{
public static void main(String[] args) throws IOException{
//用数组接受数据包
byte[] bs = new byte[1024];
DatagramPacket p = new DetagramPacket(bs, bs,length);
// 创建服务端报文套接字
DatagramSocket socket = new DatagramSocket(10000);
// 接受数据包
socket.receive(p);
System.out.println(new String(bs, 0, p.getLength()));
//关闭套接字
socket.close();
}
}