网站哪个公司做的比较好,wordpress跨域登录,网站建设 图片上传,纺织网站建设方案前言#xff1a; 在网络编程-002节中已经介绍了有关传输层TCP协议的基本知识#xff0c;本节不再介绍有关TCP协议的基础内容#xff0c;主要讲TCP协议的重点API及其使用方法#xff0c;通过案例的形式完善。 序列#xff1a;网络编程 - 004 1.TCP协议API
1.1TCP编程原理…
前言 在网络编程-002节中已经介绍了有关传输层TCP协议的基本知识本节不再介绍有关TCP协议的基础内容主要讲TCP协议的重点API及其使用方法通过案例的形式完善。 序列网络编程 - 004 1.TCP协议API
1.1TCP编程原理
对于TCP协议来说具有有连接、可靠传输、面向字节流的特征。TCP的socket api和 UDP的socket api差异很大~~但是和前面讲的文件操作有密切联系。
ServerSocket给服务器使用的类使用这个类来绑定端口号Socket既会给服务器用,又会给客户端用。
TCP协议是字节流的传输的基本单位是byte。
1.2ServerSocket类
Serversocket类是创建TCP服务端Socket的标椎API。
1ServerSocket构造方法
构造方法如下
构造方法方法说明ServerSocket(int port)创建一个服务端流套接字Socket并绑定到指定端口
2ServerSocket普通方法
普通方法如下
方法方法说明Socket accept()开始监听指定端口(创建时绑定的端口)有客户端连接后返回一个服务端Socket对象并基于该Socket建立与客户端的连接否则阻塞等待void close()关闭此套接字
1.3Socket类 Socket是客户端Socket或服务端中接收到客户端建立连接(accept方法)的请求后返回的服务端Socket。
不管是客户端还是服务端Socket都是双方建立连接以后保存的对端信息及用来与对方收发数据的。
1Socket构造方法
构造方法如下
构造方法方法说明Socket(String host , int port)创建一个客户端流套接字Socket并与对应IP的主机上对应端口的进程建立连接
2Socket普通方法
普通方法如下
方法方法说明InetAddress getinetAddress()返回套接字所连接的地址InputStream getinputStream()返回此套接字的输入流OutputStream getOutputStream()返回此套接字的输出流
2.代码案例
2.1服务器端
代码如下
public class TcpEchoServer {//服务器private ServerSocket serverSocket null;public TcpEchoServer(int port) throws IOException {serverSocket new ServerSocket(port);}public void start() throws IOException {System.out.println(服务器启动!);ExecutorService service Executors.newCachedThreadPool();while (true) {// 通过 accept 方法, 把内核中已经建立好的连接拿到应用程序中.// 建立连接的细节流程都是内核自动完成的. 应用程序只需要 捡现成 的.Socket clientSocket serverSocket.accept();// 此处不应该直接调用 processConnection, 会导致服务器不能处理多个客户端.// 创建新的线程来调用更合理的做法.// 这种做法可行, 不够好
// Thread t new Thread(() - {
// processConnection(clientSocket);
// });
// t.start();// 更好一点的办法, 是使用线程池.service.submit(new Runnable() {Overridepublic void run() {processConnection(clientSocket);}});}}// 通过这个方法, 来处理当前的连接.public void processConnection(Socket clientSocket) {// 进入方法, 先打印一个日志, 表示当前有客户端连上了.System.out.printf([%s:%d] 客户端上线!\n, clientSocket.getInetAddress(), clientSocket.getPort());// 接下来进行数据的交互.try (InputStream inputStream clientSocket.getInputStream();OutputStream outputStream clientSocket.getOutputStream()) {// 使用 try ( ) 方式, 避免后续用完了流对象, 忘记关闭.// 由于客户端发来的数据, 可能是 多条数据, 针对多条数据, 就循环的处理.while (true) {Scanner scanner new Scanner(inputStream);if (!scanner.hasNext()) {// 连接断开了. 此时循环就应该结束System.out.printf([%s:%d] 客户端下线!\n, clientSocket.getInetAddress(), clientSocket.getPort());break;}// 1. 读取请求并解析. 此处就以 next 来作为读取请求的方式. next 的规则是, 读到 空白符 就返回.String request scanner.next();// 2. 根据请求, 计算响应.String response process(request);// 3. 把响应写回到客户端.// 可以把 String 转成字节数组, 写入到 OutputStream// 也可以使用 PrintWriter 把 OutputStream 包裹一下, 来写入字符串.PrintWriter printWriter new PrintWriter(outputStream);// 此处的 println 不是打印到控制台了, 而是写入到 outputStream 对应的流对象中, 也就是写入到 clientSocket 里面.// 自然这个数据也就通过网络发送出去了. (发给当前这个连接的另外一端)// 此处使用 println 带有 \n 也是为了后续 客户端这边 可以使用 scanner.next 来读取数据.printWriter.println(response);// 此处还要记得有个操作, 刷新缓冲区. 如果没有刷新操作, 可能数据仍然是在内存中, 没有被写入网卡.printWriter.flush();// 4. 打印一下这次请求交互过程的内容System.out.printf([%s:%d] req%s, resp%s\n, clientSocket.getInetAddress(), clientSocket.getPort(),request, response);}} catch (IOException e) {e.printStackTrace();} finally {try {// 在这个地方, 进行 clientSocket 的关闭.// processConnection 就是在处理一个连接. 这个方法执行完毕, 这个连接也就处理完了.clientSocket.close();} catch (IOException e) {e.printStackTrace();}}}public String process(String request) {// 此处也是写的回显服务器. 响应和请求是一样的.return request;}public static void main(String[] args) throws IOException {TcpEchoServer server new TcpEchoServer(9090);server.start();}
}2.2客户端
代码如下
public class TcpEchoClient {private Socket socket null;public TcpEchoClient(String serverIp, int serverPort) throws IOException {// 需要在创建 Socket 的同时, 和服务器 建立连接, 此时就得告诉 Socket 服务器在哪里~~// 具体建立连接的细节, 不需要咱们代码手动干预. 是内核自动负责的.// 当我们 new 这个对象的时候, 操作系统内核, 就开始进行 三次握手 具体细节, 完成建立连接的过程了.socket new Socket(serverIp, serverPort);}public void start() {// tcp 的客户端行为和 udp 的客户端差不多.// 都是:// 3. 从服务器读取响应.// 4. 把响应显示到界面上.Scanner scanner new Scanner(System.in);try (InputStream inputStream socket.getInputStream();OutputStream outputStream socket.getOutputStream()) {PrintWriter writer new PrintWriter(outputStream);Scanner scannerNetwork new Scanner(inputStream);while (true) {// 1. 从控制台读取用户输入的内容System.out.print(- );String request scanner.next();// 2. 把字符串作为请求, 发送给服务器// 这里使用 println, 是为了让请求后面带上换行.// 也就是和服务器读取请求, scanner.next 呼应writer.println(request);writer.flush();// 3. 读取服务器返回的响应.String response scannerNetwork.next();// 4. 在界面上显示内容了.System.out.println(response);}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {TcpEchoClient client new TcpEchoClient(127.0.0.1, 9090);client.start();}
} 以上便是对传输层的TCP协议API介绍并举例说明了TCP协议的具体用法。