廖雪峰Java13网络编程-1Socket编程-2TCP编程

在开发网络应用程序的时候,会遇到Socket这个概念。
Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据传输到网络。
Socket/TCP/部分IP都是由操作系统提供的。不同的编程语言只是提供了对操作系统调用的加单的封装,例如Java提供的几个Socket相关的类就封装了操作系统提供的接口。
为什么需要Socket?
因为仅仅通过IP地址进行通信还不够,同一台计算机同一时间会运行多个网络程序。当计算机收到一个数据包的时候,只有IP地址是没法判断应该发送给哪个应用程序的,所以操作系统抽象出Socket接口。每个应用程序需要对应不同的Socket,可以把Socket简单理解为IP地址+端口号。
端口号是操作系统分配的,是在0-65535之间的数字
<1024是特权端口,需要管理员权限

1024的端口可以有任意应用程序打开
Socket编程模型需要实现服务器端与客户端,因为2个应用程序通信的时候不仅需要对方的IP,还需要知道对方的端口号,所以服务器端必须先固定一个端口号,例如80,客户端在发起请求的时候,会直接请求80端口,同时告知自己的端口,这样双方就可以通过Socket进行通信了。
客户端的编程:

服务器端:

TCPClient.java

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class TCPClient {
    public static void main(String[] args) throws IOException{
        InetAddress addr = InetAddress.getLoopbackAddress();
        try(Socket sock = new Socket(addr,9090)){
            try(BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream(),StandardCharsets.UTF_8))){
                try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),StandardCharsets.UTF_8))){
                    writer.write("time\n");
                    writer.flush();
                    String resp = reader.readLine();
                    System.out.println("Response:"+resp);
                }
            }
        }
    }
}

TCPServer.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.time.LocalTime;

public class TCPServer {
    public static void main(String[] args) throws Exception{
        ServerSocket ss = new ServerSocket(9090);
        System.out.println("TCP Server ready:");
        Socket sock = ss.accept();
        try(BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream(),StandardCharsets.UTF_8))){
            try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),StandardCharsets.UTF_8))){
                String cmd = reader.readLine();
                if("time".equals(cmd)){
                    writer.write(LocalTime.now()+"\n");
                    writer.flush();
                }
            }
        }
        sock.close();
        ss.close();
    }
}

先运行服务器端,再运行客户端

总结:

TCP编程模型:

  • 客户端使用Socket(InetAddress,port)打开Socket
  • 服务器用ServerSocket监听端口
  • 服务器用accept接收连接并返回Socket
  • 双方通过Socket打开InputStream/OutputStream读写数据
  • flush()用于强制输出缓冲期

原文地址:https://www.cnblogs.com/csj2018/p/11143363.html

时间: 2024-10-09 09:20:38

廖雪峰Java13网络编程-1Socket编程-2TCP编程的相关文章

廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程

TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通常使用一个无限for循环,在这个for循环内部,每次调用accept方法,返回一个与远程客户新建的Socket连接,紧接着启动一个新的线程,来处理这个连接. ServerSocket ss = new ServerSocket(port); for( ; ; ){ Socket sock = ss.

廖雪峰Java13网络编程-1Socket编程-1网络编程概念

1.什么是计算机网络? 两台或更多计算机组成的网络 同一网络内的任意2台计算机都可以直接通信 所有计算机必须遵循同一种网络协议 什么是互联网 互联网是网络的网络 互联网采用TCP/IP协议 * TCP/IP协议泛指互联网协议 * 其中最重要的2个协议是TCP协议和IP协议 IP地址用于唯一标识一个网络接口(Network Interface) IPv4采用32位地址,类似101.202.99.12 IPv6采用128位地址,类似2001:0DA8:100A:0000:0000:1020:F2F3

廖雪峰Java13网络编程-1Socket编程-5UDP编程

传统邮件发送: 传统的邮件是通过邮局投递,从一个邮局到另一个邮局,最终到达用户的邮箱. 电子邮件发送: 与传统邮件类似,它是从用户电脑的邮件软件(如outlook)发送到邮件服务器上,然后经过若干个邮件服务器的中转,到达对方邮件服务器上,收件方就可以用软件或浏览器来接收邮件. MUA(邮件软件,Mail User Agent)-->MTA(邮件服务器,Mail Transfer Agent)-->MTA-->MDA(邮件投递代理,Mail Delivery Agent)<--MUA

廖雪峰Java13网络编程-3其他-1HTTP编程

HTTP协议: Hyper Text Transfer Protocol:超文本传输协议 基于TCP协议之上的请求/响应协议 目前使用最广泛的高级协议 使用浏览器浏览网页和服务器交互使用的就是HTTP协议 手机应用上绝大多数程序与服务器之间交互数据使用的也是HTTP协议. HTTP是一个请求/响应协议.浏览器发送一个请求,服务器收到以后,然后发送响应. HTTP 1.0特点: 每次请求都会创建一个新的HTTP连接,浏览器在请求一个网页之后,往往还是多次请求图片.CSS.JS等其他资源,而创建 原

廖雪峰Java1-3流程控制-3条件判断

1.if条件判断的格式 if (条件) { 代码块 } if (条件) { 代码块1 } else { 代码块2 } if (条件1) { 代码块1 } else if { 代码块2 } else { 代码块3 } 2.整型判断 条件判断注意的事项: 注意判断顺序 注意边界条件 int n = 100; if (n >= 90){ System.out.println("优秀"); }else if(n >= 60){ System.out.println("及格

廖雪峰Java1-3流程控制-6 do-while循环

do-while循环 do-while先执行循环,再判断条件. 条件满足时继续循环:条件不满足时退出:至少循环1次 int sum =0; int n = 1; do{ sum = sum + n; n++; }while (n<10); System.out.println(n); System.out.println(sum); 原文地址:https://www.cnblogs.com/csj2018/p/10252721.html

廖雪峰Java1-3流程控制-5循环

while循环 while循环首先判断条件: 条件满足时循环:条件不满足时退出循环 如果一开始条件就不满足,一次都不循环.如while false int sum = 0; int n = 1; while (n < 10){ sum = sum + n; n++; } System.out.println(n); System.out.println(sum); 避免死循环 当循环条件永远循环时,进入死循环.死循环导致CPU 100%占用,要避免死循环 int sum = 0; int n =

【廖雪峰老师python教程】——IO编程

同步IO 异步IO 最常见的IO--读写文件 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件). open() read() close() try: f = open('/path/to/file', 'r') print(f.read()) finally

廖雪峰Java6 IO编程-2input和output-4Filter模式

1.JDK提供的InputStream分为两类: 直接提供数据的InputStream * FileInputStream:从文件读取 * ServletInputStream:从HTTP请求读取数据 * Socket.getInputStream():从TCP连接读取数据 提供额外附加功能的FilterInputStream * 如果要给FileInputStream添加缓冲功能: BufferedFileInputStream extends FileInputStream * 如果要给Fi