网络编程
问:Java Socket的几个方法
getInetAddress() Returns the address to which the socket is connected.
getLocalAddress() Gets the local address to which the socket is bound.
getReuseAddress() Tests if SO_RESUSADDR is enabled.
getRemotePort() Returns the remote port number to which this socket is connected.
问:基于TCP协议的Socket通信
(1) 客户端实现步骤
- 创建Socket对象,指明需要连接的服务器的地址和端口号
- 连接建立后,通过输出流想服务器端发送请求信息
- 通过输入流获取服务器响应的信息
- 关闭响应资源
实例代码:
public static void main(String[] args) {
Socket socket=null;
PrintWriter pw=null;
BufferedReader br=null;
try {
// 1、创建客户端Socket,指定服务器地址和端口
socket = new Socket("127.0.0.1", 6000);
// 2、获取输入流,并读取服务器端的响应信息
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 3、获取输出流,向服务器端发送信息
pw = new PrintWriter(socket.getOutputStream());
// 4. 通过输入流、输出流通信
}catch (IOException e) {
e.printStackTrace();
} finally{
try {
// 5、关闭资源
if(br!=null)
br.close();
if(pw!=null)
pw.close();
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
(2) 服务器端实现步骤
- 创建ServerSocket对象,绑定监听端口
- 通过accept()方法监听客户端请求
- 连接建立后,通过输入流读取客户端发送的请求信息
- 通过输出流向客户端发送乡音信息
- 关闭相关资源
实例代码:
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
BufferedReader br = null;
PrintWriter pw = null;
try {
// 1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口(1024-65535),并监听此端口
serverSocket = new ServerSocket(6000);
// 2、调用accept()方法开始监听,等待客户端的连接
socket = serverSocket.accept();
// 3、获取输入流,并读取客户端信息
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 4、获取输出流,响应客户端的请求
pw = new PrintWriter(socket.getOutputStream());
// 5. 通过输入流、输出流通信
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 6、关闭资源
if (br != null)
br.close();
if (br != null)
pw.close();
if (br != null)
socket.close();
if (br != null)
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
问:基于UDP协议的Socket通信
(1) 客户端实现步骤
- 定义服务器的地址、端口号、数据
- 创建DatagramPacket,包含将要发送的信息
- 创建DatagramSocket
- 向服务器发送数据
实例代码:
public static void main(String[] args) {
DatagramSocket socket = null;
try {
// 向服务器端发送数据
// 1、定义服务器的地址、端口号、数据
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10010;
byte[] data1 = "Hello Server".getBytes();
// 2、创建数据报,包含发送的数据信息
DatagramPacket packet1 = new DatagramPacket(data1, data1.length, address, port);
// 3、创建DatagramSocket对象
socket = new DatagramSocket();
// 4、向服务器发送数据
socket.send(packet1);
// =========================================================
// 接受服务器端响应数据
// 1、创建数据报,用于接受服务器端响应数据
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
// 2、接受服务器响应的数据
socket.receive(packet2);
String str = new String(data2, 0, packet2.getLength());
System.out.println("I am client, server says:" + str);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4、关闭资源
if(socket!=null)
socket.close();
}
}
(2) 服务器端实现步骤
- 创建DatagramSocket,指定端口号
- 创建DatagramPacket,,用于接受客户端发送的数据
- 接受客户端发送的数据信息
- 读取数据
实例代码:
public static void main(String[] args) {
DatagramSocket socket = null;
try {
// 接受服务器端数据
// 1、创建服务器端DatagramSocket,指定端口
socket = new DatagramSocket(10010);
// 2、创建数据报,用于接受客户端发送的数据
byte[] data1 = new byte[1024];//
DatagramPacket packet1 = new DatagramPacket(data1, data1.length);
// 3、接受客户端发送的数据
socket.receive(packet1);// 此方法在接受数据报之前会一致阻塞
// 4、读取数据
String info = new String(data1, 0, data1.length);
System.out.println("I am server, client says: " + info);
// =========================================================
// 向客户端响应数据
// 1、定义客户端的地址、端口号、数据
InetAddress address = packet1.getAddress();
int port = packet1.getPort();
byte[] data2 = "Welcome!".getBytes();
// 2、创建数据报,包含响应的数据信息
DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
// 3、响应客户端
socket.send(packet2);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4、关闭资源
if (socket != null)
socket.close();
}
}