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号