1.基本介绍Scoket6671.1
1.套接字(Socket)网络应用程序的开发被广泛使用,从而成为事实上的标准。
2.通信的两端都应该有socket,这是两台机器之间通信的终点
3.网络通信实际上是Socket之间的通信。
4.Socket允许程序将网络连接视为一个流,数据在两个Socket之间通过I0传输。
5.一般来说,主动发起通信的应用程序属于客户端,等待通信请求为服务端
1.2理解示意图: 2.TCP网络通信编程2.1基本介绍6671.基于客户端一服务端的网络通信
2.TCP/IP协议用于底层
3.应用场景例:客户端发送数据,服务端接受并显示控制台
4.基于Socket的TCP编程
2.2应用案例1(使用字节流)6681.编写服务器端和客户端
2.服务器端在999端口监控
3.客户端连接到服务器端,发送“hello,server然后退出
4.服务器端接收客户端发送的信息,输出并退出
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",再退出
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(); }}