EchoDemo's Blogs

Java中基于TCP协议的Socket编程

1、Socket概述

(1)所谓socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。它是连接运行在网络上的两个程序间的双向通讯的端点。

(2)网络通讯其实指的就是socket间的通讯。通讯的两端都有socket,数据在两个socket之间通过IO来进行传输。

(3)使用socket进行网络通信的过程

1)服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户的连接请求。

2)客户程序根据服务器程序所在的主机名和端口号发出连接请求。

3)如果一切正常,服务器接受连接请求。并获得一个新的绑定到不同端口地址的套接字。

4)客户和服务器通过读、写套接字进行通讯。

2、基于TCP协议的socket编程

(1)创建TCP服务端步骤:

1)创建一个ServerSocket对象

2)调用accept()方法接受客户端请求

3)从socket中获取IO流

4)对IO流进行读写操作,完成与客户端的交互。

5)关闭IO流和Socket

(2)创建TCP客户端步骤:

1)创建一个Socket对象

2)从Socket中获取IO流

3)对IO流进行读写操作,完成与服务端的交互

4)关闭IO流和Socket

注:客户端和服务端进行数据传输时,客户端的输入流对应服务端的输出流,客户端的输出流对应服务端的输入流。

(3)举例说明

1)服务器端

package com.iotek.tcpsocket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);//创建一个ServerSocket对象
        Socket socket = serverSocket.accept();//调用accept()方法来接受客户端的请求
        System.out.println(socket.getInetAddress().getHostAddress() + "has connected!");
        //获取socket对象的输入输出流
        BufferedReader bReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        PrintWriter pWriter = new PrintWriter(socket.getOutputStream(),true);
        String line = null;
        while((line = bReader.readLine())!=null){//读取客户端传过来的数据
            if(line.equals("over")){
                break;
            }
            System.out.println(line);
            /*bWriter.write(line.toUpperCase());//把转换成大写的字符串传给客户端
            bWriter.newLine();//换行,这样客户端才能知道输入什么时候结束的
            bWriter.flush();*/
            pWriter.println(line.toUpperCase());
        }
        //bWriter.close();
        pWriter.close();
        bReader.close();
        socket.close();
        System.out.println(socket.getInetAddress().getHostAddress() + "has disconnected!");
    }
}

2)客户端

package com.iotek.tcpsocket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class TCPClient {

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",8888);
        BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
        //BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        PrintWriter pWriter = new PrintWriter(socket.getOutputStream(),true);
        BufferedReader bw = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        while(true){
            String line = bReader.readLine();//获取键盘所输入的字符串
            /*bWriter.write(line);
            bWriter.newLine();//换行,这样服务端才能识别一行的结束
            bWriter.flush();*/
            pWriter.println(line);
            if(line.equals("over")){
                break;
            }
            System.out.println(bw.readLine());//获取服务端传来的大写字符串
        }
        bReader.close();
        bw.close();
        //bWriter.close();
        pWriter.close();
        socket.close();
    }
}

为了更直观地理解服务器端和客户端的交互过程,我们将两个文件拷贝到f盘当中。使用下列命令进行编译和执行。

//编译
javac -d . *.java

//开启服务器
java com.iotek.tcpsocket.TCPServer

//开启客户端,这里另外开启一个窗口
java com.iotek.tcpsocket.TCPClient
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------