当前位置: 首页 > 图灵资讯 > 技术篇> Socket

Socket

来源:图灵教育
时间:2023-05-23 09:34:26

1.基本介绍Scoket6671.1

1.套接字(Socket)网络应用程序的开发被广泛使用,从而成为事实上的标准。

2.通信的两端都应该有socket,这是两台机器之间通信的终点

3.网络通信实际上是Socket之间的通信。

4.Socket允许程序将网络连接视为一个流,数据在两个Socket之间通过I0传输。

5.一般来说,主动发起通信的应用程序属于客户端,等待通信请求为服务端

1.2理解示意图:

Socket_客户端

2.TCP网络通信编程2.1基本介绍667

1.基于客户端一服务端的网络通信

2.TCP/IP协议用于底层

3.应用场景例:客户端发送数据,服务端接受并显示控制台

4.基于Socket的TCP编程

Socket_服务端_02

2.2应用案例1(使用字节流)668

1.编写服务器端和客户端

2.服务器端在999端口监控

3.客户端连接到服务器端,发送“hello,server然后退出

4.服务器端接收客户端发送的信息,输出并退出

Socket_java_03

com中的代码.stulzl.socket_.包中SocketTCP01Serverersereret服务器
package com.stulzl.socket_;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;//1.编写服务器端,在9999端口与客户端//2.服务器端监控//3.客户端连接到服务器端,发送“hello, server然后退出//4.服务器端接收客户端发送的信息,输出,并退出///服务端   668public class SocketTCP01Server {    public static void main(String[] args) throws IOException {        //思路        //1. 在本机 9999端口监听, 等待连接        //   细节: 要求本机没有其他服务监控999,否则会失败报错        //   细节:这个 ServerSocket 可以通过 accept() 返回多个Socket[多个客户端连接服务器并发]        ServerSocket serverSocket = new ServerSocket(9999);        System.out.println(服务端,监控999端口,等待连接..");        //2. 当9999端口没有客户端连接时,程序将 阻塞, 等待连接        //   若有客户端连接,则返回Socket对象,程序继续        Socket socket = serverSocket.accept();        System.out.println("服务端 socket =" + socket.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        inputStream.close();        socket.close();        serverSocket.close();    }}
SocketTCP01Client客户端
package com.stulzl.socket_;import java.io.IOException;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;//客户端   668//发送 "hello, server" 服务器public给服务器 class Socketcp01Clcltcp0ient {    public static void main(String[] args) throws IOException {        //思路        //1. 连接服务端 (ip , 端口)        //解读: 连接本机(InetAddress.getLocalHost()获得本机地址) 9999端口,        // 若连接成功,返回Socket对象        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);        System.out.println(“客户端Socket返回=”+socket.getClass());        //2. 连接后,生成Socket, 通过socket.getOutputStream()        //   得到 和 与socket对象相关的输出流对象        OutputStream outputStream = socket.getOutputStream();        //3. 通过输出流,写入数据到 数据通道  //getBytes()将字符串转成字节数组        outputStream.write("hello,server".getBytes());        //4. 关闭流对象和socket, 必须关闭        outputStream.close();        socket.close();        System.out.println(客户端退出…;    }}
2.3应用案例2(使用字节流)669

1.编写服务端和客户端

2.服务器端在999端口监控

3.客户端连接到服务端,发送“hello,server“并接收服务器端回发”hello,client",再退出

4.服务器端接收客户端发送的信息,输出并发送“hello,client",再退出

Socket_客户端_04

com中的代码.stulzl.socket_02.包中SocketTCP02Server
package com.stulzl.socket_02;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;//服务端   669//1.编写服务端,在9999端口与客户端//2.服务器端监控//3.客户端连接到服务端,发送“hello, server“并接收服务器端回发”hello,client退出//4.服务器端接收客户端发送的信息,输出并发送“hello, client", 退出public class SocketTCP02Server {    public static void main(String[] args) throws IOException {        ////找到9999端口        ServerSocket serverSocket = new ServerSocket(9999);        //等待连接        Socket socket = serverSocket.accept();        ///IO读取客户端发送的信息        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));////输出读取的信息        }        ///回发给客户端的信息hello,client"        OutputStream outputStream = socket.getOutputStream();        outputStream.write("hello,client".getBytes());///发送给客户端        //设置写入结束标记        socket.shutdownOutput();        System.out.println(服务端退出…;        //关闭        serverSocket.close();        socket.close();        inputStream.close();        outputStream.close();    }}
SocketTCP02Client客户端
package com.stulzl.socket_02;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;//客户端 发送"hello, server” 669public class SocketTCP02Client {    public static void main(String[] args) throws IOException {        ///连接9999端口        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);        OutputStream outputStream = socket.getOutputStream();        outputStream.write("hello,server".getBytes());///发送给服务端        //设置写入结束标记        socket.shutdownOutput();        ////接收服务端的返回信息        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));/////输出服务端发送的信息        }        System.out.println(关闭客户端…;        //关闭        socket.close();        outputStream.close();        inputStream.close();    }}
2.3应用案例3(使用字符流)670

1.编写服务端和客户端

2.服务端在999端口监控

3.客户端连接到服务端,发送“hello,server并接收服务端回发的“hello,client",再退出

4.服务端接收客户端发送的信息,输出并发送“hello,client",再退出

com中的代码.stulzl.socket_03.SocketTCP03Serverer
package com.stulzl.socket_03;import java.io.*;import java.net.ServerSocket;import java.net.Socket;//服务端  (使用字符流)  670//1.编写服务端,在9999端口与客户端//2.服务端监控//3.客户端连接到服务端,发送“hello, server并接收服务端回发的“hello,client退出//4.服务端接收客户端发送的信息,输出并发送“hello, client",再退出@SuppressWarnings("all")public class SocketTCP03Server {    public static void main(String[] args) throws IOException {        ////找到9999端口        ServerSocket serverSocket = new ServerSocket(9999);        //等待连接        Socket socket = serverSocket.accept();        ///IO读取客户端发送的信息        InputStream inputStream = socket.getInputStream();        ///用字符流读取  Inputstreamreader转换流将字节转换为字符        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));        String s = bufferedReader.readLine();        System.out.println(s);//输出        ///回发给客户端的信息hello,client"        OutputStream outputStream = socket.getOutputStream();        ////使用字符流恢复信息        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));        bufferedWriter.write("hello,client 字符流");        bufferedWriter.newLine();///插入一个换行符表示写入内容结束        bufferedWriter.flush();//刷新        System.out.println(服务端退出…;        //关闭        serverSocket.close();        socket.close();        bufferedReader.close();        bufferedWriter.close();    }}
SocketTCP02Client客户端
package com.stulzl.socket_03;import java.io.*;import java.net.InetAddress;import java.net.Socket;//客户端  670@SuppressWarnings("all")public class SocketTCP03Client {    public static void main(String[] args) throws IOException {        ///连接9999端口        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);        OutputStream outputStream = socket.getOutputStream();        //通过输出流,写入数据到 数据通道  使用字符流  OutputstreamWriter字节流转换为字符流        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));        bufferedWriter.write("hello,server 字符流");        bufferedWriter.newLine();///插入换行符表示写入内容结束,使用newline()也要求对方使用readline()阅读        bufferedWriter.flush();///使用字符流必须手动刷新,否则,数据将不会被写入数据通道        ////接收服务端的返回信息        InputStream inputStream = socket.getInputStream();        ///使用字符流读取数据        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));        String s = bufferedReader.readLine();        System.out.println(s);        System.out.println(关闭客户端…;        //关闭        socket.close();        bufferedReader.close();        bufferedWriter.close();    }}