首页 > 图灵资讯 > 技术篇>正文

Java-Socket(案例)

2023-04-21 10:04:00

InetAdress类型

  • 本机InetAdress对象getlocalhost获取
  • ip地址对象getByname根据指定的主机名/域名获得
  • 获取Inetadress对象的主机名gethostname
  • 获取Inetadress对象的地址gethostadress
实现API代码
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传输。
  • 一般来说,主动发起通信的应用程序属于客户端,等待通信请求为服务端
理解

Java-Socket(案例)_客户端

通过流来操作

可靠的TCP编程

UDP编程不可靠

TCP网络通信编程基本介绍
  • 基于客户端一服务端的网络通信
  • TCP/IP协议用于底层
  • 例如:客户端发送数据,服务端接受并显示控制台
  • TCP编程基于Socket
TCP编程案例1(字节流)

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(客户端退出...");    }}
案例二(字节流)
  1. 编写服务端和客户端
  2. 9999端口监控服务器端口
  3. 客户端连接到服务端,发送“hello,server并接收服务器端回发的“hello,client再退出
  4. 服务器端接收客户端发送的信息,输出并发送“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需要注意的是,我们会遇到中途无法收到服务端传输的数据。此时,我们需要有一个标志来确定这个句子是否已经传输

案例三(字符流)
  1. 编写服务端和客户端
  2. 服务端在999端口监控
  3. 客户端连接到服务端,发送“hello,server并接收服务端回发的“hello,client再退出
  4. 服务端接收客户端发送的信息,输出并发送“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();    }}
上一篇 hive log的分类和所在位置
下一篇 #yyds干货盘点# LeetCode面试题:删除排序链表中的重复元素 II

文章素材均来源于网络,如有侵权,请联系管理员删除。