TCP的原理分析与示例

原理分析与示例

1、TCP程序概述
TCP是一个可靠的协议,面向连接的协议。
实现TCP程序,需要编写服务器端和客户端,JavaAPI为我们提供了java.net包,为实现网络应用程序提供类。
ServerSocket:此类实现服务器端套接字
Socket:      此类实现客户端套接字
Socket是网络驱动层提供给应用程序编程的接口和一种机制。

2、TCP/IP协议
网络通讯协议
端口号:端口的范围:0~65535之间,0~1023之间的端口号被用于一些知名的网络服务和应用因此不能在使用。


3、实现服务器端与客户端程序
ServerSocket类,此类实现服务器端套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
ServerSocket(int port)       创建绑定到特定端口的服务器套接字
Socket(String Ip,int port)   创建连接到服务器特定端口的客户端套接字
setSoTimeout(int timeout)    通过制定超时值启用/禁用SO_TIMEOUT,以毫秒为单位
InetAddress getInetAddress() 返回此服务器套接字的本地地址,返回InetAddress类型
Socket accept()              侦听并接受到此套接字的连接,返回Socket类型

服务器端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServerDemo {
    public static void main(String[] args){
        //创建服务器端ServerSocket
        try {
            ServerSocket server = new ServerSocket(6666); //创建一个服务器端的ServerSocket(端口范围1024~65535)
            System.out.println("服务器已启动,等待客户端连接...");
            Socket socket =server.accept(); //等待客户端的连接,造成阻塞,如果有客户端连接成功,立即返回一个Socket对象
            System.out.println("客户端连接成功"+socket.getInetAddress().getHostAddress());
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String info = br.readLine();   //通过输入流读取网络数据,如果没有数据那么会阻塞在这
            System.out.println(info);

            //因为socket.getOutputStream()返回的是OutputStream所以不能用PrintStream
            //且这里要用到转换流OutputStreamWriter,即将字节输出流转换为字符输出流
            PrintWriter pw = new PrintWriter(
                    new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
            pw.println("echo"+info);      //通过输出流向客户端返回消息
            pw.flush();
            pw.close();
            br.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端

import java.io.*;
import java.net.Socket;

public class EchoClientDemo {
    public static void main(String[] args) {
        try {
            //创建客户端的Socket
            Socket socket = new Socket("localhost",6666); //创建一个客户端的Socket对象,指定要连接的服务器;会造成阻塞,直到连接成功服务器端,才会执行到下一句代码
            //因为socket.getOutputStream()返回的是OutputStream所以不能用PrintStream
            //且这里要用到转换流OutputStreamWriter,即将字节输出流转换为字符输出流
            PrintWriter pw = new PrintWriter(
                    new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
            pw.println("Hello,This is Bin"); //通过输出流向服务器端发送消息
            pw.flush();

            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String info = br.readLine();    //通过输入流读取服务器返回的消息
            System.out.println(info);

            pw.close();
            br.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

你可能感兴趣的:(TCP的原理分析与示例)