首页 > 图灵资讯 > 技术篇>正文
Java-Socket(案例)
2023-04-21 10:04:00
InetAdress类型
- 本机InetAdress对象getlocalhost获取
- ip地址对象getByname根据指定的主机名/域名获得
- 获取Inetadress对象的主机名gethostname
- 获取Inetadress对象的地址gethostadress
public class API_ { public static void main(String[] args) throws UnknownHostException { //1.获取本机InetAdress对象 InetAddress localHost = InetAddress.getLocalHost(); System.out.println(localHost);//DESKTOP-7QOGCPR/192.168.137. /2.根据指定的主机名获得InetAdress对象 InetAddress host1 = InetAddress.getByName("DESKTOP-7QOGCPR); System.out.println(host1 = " + host1); //3.根据域名返回InetAdress对象,比如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. = DESKTOP-7QOGCPR/192.168.137. = www.baidu.com/39.156.6.18host2 对应的ip = 39.156.6.18host2 对应的主机名/域名 = www.baidu.com
基本介绍Socket套接字
- 套接字(Socket)网络应用程序的开发被广泛使用,从而成为事实上的标准。
- Socket应该在通信的两端,这是两台机器之间通信的终点
- 网络通信实际上是Socket之间的通信。
- Socket允许程序将网络连接视为一个流,数据在两个Socketl之间通过IO传输。
- 一般来说,主动发起通信的应用程序属于客户端,等待通信请求为服务端
通过流来操作
可靠的TCP编程
UDP编程不可靠
TCP网络通信编程基本介绍- 基于客户端一服务端的网络通信
- TCP/IP协议用于底层
- 例如:客户端发送数据,服务端接受并显示控制台
- TCP编程基于Socket
1.编写服务器端和客户端2。服务器端在999端口监控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.监控本机999端口,等待连接 // 细节:要求本机无其他服务监控9999 ServerSocket serverSocket = new ServerSocket(9999); System.out.println(服务端,在999端口监听,等待连接..."); //2.当999端口没有客户端连接时,程序会被阻塞,等待连接 //如果有客户端连接,将返回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.关闭流和socketet 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 SocketCP01clientttent { 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.监控本机999端口,等待连接 // 细节:要求本机无其他服务监控9999 ServerSocket serverSocket = new ServerSocket(9999); System.out.println(服务端,在999端口监听,等待连接..."); //2.当999端口没有客户端连接时,程序会被阻塞,等待连接 //如果有客户端连接,将返回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.关闭流和socketet 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(客户端退出..."); }}
注意
案例2需要注意的是,我们会遇到中途无法收到服务端传输的数据。此时,我们需要有一个标志来确定这个句子是否已经传输
案例三(字符流)- 编写服务端和客户端
- 服务端在999端口监控
- 客户端连接到服务端,发送“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.监控本机999端口,等待连接 // 细节:要求本机无其他服务监控9999 ServerSocket serverSocket = new ServerSocket(9999); System.out.println(服务端,在999端口监听,等待连接..."); //2.当999端口没有客户端连接时,程序会被阻塞,等待连接 //如果有客户端连接,将返回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.关闭流和socketet bufferedReader.close(); bufferedWriter.close(); socket.close(); serverSocket.close(); }}