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

Posted csj2018

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了廖雪峰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()用于强制输出缓冲期

以上是关于廖雪峰Java13网络编程-1Socket编程-2TCP编程的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

廖雪峰Java11多线程编程-2线程同步-2synchronized方法

廖雪峰Java2面向对象编程-4抽象类和接口-2接口

python函数式编程-------python2.7教程学习廖雪峰版