网络编程大致过程
- 首先多个客户端(Socket)会连接到一个服务器上(ServerSocket)
- 在这个过程中会创建各自的连接对象,他们是通过IO流来进行数据交换
- 多个客户端会同时和服务器端进行交互,所以服务器必须明确和哪个客户端建立器连接。解决方案:在服务器端有一个方法Server.accept(),通过这个方法可以获取请求的客户端的对象
- 多个客户同时和服务器进行数据交互的时候,就会需要使用多个IO流对象。解决方案:服务器本身是没有IO流对象的,服务器可以通过获取到的上述请求的客户端的对象Socket使用各自客户端socket中提供的IO流和客户端进行交流(这样就可以兼容各种客户端了吧)
编程实现
1. 客户端
主要的包java.net.Socket
package TcpPro;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
//1.创建一个客户端对象Socket,构造方法绑定服务器的ip地址和端口号(绑定的是服务器端的入口)
Socket socket = new Socket("127.0.0.1",8088);
//2.使用socket对象方法getOutputStream()获取网络字节输出流OutPutStream对象
OutputStream outputStream = socket.getOutputStream();
//3.使用网络字节输出流OutPutStream对象中的方法write,给服务器发送数据
outputStream.write("你好服务器".getBytes());
//没有服务器来接收响应会报错(因为tcp协议讲求的就是需要响应来建立连接)
//4.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream
InputStream is = socket.getInputStream();
//4.使用网络字节输入流InputStream对象中的方法read,读取客户端发送的数据//5.使用网络字节输入流InputStream对象中的方法read,读取服务器写的数据
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes,0,len));
//6.释放资源
socket.close();
}
}
2.服务器端
服务器启动之后会去等待客户端的连接
package TcpPro;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
//1.创建一个客户端对象Socket,构造方法绑定服务器的ip地址和端口号(绑定的是服务器端的入口)
Socket socket = new Socket("127.0.0.1",8088);
//2.使用socket对象方法getOutputStream()获取网络字节输出流OutPutStream对象
OutputStream outputStream = socket.getOutputStream();
//3.使用网络字节输出流OutPutStream对象中的方法write,给服务器发送数据
outputStream.write("你好服务器".getBytes());
//没有服务器来接收响应会报错(因为tcp协议讲求的就是需要响应来建立连接)
//4.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream
InputStream is = socket.getInputStream();
//4.使用网络字节输入流InputStream对象中的方法read,读取客户端发送的数据//5.使用网络字节输入流InputStream对象中的方法read,读取服务器写的数据
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes,0,len));
//6.释放资源
socket.close();
}
}