java网络编程之TCP通信程序【二】
1.概述
TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。
两端通信时步骤:
- 服务端程序,需要事先启动,等待客户端的连接。
- 客户端主动连接服务器端,连接成功才能通信。服务端不可以主动连接客户端。
在Java中,提供了两个类用于实现TCP通信程序:
- 客户端:java.net.Socket类。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。
- 服务端:java.net.ServerSocket类。创建ServerSocket对象,相当于开启一个服务,并等待客户端的连接。
2.通信步骤

3.通信客户端
java.net.Socket 类:该类实现客户端套接字。套接字是两台机器间通信的端点。
套接字的实际工作由 SocketImpl 类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
构造方法:
public Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口号。 
常用方法:
public InputStream getInputStream():返回此套接字的输入流。 
public OutputStream getOutputStream():返回此套接字的输出流。
public void close():关闭此套接字(会同时关闭相关的InputStream和OutputStream)。 
通信步骤:
- 创建客户端对象Socket,绑定服务器的IP地址和端口号。
- 使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象。
- 通过网络字节输出流OutputStream对象中的write()向服务发送数据。
- 使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream 对象。
- 使用网络字节输入流InputStream 对象中的read(),读取服务器回写的数据。
- 释放资源。
4.通信服务器
java.net.ServerSocket 类:该类实现服务器套接字。
服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
服务器套接字的实际工作由 SocketImpl 类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。
构造方法:
public ServerSocket(int port) :创建绑定到特定端口的服务器套接字。 
常用方法:
 Socket accept() :侦听并接受到此套接字的连接。 
通信步骤:
- 创建服务器对象ServerSocket,绑定端口号。
- 使用ServerSocket对象中的方法accept(),获取请求的客户端对象Socket。
- 使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream 对象。
- 使用网络字节输入流InputStream 对象中的read(),读取客户端发送的数据。
- 使用Socket对象中的方法getOutputStream获取网络字节输出流OutputStream对象。
- 通过网络字节输出流OutputStream对象中的write()向客户端发送数据。
- 关闭资源(Socket 和 ServerSocket)。
5 简单演示
客户端示例代码:
package com.hanyxx.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
 * @author layman
 */
public class ClientDemo01 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",8888);
        OutputStream os = socket.getOutputStream();
        // 发送数据
        os.write("你好服务器!".getBytes());
        // 接受数据
        InputStream  is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println("客户端接受到的数据: "+new String(bytes,0,len));
        // 关闭资源
        socket.close();
        System.out.println("客户端关闭!");
    }
}
服务端示例代码:
package com.hanyxx.socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * @author layman
 */
public class ServerDemo02 {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        Socket socket = serverSocket.accept();
        // 读取数据
        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println("服务器端接受到的数据: "+ new String(bytes,0,len));
        // 回传数据
        OutputStream os = socket.getOutputStream();
        os.write("你好客户端".getBytes());
        // 关闭资源
        socket.close();
        serverSocket.close();
        System.out.println("服务器端关闭!");
    }
}
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号