Java-Socket(案例)
InetAddress类
- 获取本机InetAddress对象getLocalHost
- 根据指定主机名/域名获取ip地址对象getByName
- 获取InetAddress对象的主机名getHostName
- 获取InetAddress对象的地址getHostAddress
API代码实现
public class API_ {
public static void main(String[] args) throws UnknownHostException {
//1.获取本机的InetAddress对象
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);//DESKTOP-7QOGCPR/192.168.137.1
//2.根据指定主机名获取InetAddress对象
InetAddress host1 = InetAddress.getByName("DESKTOP-7QOGCPR");
System.out.println("host1 = " + host1);
//3.根据域名返回InetAddress对象,比如www.baidu.com对应
InetAddress host2 = InetAddress.getByName("www.baidu.com");
System.out.println("host2 = " + host2);
//4.通过InetAddress对象,获取对应的地址
String hostAddress = host2.getHostAddress();//IP
System.out.println("host2 对应的ip = " + hostAddress);
//5.通过InetAddress对象,获取对应的主机名或者时域名
String hostName = host2.getHostName();
System.out.println("host2 对应的主机名/域名 = " + hostName);
}
}
DESKTOP-7QOGCPR/192.168.137.1
host1 = DESKTOP-7QOGCPR/192.168.137.1
host2 = www.baidu.com/39.156.66.18
host2 对应的ip = 39.156.66.18
host2 对应的主机名/域名 = www.baidu.com
Socket套接字
基本介绍
- 套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准。
- 通信的两端都要有Socket,是两台机器间通信的端点
- 网络通信其实就是Socket间的通信。
- Socket允许程序把网络连接当成一个流,数据在两个Socketl间通过IO传输。
- 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端
理解
通过流来操作
TCP编程可靠
UDP编程不可靠
TCP网络通信编程
基本介绍
- 基于客户端一服务端的网络通信
- 底层使用的是TCP/IP协议
- 应用场景举例:客户端发送数据,服务端接受并显示控制台
- 基于Socket的TCP编程
TCP编程
案例一(字节流)
1.编写一个服务器端,和一个客户端 2.服务器端在9999端口监听 3.客户端连接到服务器端,发送"hello,server'",然后退出 4.服务器端接收到客户端发送的信息,输出,并退出
代码实现
服务端
package com.gbx.socket;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author LeeZhi
* @version 1.0
* 服务端
*/
public class SocketTCP01Server {
public static void main(String[] args) throws IOException {
//思路
//1.在本机的9999端口监听,等待连接
// 细节:要求在本机没有其它服务在监听9999
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务端,在9999端口监听,等待连接...");
//2.当没有客户端连接9999端口时,程序会阻塞,等待连接
//如果有客户端连接,则会返回Socket对象,程序继续
Socket socket = serverSocket.accept();
System.out.println("socket = " + serverSocket.getClass());
//3.通过socket.getInputStream() 读取客户端写入到数据通道的数据,显示
InputStream inputStream = socket.getInputStream();
//4.IO读取
byte[] buf = new byte[1024];
int readLen = 0;
while ((readLen = inputStream.read(buf)) != -1) {
System.out.println(new String(buf, 0, readLen));//根据读取到的实际长度,显示内容
}
//5.关闭流和socket
inputStream.close();
socket.close();
serverSocket.close();
}
}
客户端
package com.gbx.socket;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* @author LeeZhi
* @version 1.0
* 客户端,发送 'hello ,server'
*/
public class SocketTCP01Client {
public static void main(String[] args) throws IOException {
//1.连接服端(ip,端口)
//解读:连接本机的9999端口
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("socket返回="+socket.getClass());
//2.连接上后,生成Socket,通过socket.getOutputStream()
//得到和socket对象关联的输出流对象
OutputStream outputStream = socket.getOutputStream();
//3。通过输出流,写入数据到数据通道
outputStream.write("hello world".getBytes());
//4.关闭流对象和socket,必须关闭
outputStream.close();
socket.close();
System.out.println("客户端退出...");
}
}
案例二(字节流)
- 编写一个服务端,和一个客户端
- 服务器端在9999端口监听
- 客户端连接到服务端,发送"hello,server'",并接收服务器端回发的"hello,client'",再退出
- 服务器端接收到客户端发送的信息,输出,并发送"hello,client",再退出
代码实现
服务端
package com.gbx.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author LeeZhi
* @version 1.0
* 服务端
*/
public class SocketTCP02Server {
public static void main(String[] args) throws IOException {
//思路
//1.在本机的9999端口监听,等待连接
// 细节:要求在本机没有其它服务在监听9999
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务端,在9999端口监听,等待连接...");
//2.当没有客户端连接9999端口时,程序会阻塞,等待连接
//如果有客户端连接,则会返回Socket对象,程序继续
Socket socket = serverSocket.accept();
System.out.println("socket = " + serverSocket.getClass());
//3.通过socket.getInputStream() 读取客户端写入到数据通道的数据,显示
InputStream inputStream = socket.getInputStream();
//4.IO读取
byte[] buf = new byte[1024];
int readLen = 0;
while ((readLen = inputStream.read(buf)) != -1) {
System.out.println(new String(buf, 0, readLen));//根据读取到的实际长度,显示内容
}
//设置结束标记
socket.shutdownOutput();
//5.获取socket相关联的输出流
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello,client".getBytes());
//6.关闭流和socket
outputStream.close();
inputStream.close();
socket.close();
serverSocket.close();
}
}
客户端
package com.gbx.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
/**
* @author LeeZhi
* @version 1.0
* 客户端,发送 'hello ,server'
*/
public class SocketTCP02Client {
public static void main(String[] args) throws IOException {
//1.连接服端(ip,端口)
//解读:连接本机的9999端口
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("socket返回="+socket.getClass());
//2.连接上后,生成Socket,通过socket.getOutputStream()
//得到和socket对象关联的输出流对象
OutputStream outputStream = socket.getOutputStream();
//3。通过输出流,写入数据到数据通道
outputStream.write("hello server".getBytes());
//4.获取和socket关联的输入流,读取数据(字节),并显示
InputStream inputStream = socket.getInputStream();
byte[] buf = new byte[1024];
int readLen = 0;
while ((readLen = inputStream.read(buf)) != -1) {
System.out.println(new String(buf, 0, readLen));//根据读取到的实际长度,显示内容
}
//设置结束标记
socket.shutdownOutput();
//5.关闭流对象和socket,必须关闭
inputStream.close();
outputStream.close();
socket.close();
System.out.println("客户端退出...");
}
}
注意
案例二需要注意一点的是我们在中途会遇到接收不到服务端传来的数据,这时候就需要有一个标志来标定这个语句是否传送完毕
案例三(字符流)
- 编写一个服务端,和一个客户端
- 服务端在9999端口监听
- 客户端连接到服务端,发送"hello,server",并接收服务端回发的"hello,client'",再退出
- 服务端接收到客户端发送的信息,输出,并发送"hello,client",再退出
代码实现
客户端
package com.gbx.socket;
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
/**
* @author LeeZhi
* @version 1.0
* 客户端,发送 'hello ,server' 使用字符流
*/
public class SocketTCP03Client {
public static void main(String[] args) throws IOException {
//1.连接服端(ip,端口)
//解读:连接本机的9999端口
Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
System.out.println("socket返回="+socket.getClass());
//2.连接上后,生成Socket,通过socket.getOutputStream()
//得到和socket对象关联的输出流对象
OutputStream outputStream = socket.getOutputStream();
//3。通过输出流,写入数据到数据通道,使用字符流
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
bufferedWriter.write("hello ,server 字符流");
bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束 注意,要求对方使用readLine()
bufferedWriter.flush();//如果使用的字符流,需要手动刷新,否则数据不会写入数据通道
//4.获取和socket关联的输入流,读取数据(字节),并显示
InputStream inputStream = socket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
System.out.println(s);
//设置结束标记
socket.shutdownOutput();
//5.关闭流对象和socket,必须关闭
bufferedReader.close();//关闭外层流
bufferedWriter.close();
socket.close();
System.out.println("客户端退出...");
}
}
服务端
package com.gbx.socket;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.Buffer;
/**
* @author LeeZhi
* @version 1.0
* 服务端 ,使用字符流方式读写
*/
public class SocketTCP03Server {
public static void main(String[] args) throws IOException {
//思路
//1.在本机的9999端口监听,等待连接
// 细节:要求在本机没有其它服务在监听9999
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务端,在9999端口监听,等待连接...");
//2.当没有客户端连接9999端口时,程序会阻塞,等待连接
//如果有客户端连接,则会返回Socket对象,程序继续
Socket socket = serverSocket.accept();
System.out.println("socket = " + serverSocket.getClass());
//3.通过socket.getInputStream() 读取客户端写入到数据通道的数据,显示
InputStream inputStream = socket.getInputStream();
//4.IO读取m,使用字符流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
System.out.println(s);
//获取socket相关联的输出流
OutputStream outputstream = socket.getOutputStream();
//使用字符输出流的方式回复信息
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputstream));
bufferedWriter.write("hello client 字符流");
bufferedWriter.newLine();//插入一个换行符,表示回复内容的结束
bufferedWriter.flush();//注意需要手动的flush
//5.关闭流和socket
bufferedReader.close();
bufferedWriter.close();
socket.close();
serverSocket.close();
}
}
转载自:https://juejin.cn/post/7249148919506108475