Java网络编程--C/S架构
发布时间
阅读量:
阅读量
1 概述
TCP通信能够支持两个计算机系统之间的数据传输,在其两端需严格区分客户端(Client)与服务端(Server)。
两端通信时步骤:
- 该服务端程序应在启动前完成配置以等待客户端的连接需求。
- 该客户端将发起主动连接请求至服务器端仅当建立通信后方能继续后续操作;而服务器不应发起主动连接请求给客户端。
在Java中,提供了两个类用于实现TCP通信程序:
- 客户端采用java.net.Socket类来建立通信。生成一个Socket实例后会发送一个连接请求给服务器端,在服务器接受并响应该请求后双方成功建立通信后即可展开数据传输。
- 服务端通过java.net.ServerSocket类实现功能。生成Server Socket实例的同时启动一个服务器并等待客户端发起连接操作完成之后就可以开始接收并处理来自客户端的数据流。
2.2 Socket类
Socket 类:该类负责建立客户端套接字,并表示两台设备间通信连接的标识符。
构造方法
- public Socket(String host, int port) :生成并连接到目标主机和端口的套接字实例。当host参数为null时,默认使用本地回送地址。
构造举例,代码如下:
Socket client = new Socket("127.0.0.1", 6666);
成员方法
-
public InputStream getInputStream():这是一个返回此套接字输入流的方法。
-
当此Scoket拥有相关联的通道时,则生成的InputStream的所有操作都将与该通道相关联。
-
关闭生成的InputStream也会导致相关的Socket被关闭。
-
public OutputStream getOutputStream() : 提供此连接的输出流。
- 如果此SOCKET具有相关联的通道,则生成的所有操作也会关联该通道。
- 确保关闭生成的操作也会终止相关的SOCKET。
-
定义close方法用于关闭该套接字。
-
当一个socket被关闭后,则无法再次使用。
-
此socket的关闭也会同步终止其关联的InputStream及OutputStream对象。
阻止此套接字的输出操作
注
构造方法
当使用该构造方法创建ServerSocket对象时,
就可以将其绑定到指定的一个端口号上,
其中参数port即为指定的端口号。
构造举例,代码如下:
ServerSocket server = new ServerSocket(6666);
成员方法
- public Socket accept() :监听并接受客户端的连接请求,并创建并返回一个新Socket对象用于与客户端进行通信。该方法会一直阻塞直至成功建立连接。
2.4 简明的TCP网络程序
TCP通信分析图解
服务端

自此,服务端向客户端回写数据。
服务端
服务端
客户端
客户端
服务端
服务端
一,客户端向服务器发送数据
服务端实现:
public class ServerTCP {
public static void main(String[] args) throws IOException {
System.out.println("服务端启动 , 等待连接 .... ");
// 1.创建 ServerSocket对象,绑定端口,开始等待连接
ServerSocket ss = new ServerSocket(6666);
// 2.接收连接 accept 方法, 返回 socket 对象.
Socket server = ss.accept();
// 3.通过socket 获取输入流
InputStream is = server.getInputStream();
// 4.一次性读取数据
// 4.1 创建字节数组
byte[] b = new byte[1024];
// 4.2 据读取到字节数组中.
int len = is.read(b);
// 4.3 解析数组,打印字符串信息
String msg = new String(b, 0, len);
System.out.println(msg);
//5.关闭资源.
is.close();
server.close();
}
}
客户端实现:
public class ClientTCP {
public static void main(String[] args) throws Exception {
System.out.println("客户端 发送数据");
// 1.创建 Socket ( ip , port ) , 确定连接到哪里.
Socket client = new Socket("localhost", 6666);
// 2.获取流对象 . 输出流
OutputStream os = client.getOutputStream();
// 3.写出数据.
os.write("你好么? tcp ,我来了".getBytes());
// 4. 关闭资源 .
os.close();
client.close();
}
}
二,服务器向客户端回写数据
服务端实现:
public class ServerTCP {
public static void main(String[] args) throws IOException {
System.out.println("服务端启动 , 等待连接 .... ");
// 1.创建 ServerSocket对象,绑定端口,开始等待连接
ServerSocket ss = new ServerSocket(6666);
// 2.接收连接 accept 方法, 返回 socket 对象.
Socket server = ss.accept();
// 3.通过socket 获取输入流
InputStream is = server.getInputStream();
// 4.一次性读取数据
// 4.1 创建字节数组
byte[] b = new byte[1024];
// 4.2 据读取到字节数组中.
int len = is.read(b);
// 4.3 解析数组,打印字符串信息
String msg = new String(b, 0, len);
System.out.println(msg);
// =================回写数据=======================
// 5. 通过 socket 获取输出流
OutputStream out = server.getOutputStream();
// 6. 回写数据
out.write("我很好,谢谢你".getBytes());
// 7.关闭资源.
out.close();
is.close();
server.close();
}
}
客户端实现:
public class ClientTCP {
public static void main(String[] args) throws Exception {
System.out.println("客户端 发送数据");
// 1.创建 Socket ( ip , port ) , 确定连接到哪里.
Socket client = new Socket("localhost", 6666);
// 2.通过Scoket,获取输出流对象
OutputStream os = client.getOutputStream();
// 3.写出数据.
os.write("你好么? tcp ,我来了".getBytes());
// ==============解析回写=========================
// 4. 通过Scoket,获取 输入流对象
InputStream in = client.getInputStream();
// 5. 读取数据数据
byte[] b = new byte[100];
int len = in.read(b);
System.out.println(new String(b, 0, len));
// 6. 关闭资源 .
in.close();
os.close();
client.close();
}
}
全部评论 (0)
还没有任何评论哟~
